面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

AutoLayoutでmarginを画面比率によって変更したい時の対処

経緯

ふと前にも調べた気がするが、覚えていないなら覚えるまで同じ記事であろうか書くしかない。

AutoLayoutで制約をつけていると、固定のものは問題ないが、画面サイズによって可変にしたい場合、Viewのwidthheightであれば、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のwidthheightをsuperviewとの割合で調整します。調整が終わったら、hiddenにチェックをつけ、画面から見えないようにします。

これは意味もなくViewを置く無駄加減にモヤっとしますが、他に方法がないです。

UILayoutGuideがInterface Builderに対応してくれれば、可能ですが、Xcode9の時点では無理です。(Xcode7時代からずっと今まで無理)