読者です 読者をやめる 読者になる 読者になる

tomoyaonishiのブログ

iOSのことを中心に・・・その他もあるよ!

iOS8でコードでのAutoLayoutのやり方が地味に変わっていた件

あけましておめでとうございます。

仕事でAutoLayoutでUIを作っていてなんとなく-[UIView addConstraint], -[UIView addConstraints], -[UIView removeConstraint], -[UIView removeConstraints]の定義を見たところ、deprecatedになっていました。正式なdeprecatedではなく

// This method will be deprecated in a future release and should be avoided. 

とコメントに書いてありました。今まではNSLayoutConstraintで制約を作って対象のUIViewのaddConstraint, addConstraintsを呼んでいたわけですが、それが非推奨になっています。

-[UIView addConstraint]の代わりにNSLayoutConstraintのactiveプロパティを使えと書いてあります。-[UIView addConsraints]の代わりには+[NSLayoutConsraint activateConstraints]を使えと書いてあります。後者のクラスメソッドはおそらく引数に渡されたNSLayoutConsraintのactiveプロパティをすべてtrueにセットする便利メソッドだと思います。

NSLayoutConstraintのactiveプロパティをtrueにするとその制約が有効になるようです。今までは対象のviewに対してaddConstraint、removeConstraintで制約を追加、削除していました。activeプロパティは対象のviewに追加する必要がなく、有効にするか、しないかで制約を制御できるようになったようです。

具体的には以下のようにコードを変更します。

NSLayoutConstraint.constraintsWithVisualFormatで複数の制約を作り、それらの制約を有効にする(activeプロパティをtrue)ためNSLayoutConstraint.activateConstraintsに渡します。(制約のactiveプロパティをtrueにすればいいのでKVCでtrueにしても多分同じように動くはずです。)

作った制約をsuperviewに追加するのか、自分自身に追加するのか気にしなくて良くなったので、多少便利になりましたね。

この変更はSizeClassのためでしょうか。Regular, Compact、縦、横画面に合わせてそれぞれ用意しておいた制約をactivateするだけでレイアウトが変えられるので便利な気がします。

正式なdeprecatedではないので、しばらくは大丈夫かと思いますが早めに乗り換えておくほうがよいかと思います。