684

コンテンツのハグと圧縮耐性の違いについて、Cocoa Autolayout に関する Apple のドキュメントで明確な答えを見つけることができません。

誰かがその使用法と違いを説明できますか?

4

8 に答える 8

1371

概念の簡単な要約:

  • ハグ => 内容が大きくなりたくない
  • 圧縮抵抗 => コンテンツは縮小したくない

例:

次のようなボタンがあるとします。

[       Click Me      ]

そして、エッジを優先度 500 のより大きなスーパービューにピン留めしました。

次に、Hugging 優先度 > 500 の場合、次のようになります。

[Click Me]

Hugging の優先度が 500 未満の場合は、次のようになります。

[       Click Me      ]

スーパービューが縮小すると、圧縮抵抗の優先度が 500 を超えると、次のようになります。

[Click Me]

圧縮抵抗の優先度が 500 未満の場合は、次のようになります。

[Cli..]

このように機能しない場合は、他の制約が原因でうまく機能しなくなっている可能性があります。

たとえば、優先度 1000 でスーパービューにピン留めすることもできます。または、幅の優先度を設定することもできます。もしそうなら、これは役に立ちます:

エディター > コンテンツに合わせたサイズ

于 2013-04-29T14:29:25.980 に答える
310

Autolayout に関するこのビデオチュートリアルを見てください。彼らはそれを注意深く説明しています

ここに画像の説明を入力

于 2014-04-21T18:23:30.913 に答える
241

ここに画像の説明を入力

ソース: @mokagio

Intrinsic Content Size - かなり自明ですが、可変コンテンツを含むビューは、コンテンツの大きさを認識し、このプロパティを通じてコン​​テンツのサイズを記述します。固有のコンテンツ サイズを持つビューの明らかな例として、UIImageViews、UILabels、UIButtons があります。

コンテンツ ハギングの優先度- この優先度が高いほど、ビューは固有のコンテンツ サイズよりも大きくなりにくくなります。

コンテンツの圧縮耐性の優先度- この優先度が高いほど、ビューは固有のコンテンツ サイズよりも小さく縮小するのに抵抗します。

詳細については、ここを確認してください:自動レイアウト マジック: コンテンツ サイズの優先順位

于 2017-09-10T14:00:21.377 に答える
20

の場合view.intrinsicContentSize.width != NSViewNoIntrinsicMetric、自動レイアウトはタイプ の特別な制約を作成しますNSContentSizeLayoutConstraint。この制約は、次の2 つの通常の制約のように機能します。

  • 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、自動レイアウトはNSContentSizeLayoutConstraint、ビューの高さに対する 2 つの制約のように機能する を作成します。コードでは、次のようになります。

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)

これらの特別なNSContentSizeLayoutConstraintインスタンス (存在する場合) はview.constraints、レイアウトの実行後に印刷することで確認できます。例:

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>
于 2015-08-14T20:29:33.473 に答える
15

Content Hugging および Content Compression Resistence Priority は、入ってくるコンテンツに応じて本質的にサイズを計算できる要素に対して機能します。

アップルのドキュメントから:

ここに画像の説明を入力

于 2016-02-09T09:16:23.747 に答える