답변:
UILabel
매우 비슷한 것을 위해 카테고리를 만든 곳에서 요점을 확인하십시오 . 내 카테고리는 UILabel
모든 내용을 보여주기 위해 높이를 늘릴 수 있습니다 : https://gist.github.com/1005520
또는이 게시물을 확인하십시오 : https://stackoverflow.com/a/7242981/662605
이것은 높이를 늘릴 것이지만 다른 방법으로 작업하기 위해 쉽게 바꿀 수 있으며 이와 같은 것으로 너비를 늘릴 수 있습니다.
@implementation UILabel (dynamicSizeMeWidth)
- (void)resizeToStretch{
float width = [self expectedWidth];
CGRect newFrame = [self frame];
newFrame.size.width = width;
[self setFrame:newFrame];
}
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);
CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
constrainedToSize:maximumLabelSize
lineBreakMode:[self lineBreakMode]];
return expectedLabelSize.width;
}
@end
클래스 sizeToFit
에서 사용할 수 있는 메소드를 더 간단하게 사용할 수 UIView
있지만 행 수를 1로 설정하여 안전합니다.
자동 레이아웃을 사용하는 경우 기본 제공 솔루션이 있습니다. 줄 수를 0으로 설정하면 프레임 워크가 텍스트에 맞게 레이블의 크기를 적절하게 조정합니다 (높이 추가).
sizeWithFont:
더 이상 사용되지 않으므로 sizeWithAttributes:
대신 사용하십시오.
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
return expectedLabelSize.width;
}
를 사용 [label sizeToFit];
하면 Daniels 카테고리에서 동일한 결과를 얻을 수 있습니다.
자동 레이아웃을 사용하고 제약 조건에 따라 레이블 크기를 조정하는 것이 좋습니다.
우리가 원한다면 UILabel
다음 자동 레이아웃과 스토리 보드 텍스트 크기에 따라 축소 및 확대해야 최선의 방법입니다. 이를 달성하기위한 단계는 다음과 같습니다.
UILabel을 뷰 컨트롤러에 넣고 원하는 위치에 배치하십시오. 또한 넣어 0
위해 numberOfLines
의 특성 UILabel
.
상단, 선행 및 후행 공간 핀 구속 조건을 지정하십시오.
Update Frame
하고를 클릭하십시오 Fix Misplacement
. 이제이 UILabel은 텍스트가 적 으면 축소되고 텍스트가 많으면 확장됩니다.이것은 다른 답변 중 일부만큼 복잡하지 않습니다.
자동 레이아웃을 사용하여 라벨의 왼쪽과 상단을 고정하는 구속 조건을 추가하십시오.
그 후 자동으로 크기가 조정됩니다.
sizeToFit
자동 레이아웃을 사용할 때 설정할 필요가 없습니다 . 예제 프로젝트에 대한 완전한 코드는 다음과 같습니다.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
@IBAction func changeTextButtonTapped(sender: UIButton) {
myLabel.text = "my name is really long i want it to fit in this box"
}
}
myLabel.preferredMaxLayoutWidth = 150 // or whatever
코드를 추가하십시오 . (또한 레이블 높이가 증가 할 때 아래로 이동하도록 단추를 레이블 아래쪽에 고정했습니다.)UITableViewCell
을 참조하십시오 .[label sizeToFit];
UILabel에서 텍스트를 조정하는 데 사용
위의 Daniel의 답변을 기반으로 몇 가지 방법을 만들었습니다.
-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX);
CGSize expectedLabelSize = [text sizeWithFont:label.font
constrainedToSize:maximumLabelSize
lineBreakMode:label.lineBreakMode];
return expectedLabelSize.height;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label
{
CGRect newFrame = label.frame;
newFrame.size.height = [self heightForLabel:label withText:label.text];
label.frame = newFrame;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
label.text = text;
[self resizeHeightToFitForLabel:label];
}
@implementation UILabel (UILabel_Auto)
- (void)adjustHeight {
if (self.text == nil) {
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
return;
}
CGSize aSize = self.bounds.size;
CGSize tmpSize = CGRectInfinite.size;
tmpSize.width = aSize.width;
tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}
@end
이것은 카테고리 방법입니다. UILabel의 높이를 조정하려면이 메소드를 호출하는 것보다 먼저 텍스트를 설정해야합니다.
텍스트 및 기타 관련 컨트롤에 따라 두 가지 방법으로 레이블 크기를 지정할 수 있습니다.
iOS 7.0 이상
CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : labelFont
}
context:nil].size;
iOS 7.0 이전에는 레이블 크기를 계산하는 데 사용할 수있었습니다
CGSize labelTextSize = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
// labelTextHeight를 기반으로 다른 컨트롤을 재구성
CGFloat labelTextHeight = labelTextSize.height;
레이블 텍스트의 크기를 계산하지 않으려면 UILabel 인스턴스에서 -sizeToFit을 다음과 같이 사용할 수 있습니다.
[label setNumberOfLines:0]; // for multiline label
[label setText:@"label text to set"];
[label sizeToFit];// call this to fit size of the label according to text
//이 후에 다른 관련 컨트롤을 재구성하기 위해 레이블 프레임을 얻을 수 있습니다.
[label sizeToFit];
viewDidLoad에 추가자동 레이아웃에 큰 문제가있었습니다. 테이블 셀 안에 두 개의 컨테이너가 있습니다. 두 번째 컨테이너는 항목 설명 (0-1000 자)에 따라 크기가 조정되며이를 기준으로 행의 크기를 조정해야합니다.
누락 된 성분은 설명에 대한 제약 조건이었습니다.
동적 요소의 하단 제약 조건을 = 0 에서 > = 0으로 변경했습니다 .
한 줄 출력을 표시 한 다음 속성 Line = 0 을 설정 하고 여러 줄 출력을 표시 한 다음 속성 Line = 1 이상 을 설정할 수 있습니다
[self.yourLableName sizeToFit];
이 접근법도 있습니다.
[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];
changeTextWithAutoHeight:width:
방법을 볼 수 없다는 것을 지적하고 싶었 습니다 UILabel
. UIKit 문서에서이 방법을 찾을 수있는 링크를 제공 할 수 있습니까?