Swiftで遊ぼう! - 289 - Autolayoutの実習7 Hugging Priority & Compression Resistance Priority
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(垂直方向)にレイアウトが重なっている今回のケースを考えます。
イメージが重なっているのにもかかわらず、イメージと「login」ボタンの間に「標準の間隔を保て!」というコンストレイントを指定しても、何を縮めりゃいいのか分からない!という警告をXcodeが発しているんです。
Update Framesをした後に、見た目は上手くいっているように見えますが、ランタイム時に破綻するかもしれません。オブジェクトの圧縮の順位を決定するのが、「Compression Resistance Priority」です。View上に並べた全てのオブジェクトにこの値が割りふられています。
イメージを選択してからサイズ・インスペクタを見ます。
既に知っているコンストレイント(Constraints)の下に、Content Hugging PriorityとContent Compression Resistance Priorityが並んでいますが、問題になっているのは、Compression Resistance PriorityのVertical(垂直)の値です。
実は既定値が「750」で、上限は「1000」です。この値が大きいと圧縮が起こりにくいということです。
垂直方向に並んでいるオブジェクトを確認していきます。usernameFieldフィールド、passwordFieldフィールド、loginボタンなどすべて「750」の既定値が入力されています。
これらフィールドやボタンでは、フォントが割りふられているので、圧縮されて欲しくないです。
圧縮されて問題無いのは結局イメージということになります。この「Vertical値」を「700」に変更すると、
ドキュメント・アウトラインに出ていた警告メッセージが一瞬で消えました。
今日はここまで。