AutoLayoutのpriorityについてまとめてみた。
AutoLayoutに優先度付けるってのたぶん一度は勉強したが実際に使う場面がなくて完全に忘れていた。
でもついこの前使える場面があったがその時に気づけなかった。
レイアウト変更の際にどうやりますかって問出されてイマイチわからなかったので、職場で聞いたりしらべて勉強し直してみました。
やりたいこととしては
パターンAをベースレイアウトとして
この時には赤が2行なので緑から黄色の間が20です。
これをオートレイアウトでテキストが4行になったときには
水色から黄色を20pxにする。
でパターンCは黄緑Viewをかくした際に
赤色から端までを20pxに変更する。
そのオートレイアウトのやりかたがパッと思いつかなかったので
勉強しなおしてみました。
黄緑or水色と黄色の考え方は
AutoLayoutで優先度を設定するを参考にさせていただきました。
赤色の可変については
Auto Layoutで非表示にした部分を詰める(トルツメ)する方法
を参考にさせていただきました。
・基準となるViewが変わる場合の優先度設定方法
上記4つをこんな感じで制約するとうまくいきました。
priority:1000だと必須なので
黄緑-黄と水-黄Highはそれより引く値
水-黄Lowはより低い値に設定します。
20pxは親Viewと黄色が実際には開けてます。。。
わかりづらくてすみません。。。。
priorityHighで黄緑のViewのが下にある場合を表現
priorityLowで水色のViewが下にある時の条件を表現する感じです。
・Viewを隠した際のレイアウト変更
self.greenView.hidden = !self.greenView.hidden;
if (self.greenView.hidden) {
self.redViewLongConstraint.priority = UILayoutPriorityDefaultHigh;
self.redViewShortConstraint.priority = UILayoutPriorityDefaultLow;
} else {
self.redViewLongConstraint.priority = UILayoutPriorityDefaultLow;
self.redViewShortConstraint.priority = UILayoutPriorityDefaultHigh;
}
リンク先を参考にするとこんな感じです。
黄緑と赤、親と赤でレイアウトを削除して点け直すみたいな事やると思ってたんですが
そうではなくてその2つの制約を用意してプライオリティーを変更して切り替えるようです。
これの方が設定の数値コードで書き換えるより綺麗ですね!
これは答えたかったなー
AutoLayoutはSizeClass系は基本大丈夫なんですが、この辺はあまり出番がこなかったのと
今のやつとかネットに結構制約を短くするみたいな方法が転がってるのでそっちで覚えてしまっていました。
次作る機会が言う機会があればこの手法で行こうと思います。
やっぱりもっといろんなアプリのコードみたいなー。
ただ質問されて考えるのはやっぱり面白かったですね。