web-dev-qa-db-ja.com

Cocoa Autolayout:コンテンツハグ対コンテンツ圧縮耐性の優先順位

コンテンツハグと圧縮耐性の違いについてのCocoa Autolayoutに関するAppleの文書にはっきりした答えはありません。

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

613
dmitrynikolaev

概念の簡単なまとめ

  • ハグ=>コンテンツを拡大したくない
  • 圧縮抵抗=>コンテンツを縮小したくない

そして例:

このようなボタンがあるとしましょう。

[       Click Me      ]

そしてあなたは優先度500でより大きなスーパービューにエッジを固定しました。

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

[Click Me]

ハグの優先順位が500未満の場合、次のようになります。

[       Click Me      ]

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

[Click Me]

そうでなければ、圧縮抵抗の優先度が500未満であれば、次のようになります。

[Cli..]

これでうまくいかない場合は、おそらく他のいくつかの制約が原因で、うまくいっていないことがわかります。

例えば。あなたはそれを優先度1000でスーパービューに固定してもらうことができます。あるいは幅優先度を持つことができます。もしそうなら、これは参考になります:

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

1261
Snowcrash

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

enter image description here

283
onmyway133

enter image description here

出典: @mokagio

固有のコンテンツサイズ - わかりやすいですが、可変コンテンツを持つビューはコンテンツの大きさを認識し、このプロパティを介してコンテンツのサイズを記述します。固有のコンテンツサイズを持つビューの例としては、UIImageView、UILabels、UIButtonなどがあります。

コンテンツハグの優先順位 - この優先順位が高いほど、ビューは本来のコンテンツサイズよりも大きくなることに抵抗します。

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

より多くの説明のためにここにチェックしてください: 自動レイアウトマジック:内容のサイズ優先順位

141
Balasubramanian

「Click Me」というテキストのボタンがあるとしましょう。そのボタンの幅はいくらですか?

まず、ボタンをテキストよりも小さくしたくないということです。そうでなければ、テキストは切り取られます。これが水平方向の圧縮抵抗の優先順位です。

次に、ボタンを必要以上に大きくしたくない場合があります。このようなボタン[Click Me]は明らかに大きすぎます。あなたはボタンがあまりにも多くのパディングなしでその内容を「抱き締める」ことを望みます。これが水平方向のコンテンツハグの優先順位です。ボタンの場合、水平方向の圧縮抵抗の優先度ほど強くはありません。

39
Bridger Maxwell

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>
18
rob mayoff

コンテンツハグとコンテンツ圧縮の永続性優先度は、入ってくるコンテンツに応じて本質的にサイズを計算できる要素に対して機能します。

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

enter image description here

14
dev gr

Content hugging priority ラバーバンド のようにビューの周囲に配置されます。優先順位の値が高いほど、ラバーバンドは強くなり、コンテンツサイズに合わせて抱きしめたいと思います。優先順位の値は輪ゴムの「強さ」のように想像することができます

そしてContent Compression Resistanceは、 ビューがどれほど小さく「抵抗」するのか より高い優先度の値を持つビューは、圧縮に抵抗するものです。

9
Naishta