etc./StackOverFlow

UILabel 내에서 텍스트를 상단에 수직으로 정렬

청렴결백한 만능 재주꾼 2021. 11. 26. 06:55
반응형

질문자 :Stefan


두 줄의 텍스트를 위한 공간이 있는 UILabel 때때로 텍스트가 너무 짧으면 이 텍스트가 레이블의 세로 중앙에 표시됩니다.

UILabel 상단에 오도록 세로로 어떻게 정렬합니까?

세로 중앙에 텍스트가 있는 UILabel을 나타내는 이미지



UILabel 에 vertical-align을 설정할 수 있는 방법은 없지만 레이블의 프레임을 변경하여 동일한 효과를 얻을 수 있습니다. 무슨 일이 일어나고 있는지 명확하게 볼 수 있도록 라벨을 주황색으로 만들었습니다.

이 작업을 수행하는 빠르고 쉬운 방법은 다음과 같습니다.

 [myLabel sizeToFit]; 

sizeToFit은 레이블을 압축합니다.


하나 이상의 행을 만드는 더 긴 텍스트가 있는 레이블이 있는 경우 numberOfLines0 설정합니다(여기서 0은 행 수에 제한이 없음을 의미합니다).

 myLabel.numberOfLines = 0; [myLabel sizeToFit]; 

sizeToFit이 있는 더 긴 레이블 텍스트


더 긴 버전

무슨 일이 일어나고 있는지 볼 수 있도록 코드에서 내 레이블을 만들 것입니다. Interface Builder에서도 이 대부분을 설정할 수 있습니다. 내 설정은 여백(20포인트)을 표시하기 위해 Photoshop에서 만든 배경 이미지가 있는 보기 기반 앱입니다. 라벨은 매력적인 오렌지 색상이므로 치수가 어떻게 되는지 알 수 있습니다.

 - (void)viewDidLoad { [super viewDidLoad]; // 20 point top and left margin. Sized to leave 20 pt at right. CGRect labelFrame = CGRectMake(20, 20, 280, 150); UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame]; [myLabel setBackgroundColor:[UIColor orangeColor]]; NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral"; [myLabel setText:labelText]; // Tell the label to use an unlimited number of lines [myLabel setNumberOfLines:0]; [myLabel sizeToFit]; [self.view addSubview:myLabel]; }

sizeToFit 사용의 몇 가지 제한 사항은 가운데 정렬 또는 오른쪽 정렬 텍스트와 관련이 있습니다. 다음과 같은 일이 발생합니다.

 // myLabel.textAlignment = NSTextAlignmentRight; myLabel.textAlignment = NSTextAlignmentCenter; [myLabel setNumberOfLines:0]; [myLabel sizeToFit]; 

여기에 이미지 설명 입력

레이블의 크기는 여전히 왼쪽 상단 모서리에 고정되어 있습니다. 원래 레이블의 너비를 변수에 저장하고 sizeToFit 뒤에 설정하거나 이러한 문제를 해결하기 위해 고정 너비를 지정할 수 있습니다.

 myLabel.textAlignment = NSTextAlignmentCenter; [myLabel setNumberOfLines:0]; [myLabel sizeToFit]; CGRect myFrame = myLabel.frame; // Resize the frame's width to 280 (320 - margins) // width could also be myOriginalLabelFrame.size.width myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height); myLabel.frame = myFrame;

레이블 정렬


sizeToFit 은 초기 레이블의 최소 너비를 준수합니다. 너비가 100인 레이블로 시작하여 sizeToFit 을 호출하면 너비가 100(또는 약간 작음)인 (매우 긴) 레이블이 반환됩니다. 크기를 조정하기 전에 레이블을 원하는 최소 너비로 설정할 수 있습니다.

프레임 너비의 크기를 조정하여 올바른 레이블 정렬

기타 주의할 사항:

lineBreakMode 가 존중되는지 여부는 설정 방법에 따라 다릅니다. NSLineBreakByTruncatingTail (기본값)은 sizeToFit 이후에 무시되며 다른 두 가지 자르기 모드(head 및 middle)도 마찬가지입니다. NSLineBreakByClipping 도 무시됩니다. NSLineBreakByCharWrapping 은 평소와 같이 작동합니다. 프레임 너비는 여전히 가장 오른쪽 글자에 맞게 좁혀집니다.


Mark Amery 는 댓글에서 Auto Layout을 사용하여 NIB 및 Storyboard에 대한 수정 사항을 제공했습니다.

레이블이의 하위 뷰 같은 펜촉 또는 스토리 보드에 포함되어있는 경우 view 가 사용하는 자동 레이아웃하는의 ViewController의 다음 퍼팅 sizeToFit 에 호출 viewDidLoad 한 후 자동 레이아웃 크기와 위치 파단 것없는 일 때문에 viewDidLoad 즉시 취소됩니다라고하며, sizeToFit 호출의 효과. 그러나 viewDidLayoutSubviews 내에서 sizeToFit 을 호출하면 작동합니다.


내 원래 답변(후손/참조용):

이것은 NSString 메서드 sizeWithFont:constrainedToSize:lineBreakMode: 를 사용하여 문자열에 맞게 필요한 프레임 높이를 계산한 다음 원점과 너비를 설정합니다.

삽입하려는 텍스트를 사용하여 레이블의 프레임 크기를 조정합니다. 이렇게 하면 원하는 수의 라인을 수용할 수 있습니다.

 CGSize maximumSize = CGSizeMake(300, 9999); NSString *dateString = @"The date today is January 1st, 1999"; UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14]; CGSize dateStringSize = [dateString sizeWithFont:dateFont constrainedToSize:maximumSize lineBreakMode:self.dateLabel.lineBreakMode]; CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height); self.dateLabel.frame = dateFrame;

