Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide
質問 : Swiftで遊ぼう! - 252 - FaceViewプロジェクト始動 - Swiftで遊ぼう! on Hatena

「Hugging PriorityとCompression Resistance Priority」って何でしょう?

これからAutolayoutの微調整に関する説明に入ります。スタンフォード大学のポール先生の講義は、終了間際になっていたので、コードを高速でタイプして早口でまくし立てる説明になったので、全くついていけませんでした(T_T) じっくりコードを見ながら理解を深めていきます。

まずレイアウトが伸縮する場合、その中でオブジェクトの大きさを変化させないといけません。どのオブジェクトを優先的(Priority)に変化させるか順番を決める値のことです。Huggin Priorityは、伸張についていく優先度を意味して、Compression Resistance Priorityは、縮小するときに圧縮される優先度を意味します。

まず、今回問題になっているのは、レイアウトで並べたときにVertically(垂直方向)にレイアウトが重なっている今回のケースを考えます。

f:id:yataiblue:20150423065605j:plain

イメージが重なっているのにもかかわらず、イメージと「login」ボタンの間に「標準の間隔を保て!」というコンストレイントを指定しても、何を縮めりゃいいのか分からない!という警告をXcodeが発しているんです。

Update Framesをした後に、見た目は上手くいっているように見えますが、ランタイム時に破綻するかもしれません。オブジェクトの圧縮の順位を決定するのが、「Compression Resistance Priority」です。View上に並べた全てのオブジェクトにこの値が割りふられています。

イメージを選択してからサイズ・インスペクタを見ます。

f:id:yataiblue:20150423142404j:plain

既に知っているコンストレイント(Constraints)の下に、Content Hugging PriorityとContent Compression Resistance Priorityが並んでいますが、問題になっているのは、Compression Resistance PriorityVertical(垂直)の値です。

実は既定値が「750」で、上限は「1000」です。この値が大きいと圧縮が起こりにくいということです。

垂直方向に並んでいるオブジェクトを確認していきます。usernameFieldフィールド、passwordFieldフィールド、loginボタンなどすべて「750」の既定値が入力されています。

これらフィールドやボタンでは、フォントが割りふられているので、圧縮されて欲しくないです。

圧縮されて問題無いのは結局イメージということになります。この「Vertical値」を「700」に変更すると、

ドキュメント・アウトラインに出ていた警告メッセージが一瞬で消えました。

今日はここまで。