ContainerViewに対して最大2分の1まで伸びる子Viewを、コードを書かずにAutoLayoutで組む

作りたかった画面

以下のような画面サイズの最大2分の1まで伸びる2つのViewを作りたかったですが、Textサイズの計算などをしたくなかったので、AutoLayoutのみでレイアウトを組んでました。良い感じにレイアウトが組めたので、残しておきます。

最大サイズまで伸びているときは、以下のような画面になります。

f:id:kuro-46:20191112073846p:plain

2つとも短いときは、以下のようにくっ付くような形になります。

ここで、Viewの横幅を完全に2分割にするだけであれば、単純なレイアウトとなります。

f:id:kuro-46:20191112073836p:plain

どちらかが短いときは以下のような感じになるように実装しました。

f:id:kuro-46:20191112073839p:plain

f:id:kuro-46:20191112073843p:plain

難しいポイント

  • 完全に2分割ではなく、それよりも短いときにはくっ付くようなレイアウトにする必要がある点
  • テキストだけでなく、ImageなどのViewを置いている点
  • 両端からテキストまでの間や、それぞれのテキストの間にSpacingがあるので、Spacingを考慮してレイアウトを組まなければいけない点

これらを幅の計算によって実装を行うと、定数定義が多く煩雑になってしまいます。

実現方法

子ViewのMultiplierを親Viewの1:2以下にするようにレイアウトを組むことで、実現することが出来ました。

Viewの構成要素としては、以下のようになります。

f:id:kuro-46:20191112192050p:plain

制約

ContainerStackViewの制約

上下左をContainerViewに、右はContainerViewに対して、ContainerStackViewのSpacing分マイナス値を指定します。

このViewを組むときに、一番下に置いているContainerViewのConstraintを、ContainerStackViewのSpacing分マイナスに指定することがポイントでした。

f:id:kuro-46:20191112192741p:plain

Left/RightStackViewの制約

ContainerViewに対してMultipriorを1:2にして、Less Than or Equalにすることで、ContainerViewの2分の1以下と指定することが出来ます。

f:id:kuro-46:20191112192925p:plain

コードについて

Sample Projectを置いているので、試してみて頂けますと幸いです。

github.com