コンテンツハグと圧縮耐性の違いについてのCocoa Autolayoutに関するAppleの文書にはっきりした答えはありません。
誰かが彼らの用法と違いを説明できますか?
概念の簡単なまとめ
そして例:
このようなボタンがあるとしましょう。
[ Click Me ]
そしてあなたは優先度500でより大きなスーパービューにエッジを固定しました。
次に、Hugging priority> 500の場合、次のようになります。
[Click Me]
ハグの優先順位が500未満の場合、次のようになります。
[ Click Me ]
スーパービューが縮小した場合、圧縮抵抗の優先度が500を超えると、このようになります。
[Click Me]
そうでなければ、圧縮抵抗の優先度が500未満であれば、次のようになります。
[Cli..]
これでうまくいかない場合は、おそらく他のいくつかの制約が原因で、うまくいっていないことがわかります。
例えば。あなたはそれを優先度1000でスーパービューに固定してもらうことができます。あるいは幅優先度を持つことができます。もしそうなら、これは参考になります:
エディタ>コンテンツに合わせたサイズ
このビデオを見てください Autolayoutについてのチュートリアル 、彼らはそれを注意深く説明しています
出典: @mokagio
固有のコンテンツサイズ - わかりやすいですが、可変コンテンツを持つビューはコンテンツの大きさを認識し、このプロパティを介してコンテンツのサイズを記述します。固有のコンテンツサイズを持つビューの例としては、UIImageView、UILabels、UIButtonなどがあります。
コンテンツハグの優先順位 - この優先順位が高いほど、ビューは本来のコンテンツサイズよりも大きくなることに抵抗します。
コンテンツ圧縮耐性の優先順位 - この優先順位が高いほど、ビューは本来のコンテンツサイズよりも小さく縮小することに抵抗します。
より多くの説明のためにここにチェックしてください: 自動レイアウトマジック:内容のサイズ優先順位
「Click Me」というテキストのボタンがあるとしましょう。そのボタンの幅はいくらですか?
まず、ボタンをテキストよりも小さくしたくないということです。そうでなければ、テキストは切り取られます。これが水平方向の圧縮抵抗の優先順位です。
次に、ボタンを必要以上に大きくしたくない場合があります。このようなボタン[Click Me]は明らかに大きすぎます。あなたはボタンがあまりにも多くのパディングなしでその内容を「抱き締める」ことを望みます。これが水平方向のコンテンツハグの優先順位です。ボタンの場合、水平方向の圧縮抵抗の優先度ほど強くはありません。
view.intrinsicContentSize.width != NSViewNoIntrinsicMetric
の場合、自動レイアウトはNSContentSizeLayoutConstraint
型の特別な制約を作成します。この制約は、 two normalの制約のように機能します。
view.width <= view.intrinsicContentSize.width
を必要とする制約view.width >= view.intrinsicContentSize.width
を必要とする制約。Swiftでは、iOS 9の新しいレイアウトアンカーを使って、次のような同等の制約を設定できます。
let horizontalHugging = view.widthAnchor.constraint(
lessThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalHugging.priority = view.contentHuggingPriority(for: .horizontal)
let horizontalCompression = view.widthAnchor.constraint(
greaterThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalCompression.priority = view.contentCompressionResistancePriority(for: .horizontal)
同様に、view.intrinsicContentSize.height != NSViewNoIntrinsicMetric
の場合、自動レイアウトはビューの高さに対する2つの制約のように機能するNSContentSizeLayoutConstraint
を作成します。コードでは、これらは次のようになります。
let verticalHugging = view.heightAnchor.constraint(
lessThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalHugging.priority = view.contentHuggingPriority(for: .vertical)
let verticalCompression = view.heightAnchor.constraint(
greaterThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalCompression.priority = view.contentCompressionResistancePriority(for: .vertical)
レイアウトが実行された後にview.constraints
を表示することで、これらの特別なNSContentSizeLayoutConstraint
インスタンス(存在する場合)を見ることができます。例:
label.constraints.forEach { print($0) }
// Output:
<NSContentSizeLayoutConstraint:0x7fd82982af90 H:[UILabel:0x7fd82980e5e0'Hello'(39)] Hug:250 CompressionResistance:750>
<NSContentSizeLayoutConstraint:0x7fd82982b4f0 V:[UILabel:0x7fd82980e5e0'Hello'(21)] Hug:250 CompressionResistance:750>
Content hugging priority
は ラバーバンド のようにビューの周囲に配置されます。優先順位の値が高いほど、ラバーバンドは強くなり、コンテンツサイズに合わせて抱きしめたいと思います。優先順位の値は輪ゴムの「強さ」のように想像することができます
そしてContent Compression Resistance
は、 ビューがどれほど小さく「抵抗」するのか より高い優先度の値を持つビューは、圧縮に抵抗するものです。