iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

Content Hugging Priority と Content Compression Resistance Priority を理解する

今回は AutoLayout 関連で、なんとなく使っていて詳しく理解できていなかった Content Hugging PriorityContent 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 が出るのでしょう?少し考えてみてください🙃

f:id:yum_fishing:20200906181947p:plain

答え

答えは、Content hugging priority の vertial の値がどちらも251だからです🙃つまり、どちらも同じ値なので、制約を満たすためにどちらかの Label を広げて表示させたいのですが、値が競合しているためシステムが判断できないよ、とのことです。

それでは、試しに blueLabelContent hugging priority の vertical 値を1ポイント下げて広げやすくしてみます。

f:id:yum_fishing:20200906182036p:plain

Q2

下記のようにラベルの幅の制約(幅40pt)を priority750 でセットして省略されてしまうような長い文字列を挿入した時、またも Error に遭遇してしまいましたこれはなぜでしょうか?

f:id:yum_fishing:20200906182104p:plain

答え

答えは、Content Compression Resistance Priority の horizontal の値が横幅(NSLayoutConstraint)の priority と競合しているためです。これによって、システムは横幅で指定されている40ptとコンテンツサイズの大きさに合わせる Content Compression Resistance Priority の値のどちらを優先していいか分からず Error が出てしまっているのですね🙃

それでは、試しに Content Compression Resistance Priority の値を1ポイント上げて751にしてみましょう。すると、下記のようにコンテンツ幅が優先されて表示されるようになりました🎉

f:id:yum_fishing:20200906182118p:plain

また、Content Hugging Priority および Content Compression Resistance Priority は、Viewにサイズを決定するための十分な制約がない場合に NSContentSizeLayoutConstraint という制約をつくるのにも使用されるそうで、プログラム中で NSContentSizeLayoutConstraintNSLayoutConstraint の Priority の値が同じ場合は NSLayoutConstraint が優先されるようです。

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com