参考
iOS 9で追加されたNSLayoutAnchor使うと簡単にわかりやすく間違えずにNSLayoutConstraint(制約)が作れます【Auto Layout】
目的
HowTo目的なので、細かな仕様は参考記事を見てください。
参考記事の言語はswiftですが、Objective-Cでもほぼ同じです。
その内のほぼ同じ でない 部分をぱっとみてコーディングできるように備忘録です。
サンプル
Objective-C
// 今回生成し制約を設定したいview
// 制約でサイズを決めるのでCGRectZeroでOK
UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero];
// AutoResizingはNOにする
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
// viewにaddする
[self.view addSubview:label];
// 上
NSLayoutConstraint* topAnchor = [label.topAnchor constraintEqualToAnchor:self.view.topAnchor constant:0];
// 左
NSLayoutConstraint* leftAnchor = [label.leftAnchor constraintEqualToAnchor:self.view.leftAnchor constant:0];
// 右
NSLayoutConstraint* rightAnchor = [label.rightAnchor constraintEqualToAnchor:self.view.rightAnchor constant:0];
// 高さ
NSLayoutConstraint* heightAnchor = [label.heightAnchor constraintEqualToConstant:60];
[self.view addConstraint:topAnchor];
[self.view addConstraint:leftAnchor];
[self.view addConstraint:rightAnchor];
[self.view addConstraint:heightAnchor];
気をつけるところ
基本的な考え方
- 上
- 左
- 幅
- 右
- 高さ
- 下
の順で組み立てていくと理解しやすい。
translatesAutoresizingMaskIntoConstraintsはNOにする
これをしないと勝手にリサイズされて意図したものにならない。
制約をaddConstraintするタイミングと場所
-
addConstraint
するのは親ViewにaddSubViews
した後に行う -
addConstraint
するのは今回生成し制約を設定したいviewに行うのではなく、addSubViews
した親Viewに対して 行う
所感
SwiftだとisActive=trueだけで済んでいたのでaddConstraint
の曲がった感じが気持ち悪い。
まだ親viewに対してaddConstraint
するあたりも同様。
更に言うならleftAnchor→leadingAnchor、rightAnchor→trailingAnchorなどの命名も日本人には馴染みがなく手間がかかって面倒。