programing

UILabel sizeToFit은 자동 레이아웃 ios6에서 작동하지 않습니다.

linuxpc 2023. 7. 10. 22:08
반응형

UILabel sizeToFit은 자동 레이아웃 ios6에서 작동하지 않습니다.

높이가 텍스트에 따라 달라지는 UI 레이블을 프로그래밍 방식으로(어떤 방식으로) 구성하려면 어떻게 해야 합니까?스토리보드와 코드를 조합해 설정해봤지만 소용이 없었습니다.이 가추는천하모를 추천합니다.sizeToFit을 설정하는 동안lineBreakMode그리고.numberOfLines 그 하만지에 코를넣더도라드그도▁however▁in넣라더,▁that.viewDidLoad:,viewDidAppear:또는viewDidLayoutSubviews저는 그것을 작동시킬 수가 없어요.상자를 너무 작게 만들어서 긴 텍스트가 자라지 않게 하거나 너무 크게 만들어서 줄어들지 않게 하거나 둘 중 하나입니다.

대부분경우 Matt의 솔루션은 예상대로 작동합니다.하지만 그게 당신에게 효과가 없다면, 더 읽어주세요.

레이블의 높이 크기를 자동으로 조정하려면 다음 작업을 수행해야 합니다.

  1. 레이블에 대한 레이아웃 제약 조건 설정
  2. 낮은 우선순위로 높이 제약 조건을 설정합니다.내용 압축 저항 우선 순위보다 낮아야 합니다.
  3. 라인 수 설정 = 0
  4. 내용 설정레이블의 높이 우선순위보다 높은 포옹 우선순위
  5. 레이블의 기본 MaxLayoutWidth를 설정합니다.이 값은 레이블에서 높이를 계산하는 데 사용됩니다.

예:

self.descriptionLabel = [[UILabel alloc] init];
self.descriptionLabel.numberOfLines = 0;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.descriptionLabel.preferredMaxLayoutWidth = 200;

[self.descriptionLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:self.descriptionLabel];

NSArray* constrs = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[descriptionLabel_]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)];
[self addConstraints:constrs];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[descriptionLabel_]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
[self.descriptionLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[descriptionLabel_(220@300)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];

인터페이스 작성기 사용

  1. 네 가지 제약 조건을 설정합니다.높이 제한은 필수 사항. enter image description here

  2. 하여 줄 0으로 합니다.enter image description here

  3. 하여 수직 내용. 내용 저항Priority.포옹 우선순위 및 수직 콘텐츠 압축 저항 우선순위.
    enter image description here

  4. 높이 제약 조건을 선택하고 편집합니다.
    enter image description here

  5. 또한 높이 제약 우선순위를 줄입니다.
    enter image description here

맛있게 드세요 :)

iOS 6에서는 자동 레이아웃을 사용하여 UILabel의 측면(또는 너비)과 상단이 핀으로 고정되어 있으면 코드가 전혀 없고 압축 저항 등을 방해하지 않고 내용에 맞게 자동으로 증가하고 축소됩니다.그것은 아주 간단합니다.

더 복잡한 경우에는 레이블을 설정합니다.preferredMaxLayoutWidth.

어느 쪽이든, 옳은 일은 자동적으로 일어납니다.

질문에 프로그래밍 방식으로 동일한 문제가 발생하고 인터페이스 빌더에서 작업하는 것을 선호한다고 명시되어 있지만, 인터페이스 빌더 솔루션을 사용하여 기존 답변에 추가하는 것이 유용할 수 있다고 생각했습니다.

는 첫번는잊는것입다니리어버째다것니입▁forget▁the▁to를 잊어버리는 것입니다.sizeToFit자동 레이아웃은 고유 콘텐츠 크기를 기준으로 사용자 대신 이 문제를 처리합니다.

따라서 문제는 자동 레이아웃으로 레이블의 내용에 맞는 레이블을 얻는 방법입니다.특히 - 질문에 언급되어 있기 때문에 - 높이.너비에도 동일한 원리가 적용됩니다.

먼저 높이가 41px로 설정된 UI 레이블의 예를 살펴보겠습니다.

enter image description here

에서 볼 수, 위의화그볼수있듯이서에립,"This is my text"위쪽과 아래쪽에 패딩이 있습니다.이것은 UI 레이블의 높이 사이에 있는 패딩이며, 내용, 텍스트입니다.

시뮬레이터에서 앱을 실행하면 동일한 것을 볼 수 있습니다.

enter image description here

이제 Interface Builder에서 UI 레이블을 선택하고 Size Inspector에서 기본 설정을 살펴보겠습니다.

enter image description here

