[iOS] Auto Layout について

2012/09/20

こんにちは。きんくまです。

Xcode4.5が出ました。
Auto Layoutを使えばiPhone5の画面サイズにも対応することが可能です。

Auto LayoutはInterface Builderを使ったり、コードを直接書いたりすることで適用することができます。

詳しくはAppleのドキュメント

>> About Cocoa Auto Layout

WWDCのビデオ,ドキュメントを見ればわかります。

WWDC 2012: Introduction to Auto Layout for iOS and OS X

、、見ればわかるはずなんですが、今日やってみたところ、ちょっとひっかかってしまいました。
IBは基本使ってないので、コードでやりました。

それでUIViewのsetTranslatesAutoresizingMaskIntoConstraintsをNOをすればうまくいったのですが、わかるまでハマりました、、。

取り急ぎ、わかったところまで断片書いておきます。
AutoLayoutができるかどうかのif文の条件はあやしいかも。

autolayout_test

ARC使用

- (void)loadView
{
    UIView *myview = [[UIView alloc] init];
    myview.backgroundColor = [UIColor greenColor];
    
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    
    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    
    [myview addSubview:redView];
    [myview addSubview:blueView];
    
//Auto layoutに対応する場合==iOS6以上
    if([myview respondsToSelector:@selector(addConstraints:)]){
        [myview setTranslatesAutoresizingMaskIntoConstraints:NO];
        [redView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [blueView setTranslatesAutoresizingMaskIntoConstraints:NO];

        NSMutableArray *tmpConstraints = [NSMutableArray array];
        [tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"|-50-[redView(==100)]-30-[blueView(==100)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView,blueView)]];
        [tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[redView(==30)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(redView)]];
        [tmpConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[blueView(==redView)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(blueView,redView)]];

        [myview addConstraints:tmpConstraints];
//iOS5以下
    }else{
        redView.frame = CGRectMake(50, 80, 100, 30);
        blueView.frame = CGRectMake(180, 80, 100, 30);
    }

    self.view = myview;
}

あとVisual Format Languageがうまく適用できない場合は、constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:も併用してちょーだいって書いてあった。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る