nevan king

  1. 새 텍스트 설정:

     myLabel.text = @"Some Text"
  2. maximum number 줄 수를 0(자동)으로 설정합니다.

     myLabel.numberOfLines = 0
  3. 레이블의 프레임을 최대 크기로 설정합니다.

     myLabel.frame = CGRectMake(20,20,200,800)
  4. sizeToFit 을 호출하여 내용이 딱 맞게 프레임 크기를 줄입니다.

     [myLabel sizeToFit]

레이블 프레임은 이제 텍스트에 맞도록 충분히 높고 넓습니다. 왼쪽 상단은 변경되지 않아야 합니다. 나는 이것을 왼쪽 상단 정렬 텍스트로만 테스트했습니다. 다른 정렬의 경우 나중에 프레임을 수정해야 할 수 있습니다.

또한 내 레이블에 줄 바꿈이 활성화되어 있습니다.


Jakob Egger

확장 솔루션 참조:

 for(int i=1; i< newLinesToPad; i++) self.text = [self.text stringByAppendingString:@"\n"];

로 대체되어야 합니다.

 for(int i=0; i<newLinesToPad; i++) self.text = [self.text stringByAppendingString:@"\n "];

UILabels ' 후행 캐리지 리턴이 무시되는 것처럼 보이기 때문에 추가된 모든 줄 바꿈에 추가 공간이 필요합니다.

마찬가지로 alignBottom도 함께 업데이트되어야 @" \n@%" 대신에 "\n@%" (사이클 초기화에 의해 대체되어야한다)도 "에 대한이 (INT 난 ... = 0".

다음 확장이 저에게 효과적입니다.

 // -- file: UILabel+VerticalAlign.h #pragma mark VerticalAlign @interface UILabel (VerticalAlign) - (void)alignTop; - (void)alignBottom; @end // -- file: UILabel+VerticalAlign.m @implementation UILabel (VerticalAlign) - (void)alignTop { CGSize fontSize = [self.text sizeWithFont:self.font]; double finalHeight = fontSize.height * self.numberOfLines; double finalWidth = self.frame.size.width; //expected width of label CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode]; int newLinesToPad = (finalHeight - theStringSize.height) / fontSize.height; for(int i=0; i<newLinesToPad; i++) self.text = [self.text stringByAppendingString:@"\n "]; } - (void)alignBottom { CGSize fontSize = [self.text sizeWithFont:self.font]; double finalHeight = fontSize.height * self.numberOfLines; double finalWidth = self.frame.size.width; //expected width of label CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode]; int newLinesToPad = (finalHeight - theStringSize.height) / fontSize.height; for(int i=0; i<newLinesToPad; i++) self.text = [NSString stringWithFormat:@" \n%@",self.text]; } @end