위에 강조 표시된 제약 조건에 유의하십시오.그것이 콘텐츠 포옹 우선순위입니다.Erica Sadun이 훌륭한 iOS 자동 레이아웃 Demystified에서 설명했듯이, 이것은 다음과 같습니다.

뷰가 핵심 콘텐츠 주변의 추가 패딩을 피하는 방식

UILabel을 사용하는 우리에게 핵심 내용은 텍스트입니다.

여기서 우리는 이 기본 시나리오의 핵심에 도달합니다.우리는 텍스트 레이블에 두 가지 제약 조건을 부여했습니다.그들은 갈등합니다.하나는 "높이는 41픽셀 높이와 같아야 합니다"라고 말합니다.다른 하나는 "추가 패딩이 없도록 뷰를 만족스럽게 유지합니다."라고 말합니다.우리의 경우, 여분의 패딩이 없도록 뷰를 텍스트로 안아주세요.

이제 자동 레이아웃을 사용하면 다른 작업을 수행한다는 두 가지 지침을 사용하여 런타임에서 하나 또는 다른 하나를 선택해야 합니다.둘 다 할 수는 없습니다.UI 레이블은 41픽셀 높이일 수 없으며 패딩이 없을 수도 있습니다.

이 문제를 해결하는 방법은 우선 순위를 지정하는 것입니다.한 명령어는 다른 명령어보다 우선 순위가 높아야 합니다.두 지침이 서로 다른 내용을 말하고 우선 순위가 같을 경우 예외가 발생합니다.

그럼 한번 해보죠.나의 키 제한은 우선순위가 1000으로 필요합니다.내용물 포옹 높이는 250으로 약합니다.높이 제한 우선순위를 249로 줄이면 어떻게 됩니까?

enter image description here

이제 우리는 마법이 일어나기 시작하는 것을 볼 수 있습니다.SIM을 사용해 보겠습니다.

enter image description here

아주 좋아요!콘텐츠 포옹 달성.오직 키 우선순위 249가 콘텐츠 포옹 우선순위 250보다 작기 때문입니다.기본적으로, 는 "가 여기서 지정한 높이는 내가 포옹하는 내용에 대해 지정한 것보다 덜 중요하다"고 말하고 있습니다.그래서 포옹하는 내용이 승리합니다.

결론적으로 높이 또는 너비 제약 조건을 지정하고 해당 축의 내용 포옹 우선순위 제약 조건과 관련하여 해당 우선순위를 올바르게 설정하면 레이블이 텍스트에 맞게 됩니다.

독자들을 위한 연습으로 폭에 대해 동등한 것을 하는 것을 떠날 것입니다!

IOS7 sizeToFit도 작동하지 않았습니다. 아마도 솔루션도 도움이 될 것입니다.

[textView sizeToFit];
[textView layoutIfNeeded];

레이블의 기본 설정 MaxLayoutWidth를 레이블의 너비와 동기화하기 위한 다른 옵션은 다음과 같습니다.

#import "MyLabel.h"

@implementation MyLabel

-(void)setBounds:(CGRect)bounds
{
    [super setBounds:bounds];

    // This appears to be needed for iOS 6 which doesn't seem to keep
    // label preferredMaxLayoutWidth in sync with its width, which 
    // means the label won't grow vertically to encompass its text if 
    // the label's width constraint changes.
    self.preferredMaxLayoutWidth = self.bounds.size.width;
}

@end

올바른 솔루션을 찾는 데 시간이 좀 걸렸기 때문에 기여해야 한다고 생각합니다.

  • 자동 레이아웃이 sizeToFit()를 호출하지 않고 작업을 수행할 수 있도록 하는 것이 목표입니다. 올바른 제약 조건을 지정하여 이 작업을 수행합니다.
  • UIL 레이블에 맨 위, 맨 아래 및 선행/트레일링 공간 제약 조건 지정
  • 선 수 속성을 0으로 설정합니다.
  • 콘텐츠 포옹 우선 순위를 1000으로 증가
  • 콘텐츠 압축 저항 우선순위를 500으로 낮추기
  • 하단 컨테이너 제약 조건에서 우선 순위를 500으로 낮춥니다.

기본적으로 UIL 레이블에 고정된 높이 제약 조건이 있더라도 콘텐츠를 껴안기 위해 제약 조건을 해제하여 자체 크기를 작게 만들 수 있지만(예: 한 줄로 구성된 경우) 제약 조건을 해제하여 더 크게 만들 수는 없습니다.

