2014年5月1日木曜日

AutoLayoutをもっと使う気になってきた

iOSのAutoLayout。

Appleサマがおすすめしている感じが凄くするのでバリバリ使えるようになりたいと思いつつも、メリットがイマイチ分からずボチボチとしか使っていなかった。

ステータスバーからの相対位置の指定として、topLayoutGuideが使えるのは便利だなと思いつつも、その他はAutoResizingMaskでまかなえるじゃん? と思っていたから。

AutoLayoutは、Layout処理が終わる前に任意のviewをコードから追加は出来ないし、一度設定したConstraints をコードから値だけ変更しなおしとか出来いようだし、使うの難しいなーと思っていた。

んが、なんかやっとで使うメリットが分かった気がする。

AutoLayout では、サイズをコンテンツに合わせる 事ができる。

いや、できる というより、
AutoLayoutでは、デフォルトが「コンテンツに合わせる」になる。
width, heightのConstraintsを明示的に指定すれば「コンテンツに合わせない」に変えた事になる。

コンテンツに合わせて変える...とは、
LabelやButtonの文字が動的に変わる場合がある。つまり、サイズを変える必要がある。
横幅を広げたいときもあるし、1行から2行の高さになる時もある。
そんな時に、文字の内容によってviewの幅、高さを変える事。

AutoResizingMaskでは、コード上で sizeToFit() などでサイズを指定して、位置を再設定していた。

確かにこれは嫌だった。
Storyboard,XIBを使っているのであれば、レイアウトに関するものは全てStoryboardなどでまかないたい。コードに分散したくない。

AutoLayoutを使えば、
・サイズはコンテンツに合わせて自動的に変更し、
・配置するX位置は画面の中心に
・Y位置は画面の下から20pxに
というのが、Storyboardだけの設定で完結できる。

このコンテンツに合わせる前提だと、AutoResizingMaskでは出来ない事が多い。
あるViewからの相対的な位置指定などは必要不可欠になる。
...このViewとの間に5pxの間を空けて配置する、中心に配置するなど。

これまで、英語、日本語とでレイアウトが変わる時、
Storyboard,XIBを別々にするか、コードでレイアウトを動的に設定しなおすか悩ましいときが度々おきたが、AutoLayout使うとそんな悩みが無くなる事ありそうだ。

ただ、コードでViewを作成して追加していく場合。
追加先のコンテナviewは、AutoLayoutで無い方がやっぱり使いやすい気がする。
追加するviewの中はAutoLayoutの方がよいのだけども。
混在させるのは果たしてアリなのか、無しなのか。

悩ましい。

• • •