그런 다음 [yourLabel alignTop]; 또는 [yourLabel alignBottom]; 각 yourLabel 텍스트 할당 후.


Dmitri Sologoubenko

누군가에게 도움이 되는 경우를 대비하여 동일한 문제가 있었지만 UILabel 사용에서 UITextView 사용으로 전환하여 간단히 문제를 해결할 수 있었습니다. 기능이 약간 다르기 때문에 이것이 모든 사람을 위한 것은 아니라는 점에 감사드립니다.

UITextView 사용으로 전환하면 모든 Scroll View 속성과 User Interaction Enabled...를 끌 수 있습니다. 이렇게 하면 레이블처럼 더 많이 작동합니다.

여기에 이미지 설명 입력


jowie

소란 없어, 소란 없어

 @interface MFTopAlignedLabel : UILabel @end @implementation MFTopAlignedLabel - (void)drawTextInRect:(CGRect) rect { NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:self.text attributes:@{NSFontAttributeName:self.font}]; rect.size.height = [attributedText boundingRectWithSize:rect.size options:NSStringDrawingUsesLineFragmentOrigin context:nil].size.height; if (self.numberOfLines != 0) { rect.size.height = MIN(rect.size.height, self.numberOfLines * self.font.lineHeight); } [super drawTextInRect:rect]; } @end

소란도 없고 Objective-c도 없고 소란도 없지만 Swift 3:

 class VerticalTopAlignLabel: UILabel { override func drawText(in rect:CGRect) { guard let labelText = text else { return super.drawText(in: rect) } let attributedText = NSAttributedString(string: labelText, attributes: [NSFontAttributeName: font]) var newRect = rect newRect.size.height = attributedText.boundingRect(with: rect.size, options: .usesLineFragmentOrigin, context: nil).size.height if numberOfLines != 0 { newRect.size.height = min(newRect.size.height, CGFloat(numberOfLines) * font.lineHeight) } super.drawText(in: newRect) } }

스위프트 4.2

 class VerticalTopAlignLabel: UILabel { override func drawText(in rect:CGRect) { guard let labelText = text else { return super.drawText(in: rect) } let attributedText = NSAttributedString(string: labelText, attributes: [NSAttributedString.Key.font: font]) var newRect = rect newRect.size.height = attributedText.boundingRect(with: rect.size, options: .usesLineFragmentOrigin, context: nil).size.height if numberOfLines != 0 { newRect.size.height = min(newRect.size.height, CGFloat(numberOfLines) * font.lineHeight) } super.drawText(in: newRect) } }

jasongregori

위의 답변과 비슷하지만 옳지 않거나 코드에 찔리기 쉽기 때문에 조금 정리했습니다. 이 확장자를 자체 .h 및 .m 파일에 추가하거나 사용하려는 구현 바로 위에 붙여넣습니다.

 #pragma mark VerticalAlign @interface UILabel (VerticalAlign) - (void)alignTop; - (void)alignBottom; @end @implementation UILabel (VerticalAlign) - (void)alignTop { CGSize fontSize = [self.text sizeWithFont:self.font]; double finalHeight = fontSize.height * self.numberOfLines; double finalWidth = self.frame.size.width; //expected width of label CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode]; int newLinesToPad = (finalHeight - theStringSize.height) / fontSize.height; for(int i=0; i<= newLinesToPad; i++) { self.text = [self.text stringByAppendingString:@" \n"]; } } - (void)alignBottom { CGSize fontSize = [self.text sizeWithFont:self.font]; double finalHeight = fontSize.height * self.numberOfLines; double finalWidth = self.frame.size.width; //expected width of label CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode]; int newLinesToPad = (finalHeight - theStringSize.height) / fontSize.height; for(int i=0; i< newLinesToPad; i++) { self.text = [NSString stringWithFormat:@" \n%@",self.text]; } } @end

그런 다음 사용하려면 텍스트를 레이블에 넣은 다음 적절한 메서드를 호출하여 정렬합니다.

 [myLabel alignTop];

또는

 [myLabel alignBottom];

BadPirate

스토리보드를 사용하는 가장 쉬운 방법:

StackView에 레이블을 포함하고 속성 검사기에서 StackView의 다음 두 속성을 설정합니다.

