iOS: 자동 레이아웃의 다중 줄 UI 레이블
자동 레이아웃을 사용하여 매우 기본적인 레이아웃 동작을 수행하는 데 문제가 있습니다.내 뷰 컨트롤러는 IB에서 다음과 같이 보입니다.
맨 위 라벨이 타이틀 라벨인데 몇 줄이 될지 모르겠네요.텍스트의 모든 줄을 표시하려면 제목 레이블이 필요합니다.저는 또한 다른 두 개의 라벨과 작은 이미지가 제목 바로 아래에 배치되어야 하는데, 그것이 아무리 높더라도 말입니다.레이블과 작은 이미지 사이의 수직 간격 제약 조건과 제목 레이블과 수퍼뷰 사이의 상단 간격 제약 조건 및 작은 이미지와 슈퍼뷰 사이의 하단 간격 제약 조건을 설정했습니다.흰색 UIView는 높이 제한이 없으므로 하위 뷰를 포함하기 위해 수직으로 확장되어야 합니다.제목 레이블의 줄 수를 0으로 설정했습니다.
문자열에 필요한 줄 수에 맞게 제목 레이블의 크기를 조정하려면 어떻게 해야 합니까?자동 레이아웃을 사용하고 있기 때문에 setFrame 메서드를 사용할 수 없는 것으로 알고 있습니다.또한 제목 레이블 아래(따라서 제약 조건)를 유지하려면 다른 뷰가 필요하기 때문에 자동 레이아웃을 사용해야 합니다.
어떻게 하면 이런 일을 할 수 있을까요?
사용하다-setPreferredMaxLayoutWidth
에서.UILabel
나머지는 자동 레이아웃이 처리해야 합니다.
[label setPreferredMaxLayoutWidth:200.0];
기본 MaxLayoutWidth에 대한 UI 레이블 설명서를 참조하십시오.
업데이트:
▁the됩.height
조건을 드제약의보리토스에한으로 설정합니다.Greater than or equal to
PreferredMaxLayoutWidth는 기본 설정입니다.
레이블 세트 라인 수를 0으로 확장하고, 자동 레이아웃 설정 높이를 >= x로 확장하는 것이 더 중요합니다. 나머지는 자동 레이아웃이 수행합니다.이전 요소를 기반으로 다른 요소를 포함하여 올바른 위치를 지정할 수도 있습니다.
출처: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
다중 줄 텍스트의 고유한 내용 크기
다중 줄 텍스트의 경우 UILabel 및 NStextField의 본질적인 내용 크기가 모호합니다.텍스트의 높이는 선의 너비에 따라 달라지며, 이는 제약 조건을 해결할 때 아직 결정되지 않았습니다.이 문제를 해결하기 위해 두 클래스 모두 preferredMaxLayoutWidth라는 새 속성을 가지고 있으며, 이 속성은 본질적인 내용 크기를 계산하기 위한 최대 줄 너비를 지정합니다.
우리는 보통 이 값을 미리 알지 못하기 때문에 이를 올바르게 하기 위해서는 2단계 접근이 필요합니다.먼저 Auto Layout(자동 레이아웃)이 작동하도록 한 다음, 레이아웃 패스의 결과 프레임을 사용하여 기본 설정의 최대 너비와 트리거 레이아웃을 다시 업데이트합니다.
- (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
이 경우 먼저 [super layoutSubviews]를 호출할 필요가 없습니다. layoutSubviews가 호출되면 레이블 자체에 이미 프레임이 있기 때문입니다.
뷰 컨트롤러 수준에서 이를 조정하려면 뷰DidLayoutSubviews에 연결합니다.이 시점에서 첫 번째 Auto Layout(자동 레이아웃) 패스의 프레임은 이미 설정되어 있으며, 이 프레임을 사용하여 원하는 최대 너비를 설정할 수 있습니다.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
마지막으로 레이블의 내용 압축 저항 우선순위보다 높은 우선순위를 가진 레이블에 명시적인 높이 제약 조건이 없는지 확인합니다.그렇지 않으면 내용의 계산된 높이를 초과합니다.레이블의 높이에 영향을 미칠 수 있는 모든 구속조건을 확인해야 합니다.
저는 단지 이 정확한 시나리오와 싸우고 있었지만, 필요에 따라 크기를 조정하고 아래로 이동해야 하는 뷰가 꽤 많이 있었습니다.그것은 나를 미치게 만들었지만, 나는 마침내 그것을 알아냈습니다.
핵심은 다음과 같습니다.Interface Builder는 보기를 추가하거나 이동할 때 추가 제약 조건을 추가하는 것을 좋아하며, 사용자가 눈치채지 못할 수도 있습니다.저의 경우, 저의 경우, 저는 그것과 그것의 수퍼뷰 사이의 크기를 지정하는 추가적인 제약이 있는, 기본적으로 그것을 그 지점에 고정시키는 관점을 가지고 있었습니다.즉, 그 위에 있는 어떤 것도 그 제약 조건에 어긋나기 때문에 크기를 더 크게 조정할 수 없다는 것입니다.
레이블 크기를 수동으로 조정하는 것이 이러한 경우인지 쉽게 알 수 있습니다.제가 키우게 해주나요?그렇다면 아래 라벨이 예상대로 움직입니까?크기를 조정하기 전에 다음 두 가지를 모두 선택하여 제약 조건이 보기를 이동하는 방식을 확인하십시오.
보기가 고정된 경우 아래에 있는 보기를 따르고 그 중 하나에 제약 조건을 감독할 맨 위 공간이 없는지 확인합니다.그런 다음 레이블에 대한 줄 수 옵션이 0으로 설정되어 있는지 확인하고 나머지는 이 옵션이 처리해야 합니다.
다음 사항이 필요합니다.
- 최상의 제약조건
- 선행 제약 조건(예: 왼쪽)
- 후행 제약 조건(예: 오른쪽)
- 텍스트가 짧으면 주어진 공간을 채우도록 내용 포옹 우선순위를 수평에서 낮음으로 설정합니다.
- 콘텐츠 압축 저항을 수평에서 낮음으로 설정하여 폭을 넓히는 대신 감깁니다.
- 줄 수를 0으로 설정합니다.
- 줄 바꿈 모드를 워드랩으로 설정합니다.
주제에 대한 많은 주제에서 발견된 다른 솔루션 중 어떤 것도 내 경우에 완벽하게 작동하지 않았습니다(동적인 테이블 뷰 셀의 동적 다중선 레이블 x).
방법을 찾았습니다.
레이블에 대한 제약 조건을 설정하고 다중 행 속성을 0으로 설정한 후 UILabel의 하위 클래스를 만듭니다. mine AutoLayoutLabel:
@implementation AutoLayoutLabel
- (void)layoutSubviews{
[self setNeedsUpdateConstraints];
[super layoutSubviews];
self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds);
}
@end
저는 텍스트 랩 라벨이 있는 UITableViewCell을 가지고 있습니다.저는 아래와 같이 문자 포장 작업을 했습니다.
다음과 같이 UI 레이블 제약 조건을 설정합니다.
줄 수를 0으로 설정합니다.
UITableViewCell에 UILabel 높이 제약 조건이 추가되었습니다.
@IBOutlet weak var priorityLabelWidth: NSLayoutConstraint!
UI 테이블 보기 셀에서:
priorityLabel.sizeToFit()
priorityLabelWidth.constant = priorityLabel.intrinsicContentSize().width+5
한 가지 방법은...텍스트 길이가 증가하면 다음을 사용하여 레이블 텍스트의 글꼴 크기를 변경(감소)합니다.
Label.adjustsFontSizeToFitWidth = YES;
언급URL : https://stackoverflow.com/questions/12789013/ios-multi-line-uilabel-in-auto-layout
'programing' 카테고리의 다른 글
명명되지 않은 구조체의 전달 선언 (0) | 2023.06.13 |
---|---|
Oracle clob 열에서 특정 문자열 검색 (0) | 2023.06.13 |
Firebase 메시징을 사용하여 우체부를 통해 푸시 전송 (0) | 2023.06.13 |
C++에 모든 것이 포함되어 있기 때문에 C를 배울 필요가 없다는 것이 사실입니까? (0) | 2023.06.13 |
뷰 상태 디코딩 방법 (0) | 2023.06.13 |