그게 가능하면 이렇게 노가다하지 않았겠지...
이에 대한 사전 지식으로 "View의 본질적 크기", intrinsic content size에 대한 이해가 필요하다.
intrinsicContentSize
The natural size for the receiving view, considering only properties of the view itself.
Custom views typically have content that they display of which the layout system is unaware. Setting this property allows a custom view to communicate to the layout system what size it would like to be based on its content. This intrinsic size must be independent of the content frame, because there’s no way to dynamically communicate a changed width to the layout system based on a changed height, for example.
기본 설정된 content가 존재할 경우, UI component는 해당 content의 size로 기본 설정되어 있는 경우가 존재한다. 물론 따로 설정하는 것도 가능하다.
e.g.) UILabel: height 21
e.g.) UIButton: height 24
(내부 text 크기만큼 height가 잡힘)
반면 설정된 content의 크기를 지정하지 않은 UI component들, 예를 들어 UIView와 UIImageView의 경우는 직접 설정해줘야 한다.
따라서 각 UI component들이 content size가 존재할 경우, 어떤 constraint를 먼저 적용할지에 관한 주제가 UI priority이다.
Apple에서 기본 설정한 priority 숫자는 hugging에 251, compression에 750을 할당했다. 숫자의 절대적 의미가 있는 것이 아니므로 차이만 비교한다.
priority이므로 해당 숫자가 높을 수록 우선 적용된다.
priority의 종류는 2가지이다.
Hugging Priority | Compression Resistance Priority |
---|---|
intrinsicContentSize가 최대 크기 | intrinsicContentSize가 최소 크기 |
intrinsicContentSize 이하로 작아지기 | intrinsicContentSize 이상으로 커지기 |
모든 label들은 HuggingPriority/CompressionResistancePriority 순으로 숫자가 작성될 것이다.
왼쪽 label의 hugging priority가 더 높으므로 content size만큼 최대 size 설정이 된다. 따라서 남은 영역은 오른쪽 label의 content size가 얼마가 되든 신경쓰지 않고 오른쪽 label이 차지하게 된다.
문제는 두번째처럼 왼쪽 label의 contents 양이 많아져 size 크기도 커지는 경우다.
오른쪽 label은 영역 설정 우선순위에서 밀리거나 동일하므로 자기 영역을 지켜내지 못한다.
해결하기 위해선 왼쪽 label의 hugging priority를 더 낮춰서 오른쪽 label의 최대 영역 설정을 잡도록 하든가,
아니면 오른쪽 label의 compression priority를 높인다.
이 경우, 오른쪽 label은 content size만큼 최소 size를 가질 수 있다. 따라서 남은 영역은 왼쪽 label이 차지한다. 다만 최대 크기만큼 가질 수 없게 되었으므로 label의 contents를 말줄임표로 나타낸다.
이번엔 왼쪽 label의 compression priority를 높게 설정했다. 왼쪽 label은 content size만큼의 최소 size를 확보했기에 나머지 영역은 오른쪽 label이 차지한다. 다만 오른쪽 label은 size 설정 우선순위에서 동일하거나 밀리기에 content size를 다 표시할 수 없어 말줄임표로 나타난다.
왼쪽 label의 contents 양이 늘어나 size가 커지는 경우, 해당 size만큼 최소 size를 설정해야 하므로 무조건 해당 영역이 보장되어야 한다. 따라서 오른쪽 label은 그만큼 줄어들거나 화면 밖으로 사라질 수도 있다.
해결하기 위해선 마찬가지로 왼쪽 label의 compression priority를 낮춰서 오른쪽 label의 최소 영역을 보장해주는 방법을 고려해야한다.
오른쪽 label의 hugging priority를 높여도 왼쪽 label에게 큰 의미가 없다.
어차피 오른쪽 label의 최대 size가 content size이므로 오른쪽 label의 size는 그보다 작아져도 상관없다. 왼쪽 label은 자신의 content size보다 커지기만 할 뿐이기에.
오른쪽 label의 contents가 늘어나 영역 차지에서 왼쪽 label을 역전할 때, compression priority는 최소 영역을 보존해주는 역할을 해준다. 이 경우는 위의 세번째 상황 해결책과 동일한 상황을 나타낸다.