1- Axis 에서 Horizontal ,

2- Top Alignment

여기에 이미지 설명 입력


Baig

이를 달성하는 더 빠르고 더러운 방법은 UILabel의 줄 바꿈 모드를 "Clip"으로 설정하고 고정된 양의 줄 바꿈을 추가하는 것입니다.

 myLabel.lineBreakMode = UILineBreakModeClip; myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];

이 솔루션은 모든 사람에게 적용되지는 않습니다. 특히 표시하는 줄 수를 초과하는 문자열 끝에 "..."를 계속 표시하려면 다음 중 하나를 사용해야 합니다. 더 긴 코드 비트 -- 하지만 많은 경우 필요한 것을 얻을 수 있습니다.


Purple Ninja Girl

UILabel 대신 수직 정렬 옵션이 있는 UITextField 를 사용할 수 있습니다.

 textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; textField.userInteractionEnabled = NO; // Don't allow interaction

ivanzoid

나는 오랫동안 이것으로 어려움을 겪었고 내 솔루션을 공유하고 싶었습니다.

이렇게 하면 텍스트를 0.5 배율로 자동 축소하고 텍스트를 세로 중앙에 배치 UILabel 이러한 옵션은 Storyboard/IB에서도 사용할 수 있습니다.

 [labelObject setMinimumScaleFactor:0.5]; [labelObject setBaselineAdjustment:UIBaselineAdjustmentAlignCenters];

David Greco

새 클래스 만들기

LabelTopAlign

.h 파일

 #import <UIKit/UIKit.h> @interface KwLabelTopAlign : UILabel { } @end

.m 파일

 #import "KwLabelTopAlign.h" @implementation KwLabelTopAlign - (void)drawTextInRect:(CGRect)rect { int lineHeight = [@"IglL" sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, 9999.0f)].height; if(rect.size.height >= lineHeight) { int textHeight = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, rect.size.height)].height; int yMax = textHeight; if (self.numberOfLines > 0) { yMax = MIN(lineHeight*self.numberOfLines, yMax); } [super drawTextInRect:CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, yMax)]; } } @end

편집하다

다음은 동일한 작업을 수행하는 더 간단한 구현입니다.

 #import "KwLabelTopAlign.h" @implementation KwLabelTopAlign - (void)drawTextInRect:(CGRect)rect { CGFloat height = [self.text sizeWithFont:self.font constrainedToSize:rect.size lineBreakMode:self.lineBreakMode].height; if (self.numberOfLines != 0) { height = MIN(height, self.font.lineHeight * self.numberOfLines); } rect.size.height = MIN(rect.size.height, height); [super drawTextInRect:rect]; } @end

sebastian friedrich

여기에 이미지 설명 입력

인터페이스 빌더에서

  • UILabel 을 가능한 가장 큰 텍스트 크기로 설정
  • Lines 을 '0'으로 설정

귀하의 코드에서

  • 레이블 텍스트 설정
  • 레이블에서 sizeToFit 호출

코드 조각:

 self.myLabel.text = @"Short Title"; [self.myLabel sizeToFit];

bearMountain

