中身のあるコンテンツの部品

UIButtonやUILabelなど、テキストなどで中身のあるコンテンツはサイズがすでに決まっている部品があります。
この部品のサイズに関する制約は、プログラマーが自分で設定しなくてもすでに設定されています。

これをIntrinsic Content Size(以下組み込みコンテンツサイズ)といいます。


組み込みサイズのありなしでの制約設定

UIViewには、組み込みサイズがありません。
一方でUILabelには組み込みサイズがあります。テキストのサイズがそのままUILabelの幅と高さのサイズになります。

それが制約設定でどのように変わるかを見てみましょう。

UIViewをレイアウト

まずUIViewを画面の右下に設定するレイアウトを考えてみます。

Storyboardを開いて、ViewControllerの右下にViewを置きます。
Trailingの制約とBottomの制約を追加してみます。

Intrinsic-Content-Size_1

すると、制約が足りず、エラーを表す赤い線が表示されます。
Auto Layoutの制約エラーを解消するためにViewに幅と高さの制約を追加するとエラーはなくなります。

Intrinsic-Content-Size_2

UILabelをレイアウト

UIViewでは自分で、幅と高さの制約を追加する必要がありました。
今度はUILabelでやってみましょう。 同じようにViewControllerの右下にUILabelを置いて、Trailingの制約とBottomの制約を追加してみます。
ラベルのテキストは「中身のあるコンテンツ」とします。

Intrinsic-Content-Size_3

Trailingの制約とBottomの制約のみでAuto Layoutのエラーなく表示されました。
すでに「中身のあるコンテンツ」というテキストの幅と高さがそのままラベルの幅と高さの制約として設定しているからです。

このように、中身のあるコンテンツの部品は幅と高さの制約がコンテンツの幅と高さで自動的に設定されます。


組み込みコンテンツサイズ一覧

iOSで使われる部品のうちコンテンツサイズの一覧は次の通りです。

UIView
組み込みサイズはありません

UISlider
高さの組み込みサイズがあります。

UILabel、UIButton、UISwitch、UITextField
幅と高さに組み込みサイズがあります。

UITextViewとUIImageView
コンテンツ(UITextViewならテキスト、UIImageViewなら画像)があれば、それが組み込みサイズになります。
コンテンツがセットされてなければ、組み込みサイズはなくなります。


まとめ

中身によってサイズが変わる組み込みサイズの要素をまとめました。
制約を設定していて、サイズがよくわからなくなった時は、この組み込みサイズを考えてみましょう。

参考