먼저 오토레이아웃과 Intrinsic Content Size가 무엇인지 알아야 Content Hugging Priority와 Content Compression Resistance Priority를 자세하게 알 수 있습니다.
오토레이아웃이란 Constraints를 이용해서 뷰의 위치와 크기를 동적으로 지정하는 것입니다.
동적으로 지정하는 것의 의미는 쉽게 말해 화면의 크기에 따라서 뷰의 위치나 크기가 커질 수도 있고 작아질 수도 있다는 의미입니다.
Intrinsic Content Size란 특정 객체가 원래 가지고 있는 사이즈를 의미합니다.
Intrinsic Content Size를 가지고 있는 객체는 leading 쪽만 제약을 주어도, 객체 자체에 width, height의 사이즈가 있기 때문에 에러가 발생하지 않습니다.
반대로 Intrinsic Content Size를 가지고 있지 않는 객체는 leading 쪽에만 제약을 주면 컴파일러가 객체의 width를 정확히 알 수 없으므로 오류가 발생하게 됩니다.
화면의 크기에 따라 width, height가 동적으로 늘어날 수 있기 때문입니다.
Intrinsic Content Size를 가지고 있는 객체는 다음과 같습니다
UILabel, UIButton, UISwitch, UITextField 등등...
자 이 두 가지를 염두에 두고 Content Hugging Priority와 Content Compression Resistance Priority를 보겠습니다.
Content Hugging Priority와 Content Compression Resistance Priority는 우선순위에 따라 객체의 크기를 줄이거나 늘여주는 기능입니다.
먼저 Intrinsic Content Size를 가지고 있는 두 객체가 있다고 가정하겠습니다.
A 객체에 leading, top, trailing에 Constaints를 주고
B 객체 역시 A 객체 옆에 나란히 위치하여 top, trailing에 Constraints를 주겠습니다.
이렇게 Constraints를 설정하면 문제가 발생합니다.
그 이유는 Constraints로 인해 크기가 동적으로 변화되어야 하는데 어느 객체의 Intrinsic Content Size를 깨고 동적으로 변화되게 할지 정해주지 않았기 때문입니다.
이 때 Content Hugging Priority가 사용됩니다.
Content Hugging Priority는 공간이 많이 남을 때 사용되는 기능으로, 우선순위가 낮은 것의 크기를 늘려주는 역할을 합니다.
즉, A라는 객체를 선택한 뒤, A라는 객체의 우선순위를 B보다 낮춰주면 B는 원래 크기를 유지하고 A는 늘어나게 됩니다.
마찬가지로 두 label이 존재한다고 가정하겠습니다. 이번에는 아주 긴 글이 적혀있어서 화면을 꽉 채운다고 가정하겠습니다.
A 객체에 leading, top, trailing에 Constaints를 주고
B 객체 역시 A 객체 옆에 나란히 위치하여 top, trailing에 Constraints를 주겠습니다.
역시나 이렇게 Constraints를 설정하면 문제가 발생합니다.
그 이유는 Constraints로 인해 크기가 동적으로 변화되어야 하는데 어느 객체의 Intrinsic Content Size를 깨고 동적으로 변화되게 할 지 정해주지 않았기 때문입니다.
이런 경우에 Content Compression Resistance Priority가 사용됩니다.
Content Compression Resistance Priority는 공간이 부족할 때 사용되는 기능으로, 우선순위가 낮은 것의 크기를 줄여주는 역할을 합니다.
즉, A 라는 객체를 선택하고 A 객체의 우선순위를 B 객체보다 낮춰준다면 B 객체는 원래 크기를 유지하고 A 객체는 크기가 줄어들게 됩니다.