답변:
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
-[NSString sizeWithFont : forWidth : lineBreakMode :]는 무엇입니까?
이 질문에 답이있을 수도 있습니다.
2014 년에는 아래 Norbert의 매우 유용한 의견을 바탕으로이 새 버전으로 편집했습니다! 이것은 모든 것을한다. 건배
// yourLabel is your UILabel.
float widthIs =
[self.yourLabel.text
boundingRectWithSize:self.yourLabel.frame.size
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{ NSFontAttributeName:self.yourLabel.font }
context:nil]
.size.width;
NSLog(@"the width of yourLabel is %f", widthIs);
self.yourLabel.intrinsicContentSize
이것은 레이블 내용의 크기를 제공하므로 너비를 얻을 수 있습니다.
yourLabel.intrinsicContentSize.width
아래 큰, 체크 대답을 사용할 수 있습니다.
선택한 답변은 iOS 6 이하에서 정확합니다.
아이폰 OS 7 년 sizeWithFont:constrainedToSize:lineBreakMode:
되었습니다 되지 않습니다 . 이제 사용하는 것이 좋습니다 boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
반환 값은 a가 CGRect
아닙니다 CGSize
. 잘만되면 그것은 iOS 7에서 그것을 사용하는 사람들에게 도움이 될 것입니다.
iOS8에서 sizeWithFont는 더 이상 사용되지 않습니다.
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
sizeWithAttributes에 원하는 모든 속성을 추가 할 수 있습니다. 설정할 수있는 다른 속성 :
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
등등. 그러나 아마도 당신은 다른 사람들이 필요하지 않을 것입니다
Swift 4 제약 조건을 사용하는 사람에게 답변
label.text = "Hello World"
var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
Swift 5 제약 조건을 사용하는 사람에게 답변
label.text = "Hello World"
var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
다음은 Aaron의 링크를 포함하여 다른 SO 게시물 몇 가지 원칙을 적용한 후에 생각해 낸 것입니다.
AnnotationPin *myAnnotation = (AnnotationPin *)annotation;
self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
self.backgroundColor = [UIColor greenColor];
self.frame = CGRectMake(0,0,30,30);
imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
imageView.frame = CGRectMake(3,3,20,20);
imageView.layer.masksToBounds = NO;
[self addSubview:imageView];
[imageView release];
CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
CGRect newFrame = self.frame;
newFrame.size.height = titleSize.height + 12;
newFrame.size.width = titleSize.width + 32;
self.frame = newFrame;
self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
self.layer.borderWidth = 3.0;
UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
infoLabel.text = myAnnotation.title;
infoLabel.backgroundColor = [UIColor clearColor];
infoLabel.textColor = [UIColor blackColor];
infoLabel.textAlignment = UITextAlignmentCenter;
infoLabel.font = [UIFont systemFontOfSize:12];
[self addSubview:infoLabel];
[infoLabel release];
이 예제에서는 텍스트 크기에 따라 UILabel의 크기를 조정하는 MKAnnotation 클래스에 사용자 정의 핀을 추가합니다. 또한 뷰의 왼쪽에 이미지를 추가하므로 이미지와 패딩을 처리하기 위해 적절한 간격을 관리하는 코드가 있습니다.
핵심은 CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
뷰의 치수 를 사용 하고 재정의하는 것입니다. 이 논리를 모든보기에 적용 할 수 있습니다.
Aaron의 답변은 일부에게는 효과가 있지만 나에게는 효과가 없었습니다. 이미지와 크기 조정이 가능한 UILabel을 사용하여보다 역동적 인보기를 원한다면 다른 곳으로 가기 전에 즉시 시도해야하는 훨씬 자세한 설명입니다. 나는 이미 당신을 위해 모든 일을했습니다!
[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];