[cocoa] 코코아 오토 레이아웃 : 콘텐츠 포옹과 콘텐츠 압축 저항 우선 순위

내용 포옹과 압축 저항의 차이에 대한 Cocoa Autolayout에 관한 Apple 문서에 대한 명확한 답변을 찾을 수 없습니다.

누군가 사용법과 차이점을 설명 할 수 있습니까?



답변

개념에 대한 간단한 요약 :

  • 포옹 => 콘텐츠는 자라기를 원하지 않습니다
  • 압축 저항 => 내용은 축소하고 싶지 않습니다

예:

다음과 같은 버튼이 있다고 가정 해보십시오.

[       Click Me      ]

그리고 우선 순위가 500 인 더 큰 슈퍼 뷰에 가장자리를 고정했습니다.

그런 다음 Hugging priority> 500이면 다음과 같습니다.

[Click Me]

Hugging priority <500이면 다음과 같습니다.

[       Click Me      ]

이제 슈퍼 뷰가 줄어들면 압축 저항 우선 순위가 500보다 크면 다음과 같이됩니다.

[Click Me]

그렇지 않으면 압축 저항 우선 순위 <500 인 경우 다음과 같이 보일 수 있습니다.

[Cli..]

이것이 작동하지 않으면 아마도 당신의 좋은 일을 망쳐 놓는 다른 제약이있을 것입니다!

예를 들어 우선 순위가 1000 인 슈퍼 뷰에 고정 시키거나 너비 우선 순위를 지정할 수 있습니다. 그렇다면 도움이 될 수 있습니다.

편집기> 내용에 맞게 크기


답변

Autolayout대한 이 비디오 자습서를 살펴보고 신중하게 설명하십시오.

여기에 이미지 설명을 입력하십시오


답변

여기에 이미지 설명을 입력하십시오

출처: @mokagio

고유 컨텐츠 크기 -설명이 필요하지만 가변 컨텐츠가있는보기는 컨텐츠의 크기를 인식하고이 특성을 통해 컨텐츠의 크기를 설명합니다. 고유 한 컨텐츠 크기를 가진 뷰의 몇 가지 명백한 예는 UIImageViews, UILabels, UIButton입니다.

콘텐츠 포옹 우선 순위 -이 우선 순위가 높을수록 고유 컨텐츠 크기보다 커지는 견해가 커집니다.

내용 압축 저항 우선 순위 -이 우선 순위가 높을수록 고유 컨텐츠 크기보다 축소에 대한 저항이 커집니다.

자세한 내용은 여기를 확인하십시오 : 자동 레이아웃 매직 : 콘텐츠 사이징 우선 순위


답변

“Click Me”라는 텍스트가있는 버튼이 있다고 가정 해 봅시다. 그 버튼의 너비는 얼마입니까?

첫째, 버튼이 텍스트보다 작게되는 것을 원하지 않습니다. 그렇지 않으면 텍스트가 잘립니다. 이것이 수평 압축 저항 우선 순위입니다.

둘째, 버튼이 필요 이상으로 커지는 것을 원하지 않습니다. [Click Me]와 같은 버튼은 분명히 너무 큽니다. 버튼을 너무 많이 채울 필요없이 버튼을 내용을 “허그”하기를 원합니다. 이것이 수평 콘텐츠 포옹 우선 순위입니다. 버튼의 경우 수평 압축 저항 우선 순위만큼 강하지 않습니다.


답변

그렇다면 view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, 자동 레이아웃은 특별한 유형의 제약을 만듭니다 NSContentSizeLayoutConstraint. 이 제약 조건은 두 가지 일반 제약 조건 처럼 작동합니다.

  • 요구되는 제약 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뷰 높이에 대한 두 가지 구속 조건처럼 작동 하는 을 만듭니다 . 코드에서는 다음과 같습니다.

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 priority유사한입니다 고무 밴드 뷰 주위에 배치된다. 우선 순위 값이 높을수록 고무 밴드가 강해지며 내용물 크기에 더 많이 포옹하고 싶습니다. 우선 순위 값은 고무 밴드의 “강도”와 같이 상상할 수 있습니다

그리고, “저항”이Content Compression Resistance 얼마나 작아 지는지에
대한 저항 우선 순위 값이 높은 View는 압축에 저항하는 것입니다.