개발콩블로그

[iOS] Hugging Priority, Compression Resistance Priority 본문

iOS

[iOS] Hugging Priority, Compression Resistance Priority

devBean 2025. 1. 13. 21:43

안녕하세요!

개발콩입니다. 오늘은 Hugging Priority, Compression Resistance Priority에 대해서 알아보도록 하겠습니다!!

 

 

먼저 이 두 개념이 왜 필요한지 알기 위해서는 intrinsicContentSize에 대해 먼저 이야기 하겠습니다.

 

 

intrinsicContentSize란

뷰 자체의 속성만을 고려하여 수신 뷰의 "natural size"를 나타냅니다.

👉 뷰 자체의 속성만을 고려하여 레이아웃 시스템에 제공되는 뷰의 "고유 크기"를 정의하는 것

 

대표적으로 UILabel, UIButton, UISwitch, UITextField가 있습니다.

 

intrinsicContentSize를 가지는 View

 

위의 4가지의 View는 width, height을 설정하지 않아도 intrinsicContentSize로 자동으로 설정되는 것을 볼 수 있습니다.

 

 

 

Hugging Priority, Compression Resistance Priority를 왜 알아야할까?

우리는 특히, UILabel의 width를 지정해 주지 않은 체로 AutoLayout을 잡게될 경우

UILabel의 text의 길이에 따라 width가 정의되는 경험을 한 적이 있습니다.

하지만, 만약 두 개의 UILabel의 horizontal layout이 서로를 계산하고 있는 상황이면 어떻게 될까요?

 

 

노랜색 UILabel은 민트색 UILabel과 서로 20의 간격을 유지하고 싶습니다.

하지만 두 UILabel은 고유의 사이즈 width를 갖고 있는 상태이기 때문에 원하는 20의 간격을 맞출 수 없는 상황입니다.

바로 이때, Hugging Priority, Compression Resistance Priority를 이용할 수 있습니다.

 

 

 

Hugging Priority란?

View가 본래 크기보다 커지는 것을 방지하는 우선 순위를 설정하는 것

즉, 공간이 남을 때 무엇이 커질 지, 유지할지 결정하는 것

 

언제 필요할까?

노랜색 UILabel과 민트색 UILabel은 서로 20의 간격을 유지하고 싶습니다.

하지만 두 UILabel은 고유의 사이즈 width를 갖고 있는 상태이기 때문에 원하는 20의 간격을 맞출 수 없는 상황입니다.

이렇게 공간이 남을 경우본래의 크기보다 커지는 것을 방지하는 우선순위를 설정하는 것입니다.

 

 

위의 사진에서 노란색 UILabel의 Hugging Priority를 민트색 UILabel보다 높은 값으로 설정하겠습니다.

 

 

노란색 UILabel은 본인의 고유 크기를 잘 유지하고 있고, 민트색 UILabel은 본인의 고유 크기보다 커진 것을 볼 수 있습니다.

👉 Hugging Priority가 높다는 것은 난 내 크기 유지하겠다. 다른 UILabel이 고유 크기를 포기해서라도 키워라!

 

 

 

 

Compression Resistance Priority란?

뷰가 본래 크기보다 작아지는 것을 방지하는 우선순위를 설정하는 것

즉, 공간이 부족할 때 무엇이 줄어들고 유지할지 결정하는 것

 

언제 필요할까?

UILabel의 간격은 아래와 같이 주어진 상황입니다.

 

 

하지만, 두 UILabel은 고유의 사이즈 width가 너무 크기 때문에

공간이 부족하여 원하는 20의 간격을 맞출 수 없는 상황입니다.

 

이렇게 공간이 부족한 경우 본래의 크기보다 커지는 것을 방지하는 우선순위를 설정하는 것입니다.

 

 

 

위의 사진에서 노란색 UILabel의 Compression Resistance Priority를 민트색 UILabel보다 높은 값으로 설정하겠습니다.

 

노란색 UILabel은 본인의 고유 크기를 잘 유지하고 있고, 민트색 UILabel은 본인의 고유 크기보다 작아 진 것을 볼 수 있습니다.

👉 Compression Resistance Priority가 높다는 것은 난 내 크기 유지하겠다. 다른 UILabel이 고유 크기를 포기해서라도 작게해라!

 

 

 

제 결론 및 느낀점

Hugging Priority, Compression Resistance Priority를 고려하는 기준을 다음과 같이 잡으면 좋을 것 같습니다.

  • 두 개 이상의 UILabel이 서로를 기준으로 Layout을 잡는가?
  • UILabel의 width를 지정하지 않고 intrinsicContentSize로 설정되어있는가?
  • 두 UILabel의 text의 값이 빈번하게 바뀌어 intrinsicContentSize가 계속 바뀌는가?

이 3가지의 기준에 부합한다면 Hugging Priority, Compression Resistance Priority를 고려해야할 것 같습니다.

 

공간이 남는 경우에는 - Hugging Priority를 고려하고

공간이 부족한 경우에는 - Compression Resistance Priority를 고려할 것 같습니다.

 

하지만, 시간과 날짜와 같이 일정한 길이의 text가 들어오게 될 경우에는

고정된 width를 주는 것이 조금 더 직관적이고 쉬운 방법이라고 생각합니다.

 

Hugging Priority, Compression Resistance Priority를 사용하는 것은 물론 좋지만

상황에 따라 적절하게 잘 적용하는 것이 더 현명할 것 같습니다.