저의 경우 (길이를 알 수 없는) UI 레이블을 포함하는 UIView 하위 클래스를 만들고 있었습니다.iOS7에서 코드는 간단했습니다: 제약 조건을 설정하고, 콘텐츠 포옹이나 압축 저항에 대해 걱정하지 않으며, 모든 것이 예상대로 작동했습니다.

그러나 iOS6에서는 UI 레이블이 항상 한 줄로 잘렸습니다.위의 어떤 대답도 저에게는 통하지 않았습니다.내용 포옹 및 압축 저항 설정이 무시되었습니다.클리핑을 방지하는 유일한 솔루션은 레이블에 선호하는 MaxLayoutWidth를 포함하는 것이었습니다.그러나 상위 뷰의 크기를 알 수 없기 때문에 선호하는 너비를 무엇으로 설정해야 할지 몰랐습니다(실제로는 내용에 따라 정의됩니다).

드디어 여기서 해결책을 찾았습니다.사용자 정의 뷰에서 작업 중이었기 때문에 다음 방법을 추가하여 제약 조건을 한 번 계산한 후 기본 레이아웃 폭을 설정한 다음 다시 계산할 수 있었습니다.

- (void)layoutSubviews
{
    // Autolayout hack required for iOS6
    [super layoutSubviews];
    self.bodyLabel.preferredMaxLayoutWidth = self.bodyLabel.frame.size.width;
    [super layoutSubviews];
}

추가했습니다.UILabel프로그래밍 방식으로 그리고 나의 경우에는 그것으로 충분했습니다.

label.translatesAutoresizingMaskIntoConstraints = false
label.setContentCompressionResistancePriority(UILayoutPriorityRequired, forAxis: .Vertical)
label.numberOfLines = 0

xCode6에서 "기본 너비"를 자동으로 설정하고 레이블 상단, 선행 및 후행을 고정하는 방법으로 해결했습니다.enter image description here

UIFont *customFont = myLabel.font;
CGSize size = [trackerStr sizeWithFont:customFont
                             constrainedToSize:myLabel.frame.size // the size here should be the maximum size you want give to the label
                                 lineBreakMode:UILineBreakModeWordWrap];
float numberOfLines = size.height / customFont.lineHeight;
myLabel.numberOfLines = numberOfLines;
myLabel.frame = CGRectMake(258, 18, 224, (numberOfLines * customFont.lineHeight));

내부 요소인 경우 UI 레이블을 하나로 포함하는 UIView 하위 클래스에서도 이 문제가 발생했습니다.자동 레이아웃 및 권장 솔루션을 모두 사용해도 레이블의 높이가 텍스트로 조여지지 않습니다.저 같은 경우에는 라벨이 한 줄이면 됩니다.

어쨌든, 제게 도움이 된 것은 UILabel에 필요한 높이 제약 조건을 추가하고 integrentContentSize가 호출될 때 수동으로 올바른 높이로 설정하는 것이었습니다.다른 UIView에 포함된 UILabel이 없는 경우 UILabel 하위 분류를 시도하고 먼저 높이 제약 조건을 설정한 다음 반환하여 유사한 구현을 제공할 수 있습니다.
[superinstraincontentSize]; [self.containerview intelicContentSize] 대신; 아래와 같이 UIView 하위 클래스에 특정합니다.

- (CGSize)intrinsicContentSize
{
    CGRect expectedTextBounds = [self.titleLabel textRectForBounds:self.titleLabel.bounds limitedToNumberOfLines:1];
    self.titleLabelHeightConstraint.constant = expectedTextBounds.size.height;
    return [self.containerView intrinsicContentSize];

}

이제 iOS 7과 iOS 8에서 완벽하게 작동합니다.

적합한 솔루션입니다. UILabel의 너비가 고정된 경우 제약 조건을 다음에서 변경합니다.constant =로.constant <=인터페이스 파일에서

enter image description here

UITableViewCell에서 레이블을 사용할 때 의 레이블 크기는 조정되지만 높이는 테이블 셀 높이를 초과합니다.이것이 저에게 효과가 있었습니다.Max MacLeod에 따라 한 다음 셀 높이가 UITableView로 설정되었는지 확인합니다.자동 치수.

init 또는 awakeFromNib에 추가할 수 있습니다.

self.tableView.rowHeight = UITableViewAutomaticDimension.  

스토리보드에서 셀을 선택하고 크기 검사기를 연 다음 '사용자 지정' 확인란을 선택하여 행 높이가 "기본값"으로 설정되었는지 확인합니다.

8.0에는 코드로 설정해야 하는 문제가 있습니다.

언급URL : https://stackoverflow.com/questions/16009405/uilabel-sizetofit-doesnt-work-with-autolayout-ios6

반응형