질문에 프로그래밍 방식으로 설명되어 있지만 동일한 문제가 발생했으며 Interface Builder에서 작업하는 것을 선호하지만 Interface Builder 솔루션으로 기존 답변에 추가하는 것이 유용 할 수 있다고 생각했습니다.
첫번째는 잊어 버리는 것입니다 sizeToFit
. 자동 레이아웃은 본질적인 콘텐츠 크기에 따라 사용자를 대신하여이를 처리합니다.
문제는 자동 레이아웃으로 콘텐츠에 맞게 레이블을 얻는 방법입니다. 구체적으로-질문에 언급되어 있기 때문에-높이. 너비에도 동일한 원칙이 적용됩니다.
높이가 41px로 설정된 UILabel 예제로 시작해 보겠습니다.
위의 화면에서 볼 수 있듯이 "This is my text"
위와 아래에 패딩이 있습니다. 그것은 UILabel의 높이와 내용, 텍스트 사이에 채워집니다.
시뮬레이터에서 앱을 실행하면 똑같은 것을 볼 수 있습니다.
이제 Interface Builder에서 UILabel을 선택하고 크기 관리자에서 기본 설정을 살펴 보겠습니다.
위의 강조 표시된 제약 조건에 유의하십시오. 그것이 콘텐츠 포옹 우선 순위 입니다. Erica Sadun은 훌륭한 iOS 자동 레이아웃 Demystified 에서 설명했듯이 다음과 같습니다.
뷰가 핵심 콘텐츠 주위에 추가 패딩을 피하기를 선호하는 방식
우리에게 UILabel의 핵심 내용은 텍스트입니다.
여기서 우리는이 기본 시나리오의 핵심에옵니다. 우리는 텍스트 레이블에 두 가지 제약 조건을 부여했습니다. 충돌합니다. "높이는 41 픽셀 높이와 같아야합니다" 라고 말합니다 . 다른 사람은 "여기에 뷰를 숨겨서 추가 패딩이 없도록한다"고 말합니다 . 이 경우 뷰를 텍스트 로 포옹하여 추가 패딩이 없도록하십시오.
이제 자동 레이아웃을 사용하면 서로 다른 작업을 수행하는 두 가지 명령으로 런타임에서 하나를 선택해야합니다. 둘 다 할 수는 없습니다. UILabel의 모두 41 픽셀 높이 될 수 및 패딩이 없다.
이를 해결하는 방법은 우선 순위를 지정하는 것입니다. 한 명령은 다른 명령보다 우선 순위가 높아야합니다. 두 명령어가 다른 말을하고 동일한 우선 순위를 가지면 예외가 발생합니다.
자 이제 가자. 내 높이 제약 조건의 우선 순위가 1000 되고, 필요를 . 콘텐츠 포옹 높이는 250 이며 약 합니다. 높이 제한 우선 순위를 249로 줄이면 어떻게됩니까 ?
이제 우리는 마법의 시작을 볼 수 있습니다. 시뮬레이션을 해보자 :
대박! 콘텐츠 포옹이 달성되었습니다. 높이 우선 순위 ( 249) 가 콘텐츠 포옹 우선 순위 ( 250) 보다 작기 때문에 만 . 기본적으로 나는 "여기에 지정하는 높이가 콘텐츠 포옹에 지정한 높이보다 덜 중요합니다"라고 말합니다 . 따라서 콘텐츠 포옹이 승리합니다.
결론은 텍스트에 맞게 레이블을 얻는 것이 높이 또는 너비 제약 조건을 지정하는 것만 큼 간단하고 해당 축의 내용 포옹 우선 순위 제약 조건과 관련하여 해당 우선 순위를 올바르게 설정하는 것입니다.
독자를위한 운동으로 너비와 동등한 작업을 수행합니다!
label.sizeToFit()
Xcode / viewController에서 사용할 필요가 없었으므로 제약 조건이 충분했습니다. Playground 에서 라벨을 만들지 않았습니다 . 지금까지 놀이터에서 작동하는 것으로 확인 된 유일한 방법은 수행하는 것입니다.label.sizeToFit()