コンテンツのハグと圧縮耐性の違いについて、Cocoa Autolayout に関する Apple のドキュメントで明確な答えを見つけることができません。
誰かがその使用法と違いを説明できますか?
コンテンツのハグと圧縮耐性の違いについて、Cocoa Autolayout に関する Apple のドキュメントで明確な答えを見つけることができません。
誰かがその使用法と違いを説明できますか?
概念の簡単な要約:
例:
次のようなボタンがあるとします。
[ Click Me ]
そして、エッジを優先度 500 のより大きなスーパービューにピン留めしました。
次に、Hugging 優先度 > 500 の場合、次のようになります。
[Click Me]
Hugging の優先度が 500 未満の場合は、次のようになります。
[ Click Me ]
スーパービューが縮小すると、圧縮抵抗の優先度が 500 を超えると、次のようになります。
[Click Me]
圧縮抵抗の優先度が 500 未満の場合は、次のようになります。
[Cli..]
このように機能しない場合は、他の制約が原因でうまく機能しなくなっている可能性があります。
たとえば、優先度 1000 でスーパービューにピン留めすることもできます。または、幅の優先度を設定することもできます。もしそうなら、これは役に立ちます:
エディター > コンテンツに合わせたサイズ
Autolayout に関するこのビデオチュートリアルを見てください。彼らはそれを注意深く説明しています
ソース: @mokagio
Intrinsic Content Size - かなり自明ですが、可変コンテンツを含むビューは、コンテンツの大きさを認識し、このプロパティを通じてコンテンツのサイズを記述します。固有のコンテンツ サイズを持つビューの明らかな例として、UIImageViews、UILabels、UIButtons があります。
コンテンツ ハギングの優先度- この優先度が高いほど、ビューは固有のコンテンツ サイズよりも大きくなりにくくなります。
コンテンツの圧縮耐性の優先度- この優先度が高いほど、ビューは固有のコンテンツ サイズよりも小さく縮小するのに抵抗します。
詳細については、ここを確認してください:自動レイアウト マジック: コンテンツ サイズの優先順位
の場合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>
Content Hugging および Content Compression Resistence Priority は、入ってくるコンテンツに応じて本質的にサイズを計算できる要素に対して機能します。
アップルのドキュメントから: