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


643

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

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


49
인생의 가장 중요한 신비 중 하나는 왜 단순히 "확장 저항"이라고 부르지 않았는가입니다. 두 가지 특성은 "확장 저항"및 "압축 저항"에 지나지 않습니다 . "허깅"용어는 미쳤다.
Fattie

3
경우 당신은 다음 너무 많은 공간이 content-hugging: 공백을 가진 맞서 싸울 것입니다. 그것은 단지보기가 당신을 돌아 다니도록 강요 할 것입니다. 그러나 경우에 당신이 너무 많은 공간을 가지고, 대신 다음 아주 작은 장소가없는 content-compressions-resistance모든 내용을 표시 할 수없는에서보기에 맞서 싸울 것, 예를 들어 레이블이 잘릴 것입니다.

답변:


1319

개념에 대한 간단한 요약 :

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

예:

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

[       Click Me      ]

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

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

[Click Me]

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

[       Click Me      ]

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

[Click Me]

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

[Cli..]

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

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

편집기> 내용에 맞게 크기


37
포옹 우선 순위 == 500이면 어떻게됩니까?
bradley.ayers 10

1
나는 전형적인 반올림 동작과 같이 500 이상으로 취급 될 것이라고 가정합니다 (그러나 일반적으로 좋은 생각은 아닙니다). 그래도 테스트하지 않았습니다.
Joshua Nozzi

런타임에 "제약 조건을 동시에 만족시킬 수 없음"경고가 표시 될 것입니다.
Max

8
@ bradley.ayers MaxDesyatov의 의견에 따르면, 필수 우선 순위 (1000)와 제약 조건이 충돌하는 경우에만 발생합니다. 우선 순위가 낮은 두 가지 제약 조건이 충돌하는 경우 솔루션이 모호하므로 자동 레이아웃 엔진은 하나의 유효한 솔루션을 선택하기 때문에 경고는 표시되지 않습니다. 레이아웃이 어떻게 보이는지 선택하는 것은 자동 레이아웃 엔진의 내부 구현에 달려 있으며 이론적으로 이것은 iOS 버전에서 다음 버전으로 바뀔 수 있기 때문에 이것은 좋지 않습니다.
smileyborg

콘텐츠 포옹 우선 순위 기본값은 250이고 콘텐츠 압축 저항 기본값은 750입니다. 왜 500을 사용합니까?
ZYiOS

292

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

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


1
@fatuhoku 당신은 다시 확인할 수 있습니다,이 비디오는 무료입니다
onmyway133

31
포옹 대 저항 토론은 비디오의 13:15 지점에서 시작됩니다.
Carl Smith

1
@ onmyway133 이것은 완벽한 비디오이지만 불행히도 Ray가 그것을 사용하는 방법에 대한 예는 없습니다.
Matrosov Alexander

@MatrosovAlexander 매우 실용적인 예는 Autolayout fantageek.com/1468/…
onmyway133

1
그는 18:05에 압축 저항을 사용하는 방법을 보여줍니다
Brent Faust

187

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

출처: @mokagio

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

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

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

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


그림은 훌륭하지만 가장 말을 잘못하는 것은 오해의 소지가 있습니다. 최고 남자는 "내가 자라게하지 않겠다"고 말해야한다. 자식보기는 컨텐츠 포옹 동작을 통해 성장하고 싶지 않다고 스스로 정의합니다. 성장을 멈추게하는 외 생력 (예 : 손)이 없습니다. 그것은 큰 차이입니다.
Manuel

6
나는 그림을 좋아하기 때문에 이것을 투표하고 있습니다.
James Bucanek

3
이것이 제가 Stack Overflow를 좋아하는 이유입니다. Snowcrash의 설명과이 그림은 mokagio =이 속성에 대한 최고의 설명입니다 (Apple 자체 문서 포함).
Kal

40

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

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

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


19

그렇다면 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>

1
(view.intrinsicContentSize.height greaterThanOrEqualToConstant) : 그것은 안 verticalCompression = view.heightAnchor.constraint하자
mc_plectrum

1
예, 복사 / 붙여 넣기 오류가 발생했습니다. 나는 그것을 고쳤다. 알려 주셔서 감사합니다.
rob mayoff 2016 년

15

컨텐츠 포옹 및 컨텐츠 압축 저항 우선 순위는 들어오는 컨텐츠에 따라 본질적으로 크기를 계산할 수있는 요소에 적용됩니다.

에서 애플 문서 :

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


이미지의 플러스 1 (Y)
Noor Ali Butt

혼란 스러워요. 스크롤을 사용할 수없는 textView의 경우 이는 사용자 당 고유 크기를 입력한다는 의미입니까?

@Honey 올바른 제약 조건을 설정하고 스크롤을 사용하지 않으면 텍스트보기가 고유 높이를 알 수 있어야한다고 생각합니다.
dev gr

그것은 내 질문에 대답하지 못했습니다. textView의 현재 크기보다 많이 많이 입력하면 textView가 자동으로 확장되고 고유 크기가 변경됩니까?
Honey

직접 해보십시오. textview에 고정 너비를 지정하고 스크롤을 비활성화하고 원하는 동작을 확인하십시오. 자세한 답변은 stackoverflow.com/a/21287306/1526629 를 참조하십시오 .
dev gr

11

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.