Trouble Shooting

[AutoLayout] StackView에서 내가 원하는 컴포넌트를 크게 하고 싶을 때 - iOS

나른한코딩 2021. 10. 13. 11:38

 

 

 

 

저는 주로 모두 비율을 똑같이 배치할 때 스택뷰를 사용합니다.

그런데 아래 사진과 같이 같은 컴포넌트들을 배치하여 스택뷰에 넣었을 때 가끔 문제가 발생합니다.

 

 

 

stackView

 

 

위의 사진에서 보면 저는 Title이 아닌 Overview 레이블을 크게 만들고 싶었습니다. 

그런데 스택뷰로 묶고 난 직후에 보면 위와 같이 묶입니다!

(보기좋게 레이블 별로 background색상을 추가해보았습니다)

 

 

 

 

이럴때 조절해주어야 하는 속성이

인터페이스 빌더에 있는

Content Hugging Priority,

Content Compression Resistance Priority

입니다!

 

 

 

이름만 보면 뭔말이야 싶죠..?

두 속성에 대해 간단한 설명을 적어본 후 

아래쪽에 해결방법을 적어두었습니다.

(결과만 보고싶으신 분들은 아래쪽으로 스크롤해보세요!)

 

 


 

 

두 priority의 관계는

이 그림을 보면 조금은 감이 오실겁니다 :)

 

content hugging & compression resistance priority

 

두 속성을 설명하려면 우선 알아야할 개념이 하나 있습니다.

 

IntrinsicContentSize

대부분의 뷰(UILabel, UIButton, UIImagView 등)는 컨텐츠 고유의 사이즈를 가집니다.

이 고유 사이즈를 intrinsic size 라고 합니다.

예를 들어 우리가 레이블을 만들 때 직접 height, width를 지정해주지 않아도 되는 이유가 바로 고유 사이즈가 있기 때문입니다.

뷰 안에 표시되는 내용이 변경될 때 intrinsic size도 변경됩니다!

 

하지만!

컨테이너 역할을 하는 UIView와 같은 일부 뷰들은 고유 사이즈가 없기 때문에

centerX, centerY를 해주었을 떄 제약조건 위배 오류가 나므로,

height, width와 같은 속성을 추가로 지정해 주어야 합니다.

 

 

 

 

 

 


Content Hugging Priority

고유 사이즈의 최대 크기에 제한을 두는 것입니다.

즉,

"주어진 크기보다 작아질 수 있어~"

라는 의미입니다.

 

예를들어 label 두 개를 스텍뷰로 묶어 다음과 같이 구성해보겠습니다.

stackview 구성하기

 

label1의 content priority

묶은 직후의 우선순위 입니다.

레이블1과 레이블2는 Horizontal하게 묶여 있으므로

'레이블1'의 Horizontal Hugging을 +1 하면

 

 

 

 

 

 

 

label1의 horizontal hugging + 1

'레이블1'이 컨텐츠 사이즈에 딱 맞게 hugging 되어 있는 것을 볼 수 있습니다. (최소 intrinsic size 까지)

 

 

 

 


 

Compression Resistance Priority

고유 사이즈의 최소 크기에 제한을 두는 것입니다.

즉,

"주어진 크기보다 커질 수 있어~"

라는 의미입니다.

 

 

 

똑같이 예를 들어 두 개의 레이블을 준비했습니다.

현재는 제약조건을 주어 두번째 레이블의 글씨가 ...의 형태로 잘려있는것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

이때 두번째레이블의 Horizontal Compression Resistance를 +1 해주면

위와 같이 두번째 레이블이 잘리지 않고 출력되는 것을 볼 수 있습니다.

즉, 두번째레이블의 우선순위를 +1 함으로써

두번째레이블의 최소크기에 제한을 두는 것입니다.

(최소한 컨텐츠의 크기만큼 차지하도록!)

 

 

 

 

 

 

 

 

 

반대로

Horizontal Compression Resistance를 -1 해주면

위와 같이 첫번째 레이블이 잘리지 않게 출력되고,

두번째 레이블을 다시 잘리는 모습을 볼 수 있습니다!

 

 

 

 

문제 해결

 

그래서 포스트 가장 초반에 언급했던 문제를 다시 상기시켜보면,

 

stackview components size

저는

Title을 Label의 intrinsic size(DateLabel 처럼)로 만들고,

Overview를 stackView의 나머지를 차지하도록(사진 속 TitleLabel의 크기처럼)

만들고자 했습니다.

 

 

 

stackView가 Vertical하게 구성되어있으므로,

OverView의 Vertical Hugging Priority를 하나 낮추면!

 

짜잔~ 🤸

 

제가 원하던대로

Title, Date는 Label의 기본 높이로,

stackView에서 Title, Date Label의 높이와 spacing을 제외한 나머지 높이는 Overview의 높이가 되었습니다!

 

 

 

 

위의 글이 이해가 잘 안되신다면

우선 auto-layout에 대한 개념부터 이해하고 오시면 좋을 것 같습니다!

 

조금 오래되었지만 애플 개발자 사이트에 있는 Auto Layout Guide 입니다. 참고해보세요 :)

https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html

 

Auto Layout Guide: Understanding Auto Layout

 

developer.apple.com

 

 

 

 

그럼 오늘의 글은 여기까지!

생각보다 정리하는데 오래걸렸네요..😇

 

다음엔 비슷한 상황이 발생해도 헷갈리지 않으려 적다보니,

약간 제 상황 위주로 정리가 된 것 같기도하네요!

그래도 이 글을 보시는 분들이 조금이라도 도움이 되셨으면 좋겠습니다!

 

그럼 20000~

 

 

 

 

 

 

 

 

 

 

 

 

틀린부분이 있거나, 더 좋은 방법이 있다면 댓글로 남겨주세요! 
🌈댓글은 언제나 환영입니다🙏🏻

 

 

 

 

 

 

참고자료

더보기
반응형