적응형 UI(iOS8 이상)의 경우, UILabel의 수직 정렬은 속성 noOfLines =0`을 변경하여 StoryBoard에서 설정하고

제약

  1. UILabel LefMargin, RightMargin 및 Top Margin 제약을 조정합니다.

  2. Content Compression Resistance Priority For Vertical Vertical>Horizontal 로 변경합니다.

UILabel의 제약 조건

수정됨:

 noOfLines=0

다음 제약 조건은 원하는 결과를 얻기에 충분합니다.

여기에 이미지 설명 입력


Rabindra Nath Nandi

UILabel의 하위 클래스를 만듭니다. 매력처럼 작동합니다.

 // TopLeftLabel.h #import <Foundation/Foundation.h> @interface TopLeftLabel : UILabel { } @end // TopLeftLabel.m #import "TopLeftLabel.h" @implementation TopLeftLabel - (id)initWithFrame:(CGRect)frame { return [super initWithFrame:frame]; } - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines { CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines]; textRect.origin.y = bounds.origin.y; return textRect; } -(void)drawTextInRect:(CGRect)requestedRect { CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines]; [super drawTextInRect:actualRect]; } @end

여기에서 논의된 바와 같이.


Martin Wickman

내 앱에서 내가 한 것은 UILabel의 line 속성을 0으로 설정하고 UILabel의 아래쪽 제약 조건을 만들고 아래 이미지와 같이 >= 0으로 설정되어 있는지 확인하는 것입니다. 여기에 이미지 설명 입력


Jack Tiong

이 목적을 달성하기 위해 util 함수를 작성했습니다. 당신은 볼 수 있습니다:

// 여러 줄 레이블의 높이를 조정하여 상단과 수직으로 정렬되도록 합니다.
+ (무효) alignLabelWithTop:(UILabel *)label {
  CGSize maxSize = CGSizeMake(label.frame.size.width, 999);
  label.adjustsFontSizeToFitWidth = 아니요;

  // 실제 높이 구하기
  CGSize actualSize = [label.text sizeWithFont:label.font 제약된ToSize:maxSize lineBreakMode:label.lineBreakMode];
  CGRect rect = label.frame;
  rect.size.height = 실제크기.높이;
  label.frame = 사각형;
}

.사용하는 방법? (인터페이스 빌더에서 lblHello를 생성한 경우 일부 UILabel 속성 세부 정보를 건너뜁니다.)

lblHello.text = @"Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World!";
lblHello.numberOfLines = 5;
[유틸리티 alignLabelWithTop:lblHello];

나는 또한 그것을 기사로 내 블로그에 썼습니다: http://fstoke.me/blog/?p=2819


firestoke

소개 페이지의 코드와 함께 코드를 읽는 데 시간이 걸렸고 모두 레이블의 프레임 크기를 수정하여 기본 중앙 수직 정렬이 나타나지 않도록 하는 것을 발견했습니다.

그러나 어떤 경우에는 레이블에 너무 많은 텍스트가 있더라도 레이블이 모든 공간을 차지하기를 원합니다(예: 동일한 높이의 여러 행).

여기, 내가 레이블의 끝 단순히 패드 줄 바꿈에 의해, 그것을 해결하기 위해 다른 방법을 사용 (PLS는 실제로 상속 있습니다 UILabel 하지만, 필요하지 않습니다)

 CGSize fontSize = [self.text sizeWithFont:self.font]; finalHeight = fontSize.height * self.numberOfLines; finalWidth = size.width; //expected width of label CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode]; int newLinesToPad = (finalHeight - theStringSize.height) / fontSize.height; for(int i = 0; i < newLinesToPad; i++) { self.text = [self.text stringByAppendingString:@"\n "]; }

Walty Yeung

textRect(forBounds:limitedToNumberOfLines:) 사용하십시오.

 class TopAlignedLabel: UILabel { override func drawText(in rect: CGRect) { let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines) super.drawText(in: textRect) } }

ma11hew28

여기에서 제안을 받아 UILabel을 래핑할 수 있는 보기를 만들고 크기를 조정하고 줄 수를 설정하여 위쪽에 정렬되도록 했습니다. UILabel을 하위 보기로 넣기만 하면 됩니다.

 @interface TopAlignedLabelContainer : UIView { } @end @implementation TopAlignedLabelContainer - (void)layoutSubviews { CGRect bounds = self.bounds; for (UILabel *label in [self subviews]) { if ([label isKindOfClass:[UILabel class]]) { CGSize fontSize = [label.text sizeWithFont:label.font]; CGSize textSize = [label.text sizeWithFont:label.font constrainedToSize:bounds.size lineBreakMode:label.lineBreakMode]; label.numberOfLines = textSize.height / fontSize.height; label.frame = CGRectMake(0, 0, textSize.width, fontSize.height * label.numberOfLines); } } } @end

user486646

수직 정렬을 지원 하는 TTTAttributedLabel 을 사용할 수 있습니다.

 @property (nonatomic) TTTAttributedLabel* label; <...> //view's or viewController's init method _label.verticalAlignment = TTTAttributedLabelVerticalAlignmentTop;

Andrew Romanov

이 질문에 대한 답변이 이제 약간 구식이라는 것을 알았으므로 자동 레이아웃 팬을 위해 이것을 추가합니다.

자동 레이아웃은 이 문제를 아주 간단하게 만듭니다. UIView *view 레이블을 추가한다고 가정하면 다음 코드가 이를 수행합니다.

 UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; [label setText:@"Some text here"]; [label setTranslatesAutoresizingMaskIntoConstraints:NO]; [view addSubview:label]; [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label]|" options:0 metrics:nil views:@{@"label": label}]]; [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label]" options:0 metrics:nil views:@{@"label": label}]];

intrinsicContentSize 사용하여 자동으로 계산 view 의 상단에서 수평으로 가장자리에서 가장자리까지 배치됩니다.


petehare

나는 위의 많은 방법을 사용했으며 내가 사용한 빠르고 더러운 접근 방식을 추가하고 싶습니다.

 myLabel.text = [NSString stringWithFormat:@"%@\n\n\n\n\n\n\n\n\n",@"My label text string"];

문자열의 개행 수로 인해 텍스트가 사용 가능한 세로 공간을 채우는지 확인하고 넘치는 텍스트를 자르도록 UILabel을 설정하십시오.

때로 충분히 좋은 것만으로 도 충분하기 때문 입니다.


Code Roadie

여러 줄, 최소 글꼴 크기를 가질 수 있고 부모 보기에서 가로 및 세로로 중앙에 배치되는 레이블을 원했습니다. 내 보기에 프로그래밍 방식으로 레이블을 추가했습니다.

 - (void) customInit { // Setup label self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; self.label.numberOfLines = 0; self.label.lineBreakMode = UILineBreakModeWordWrap; self.label.textAlignment = UITextAlignmentCenter; // Add the label as a subview self.autoresizesSubviews = YES; [self addSubview:self.label]; }

그리고 나서 내 레이블의 텍스트를 변경하고 싶을 때...

 - (void) updateDisplay:(NSString *)text { if (![text isEqualToString:self.label.text]) { // Calculate the font size to use (save to label's font) CGSize textConstrainedSize = CGSizeMake(self.frame.size.width, INT_MAX); self.label.font = [UIFont systemFontOfSize:TICKER_FONT_SIZE]; CGSize textSize = [text sizeWithFont:self.label.font constrainedToSize:textConstrainedSize]; while (textSize.height > self.frame.size.height && self.label.font.pointSize > TICKER_MINIMUM_FONT_SIZE) { self.label.font = [UIFont systemFontOfSize:self.label.font.pointSize-1]; textSize = [ticker.blurb sizeWithFont:self.label.font constrainedToSize:textConstrainedSize]; } // In cases where the frame is still too large (when we're exceeding minimum font size), // use the views size if (textSize.height > self.frame.size.height) { textSize = [text sizeWithFont:self.label.font constrainedToSize:self.frame.size]; } // Draw self.label.frame = CGRectMake(0, self.frame.size.height/2 - textSize.height/2, self.frame.size.width, textSize.height); self.label.text = text; } [self setNeedsDisplay]; }

그것이 누군가를 돕기를 바랍니다!


Johnus

FXLabel(github에 있음) 은 label.contentMode 를 UIViewContentModeTop 으로 설정하여 label.contentMode 합니다. 이 구성 요소는 내가 만든 것이 아니지만 자주 사용하는 구성 요소이고 기능이 많고 잘 작동하는 것 같습니다.


jjxtra

레이블 안의 텍스트가 세로 중앙에 있지 않기 때문에 이 글을 읽는 모든 사람은 일부 글꼴 유형이 동일하게 디자인되지 않았음을 염두에 두십시오. 예를 들어, zapfino 크기가 16인 레이블을 생성하면 텍스트가 수직으로 완벽하게 중앙에 배치되지 않은 것을 볼 수 있습니다.

그러나 helvetica로 작업하면 텍스트가 세로로 가운데에 맞춰집니다.


Nir Pengas

다음과 같이 UILabel을 하위 클래스로 만들고 그리기 사각형을 제한합니다.

 - (void)drawTextInRect:(CGRect)rect { CGSize sizeThatFits = [self sizeThatFits:rect.size]; rect.size.height = MIN(rect.size.height, sizeThatFits.height); [super drawTextInRect:rect]; }

줄 바꿈 패딩과 관련된 솔루션을 시도했지만 경우에 따라 잘못된 동작이 발생했습니다. numberOfLines 엉망으로 만드는 것보다 위와 같이 그리기 rect를 제한하는 것이 더 쉽습니다.

추신: 다음과 같이 UIViewContentMode를 쉽게 지원하는 것을 상상할 수 있습니다.

 - (void)drawTextInRect:(CGRect)rect { CGSize sizeThatFits = [self sizeThatFits:rect.size]; if (self.contentMode == UIViewContentModeTop) { rect.size.height = MIN(rect.size.height, sizeThatFits.height); } else if (self.contentMode == UIViewContentModeBottom) { rect.origin.y = MAX(0, rect.size.height - sizeThatFits.height); rect.size.height = MIN(rect.size.height, sizeThatFits.height); } [super drawTextInRect:rect]; }

jrc

자동 레이아웃을 사용하는 경우 코드 또는 IB에서 세로 contentHuggingPriority를 1000으로 설정합니다. IB에서는 우선 순위를 1로 설정한 다음 삭제하여 높이 제약 조건을 제거해야 할 수 있습니다.


phatmann

복잡한 작업을 수행하지 않는 한 UILabels UITextView 를 사용할 수 있습니다.

스크롤을 비활성화합니다.

텍스트를 완전히 표시하려면 사용자 sizeToFitsizeThatFits: 메서드


thesummersign

신속하게,

let myLabel : UILabel!

레이블의 텍스트를 화면에 맞게 만들고 상단에 표시하려면

myLabel.sizeToFit()

화면 너비 또는 특정 너비 크기에 맞게 레이블의 글꼴을 만듭니다.

myLabel.adjustsFontSizeToFitWidth = YES

레이블에 대한 일부 textAlignment :

myLabel.textAlignment = .center

myLabel.textAlignment = .left

myLabel.textAlignment = .right

myLabel.textAlignment = .Natural

myLabel.textAlignment = .Justified


Dara Tith

이것은 오래된 솔루션입니다. iOS >= 6에서 자동 레이아웃을 사용하십시오.

내 솔루션:

  1. 혼자서 줄 바꿈(라벨 줄 바꿈 설정 무시)
  2. 직접 선 그리기(레이블 정렬 무시)
 @interface UITopAlignedLabel : UILabel @end
 @implementation UITopAlignedLabel #pragma mark Instance methods - (NSArray*)splitTextToLines:(NSUInteger)maxLines { float width = self.frame.size.width; NSArray* words = [self.text componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSMutableArray* lines = [NSMutableArray array]; NSMutableString* buffer = [NSMutableString string]; NSMutableString* currentLine = [NSMutableString string]; for (NSString* word in words) { if ([buffer length] > 0) { [buffer appendString:@" "]; } [buffer appendString:word]; if (maxLines > 0 && [lines count] == maxLines - 1) { [currentLine setString:buffer]; continue; } float bufferWidth = [buffer sizeWithFont:self.font].width; if (bufferWidth < width) { [currentLine setString:buffer]; } else { [lines addObject:[NSString stringWithString:currentLine]]; [buffer setString:word]; [currentLine setString:buffer]; } } if ([currentLine length] > 0) { [lines addObject:[NSString stringWithString:currentLine]]; } return lines; } - (void)drawRect:(CGRect)rect { if ([self.text length] == 0) { return; } CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, self.textColor.CGColor); CGContextSetShadowWithColor(context, self.shadowOffset, 0.0f, self.shadowColor.CGColor); NSArray* lines = [self splitTextToLines:self.numberOfLines]; NSUInteger numLines = [lines count]; CGSize size = self.frame.size; CGPoint origin = CGPointMake(0.0f, 0.0f); for (NSUInteger i = 0; i < numLines; i++) { NSString* line = [lines objectAtIndex:i]; if (i == numLines - 1) { [line drawAtPoint:origin forWidth:size.width withFont:self.font lineBreakMode:UILineBreakModeTailTruncation]; } else { [line drawAtPoint:origin forWidth:size.width withFont:self.font lineBreakMode:UILineBreakModeClip]; } origin.y += self.font.lineHeight; if (origin.y >= size.height) { return; } } } @end

Sulthan

출처 : http:www.stackoverflow.com/questions/1054558/vertically-align-text-to-top-within-a-uilabel

반응형