AutoLayoutでmarginを画面比率によって変更したい時の対処
経緯
ふと前にも調べた気がするが、覚えていないなら覚えるまで同じ記事であろうか書くしかない。
AutoLayoutで制約をつけていると、固定のものは問題ないが、画面サイズによって可変にしたい場合、Viewのwidth
やheight
であれば、superviewとequal widthやequal heightしてから、割合で入力してやれば簡単にできるので困らない。
一方で、safeAreaのtopからのmarginとなると素直にやる方法がなくて困る。
UINavigationBarがないStoryboardなら使える方法
ものによっては、Vertically in Container
をつけて調整することで対応できるものもある。(具体的に言えば、UINavigationBarの影響がないStoryboard、LaunchScreen等)
ただ、これも万能ではなく、Storyboard上で上手く作れた様に見えて、実機で確認するとstatusBarやNavigationBarの高さが余分に含まれた見た目になることがある。
Storyboardを捨てるかどうか
marginを画面サイズから割合で出す方法は2つある。
1. Storyboardを使わない場合
UILayoutGuide
というものがあるので、これを使いましょう。
詳しくはこちら
Goodbye Spacer Views Hello Layout Guides
2. Storyboardを使う場合
これは、もう色々諦めの境地で空のUIViewをSpacerとして配置しましょう。
ViewとView、safeAreaとViewの間に置き、TopやBottom等を0marginでくっつけ、SpacerのViewのwidth
やheight
をsuperviewとの割合で調整します。調整が終わったら、hidden
にチェックをつけ、画面から見えないようにします。
これは意味もなくViewを置く無駄加減にモヤっとしますが、他に方法がないです。
UILayoutGuide
がInterface Builderに対応してくれれば、可能ですが、Xcode9の時点では無理です。(Xcode7時代からずっと今まで無理)