출처 : http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
여러 줄 문자의 고유 내용 크기
UILabel 및 NSTextField의 내장 컨텐츠 크기는 여러 줄로 된 텍스트에는 모호합니다. 텍스트의 높이는 선의 너비에 따라 달라지며 구속 조건을 해결할 때 결정되지 않습니다. 이 문제를 해결하기 위해 두 클래스 모두 preferredMaxLayoutWidth라는 새로운 속성을 가지며, 이는 고유 컨텐츠 크기를 계산하기위한 최대 선 너비를 지정합니다.
우리는 일반적으로이 값을 미리 알지 못하므로이를 올바르게 달성하기 위해서는 2 단계 접근 방식이 필요합니다. 먼저 자동 레이아웃이 작동하게 한 다음 레이아웃 패스의 결과 프레임을 사용하여 원하는 최대 너비를 업데이트하고 레이아웃을 다시 트리거합니다.
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
레이블이 프레임 세트를 가져 오려면 [super layoutSubviews]에 대한 첫 번째 호출이 필요하지만 변경 후 레이아웃을 업데이트하려면 두 번째 호출이 필요합니다. 두 번째 호출을 생략하면 NSInternalInconsistencyException 오류가 발생합니다. 제약 조건을 업데이트해야하는 레이아웃 패스를 변경했지만 레이아웃을 다시 트리거하지 않았기 때문입니다.
레이블 서브 클래스 자체에서도이를 수행 할 수 있습니다.
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
이 경우 layoutSubviews가 호출 될 때 레이블 자체에 이미 프레임이 있으므로 [super layoutSubviews]를 먼저 호출 할 필요가 없습니다.
뷰 컨트롤러 수준에서이 조정을 수행하기 위해 viewDidLayoutSubviews에 연결합니다. 이 시점에서 첫 번째 자동 레이아웃 패스의 프레임이 이미 설정되어 있으며이를 사용하여 원하는 최대 너비를 설정할 수 있습니다.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
마지막으로, 레이블의 내용 압축 저항 우선 순위보다 우선 순위가 높은 레이블에 명시 적 높이 제한이 없는지 확인하십시오. 그렇지 않으면 계산 된 내용의 높이보다 우선합니다. 라벨 높이에 영향을 줄 수있는 모든 구속 조건을 확인하십시오.