今回は AutoLayout 関連で、なんとなく使っていて詳しく理解していなかった Content Hugging Priority
と Content Compression Resistance Priority
を調べていきたいと思います。
Content hugging priority とは?
この Priority(優先度) は View が本来のサイズよりも大きくなることに抵抗する度合いを設定します。つまり、この値が大きくなればなるほど、View がそのコンテンツよりも大きくならないようになります。
View | Content hugging priority |
---|---|
UIView | 250 |
UITextView | 250 |
UIButton | 250 |
UILabel | 251 |
UIImageView | 251 |
UISwitch | 750 |
Content Compression Resistance Priority とは?
この Priority は View が本来のサイズよりも小さくなることに抵抗する度合いを設定します。つまり、この値が大きくなればなるほど、View がそのコンテンツよりも小さく縮小されないようになります。
View | Content Compression Resistance Priority |
---|---|
UIView | 750 |
UITextView | 750 |
UIButton | 750 |
UILabel | 750 |
UIImageView | 750 |
UISwitch | 750 |
知っておくといいこと
Q1
みなさんが仕事で AutoLayout を使っている場合、少なくとも一回ぐらいは Xib で下記のように Label の高さを指定せずに Label 同士を繋げて View のコンテンツとして制約を貼った時に起こる Error に遭遇したことがあるかと思います。
Label 単体で制約を貼った場合は Error が出ないのに、高さを指定していない Label を連結するとどうして Error が出るのでしょう?少し考えてみてください🙃
答え
答えは、Content hugging priority
の vertial の値がどちらも251だからです🙃つまり、どちらも同じ値なので、制約を満たすためにどちらかの Label を広げて表示させたいのですが、値が競合しているためシステムが判断できないよ、とのことです。
それでは、試しに blueLabel
の Content hugging priority
の vertical 値を1ポイント下げて広げやすくしてみます。
Q2
下記のようにラベルの幅の制約(幅40pt)を priority750
でセットして省略されてしまうような長い文字列を挿入した時、またも Error に遭遇してしまいましたこれはなぜでしょうか?
答え
答えは、Content Compression Resistance Priority
の horizontal の値が横幅(NSLayoutConstraint
)の priority と競合しているためです。これによって、システムは横幅で指定されている40ptとコンテンツサイズの大きさに合わせる Content Compression Resistance Priority
の値のどちらを優先していいか分からず Error が出てしまっているのですね🙃
それでは、試しに Content Compression Resistance Priority
の値を1ポイント上げて751にしてみましょう。すると、下記のようにコンテンツ幅が優先されて表示されるようになりました🎉
また、Content Hugging Priority
および Content Compression Resistance Priority
は、Viewにサイズを決定するための十分な制約がない場合に NSContentSizeLayoutConstraint
という制約をつくるのにも使用されるそうで、プログラム中で NSContentSizeLayoutConstraint
と NSLayoutConstraint
の Priority の値が同じ場合は NSLayoutConstraint
が優先されるようです。