如何调整标签大小以适应文本的长度
我已经在过去的QA中find了这个解决scheme,但找不到合适的解决scheme。
有谁知道如何dynamic调整UILabel
大小以适应文本长度?
我已经上传了我不想要的(第一行)和我想要的(第二行)的屏幕截图。
我会欣赏任何线索,build议或代码示例。 谢谢。
你正在search的是UILabel方法sizeToFit
我可以尝试向您解释,但知道如何使用UILabel的最佳答案是: https : //stackoverflow.com/a/1054681/666479
Xcode 8和iOS 10
自动布局很容易做到。 不需要在代码中做任何事情。
使用自动布局
使用自动布局仅固定每个标签的顶部和左侧边缘 。 不要为宽度和高度添加约束。 视图的内在内容大小将照顾到这一点。
以下是约束条件:
码
代码没有什么特别之处。 不需要使用sizeToFit
或类似的东西。
import UIKit class ViewController: UIViewController { @IBOutlet weak var labelOne: UILabel! @IBOutlet weak var labelTwo: UILabel! @IBOutlet weak var labelThree: UILabel! @IBAction func changeTextButtonTapped(_ sender: UIButton) { labelOne.text = "David" labelTwo.text = "met" labelThree.text = "her" } }
笔记
- 这个答案已经被Xcode 8,iOS 10和Swift 3重新testing过了。
- 如果你想多行resize,请参阅我的其他答案 。
- 感谢这个答案让我走上正轨。
使用这个扩展的UILabel
类:
// // UILabelExtended.h // // Created by Prateek on 6/18/11. #import <Foundation/Foundation.h> /* ********************************************************************************************** This class inherit the class UILabel and extend the features of UILabel. ********************************************************************************************** */ @interface UILabelExtended : UILabel { __unsafe_unretained id customDelegate; id objectInfo; SEL selector; } @property (nonatomic,assign) SEL selector;; @property (nonatomic,assign) id customDelegate; @property (nonatomic,retain) id objectInfo; @end @interface UILabel(UILabelCategory) - (void)setHeightOfLabel; - (void)setWidthOfLabel; - (void)setHeightOfLabelWithMaxHeight:(float)maxHeight; - (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ; @end
UILabelExtended.m
// // Created by Prateek on 6/18/11. // #import "UILabelExtended.h" @implementation UILabelExtended @synthesize selector,customDelegate, objectInfo; - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if(self.selector) if([self.customDelegate respondsToSelector:self.selector]) { [self.customDelegate performSelector:self.selector withObject:self]; return; } } - (void)dealloc { self.customDelegate = nil; self.selector = NULL; self.objectInfo = nil; } @end @implementation UILabel(UILabelCategory) - (void)setHeightOfLabel { UILabel* label = self; //get the height of label content CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { frame.size.height = height; } else { frame.size.height = 0; } label.frame = frame; } - (void)setWidthOfLabel { UILabel* label = self; //get the height of label content CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { frame.size.width = width+5; } else { frame.size.width = 0; } label.frame = frame; } - (void)setHeightOfLabelWithMaxHeight:(float)maxHeight { UILabel* label = self; //get the height of label content CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { if (height > maxHeight) { frame.size.height = maxHeight; } else { frame.size.height = height; } } else { frame.size.height = 0; } label.frame = frame; } - (void)setWidthOfLabelWithMaxWidth:(float)maxWidth { UILabel* label = self; //get the height of label content CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width; //set the frame according to calculated height CGRect frame = label.frame; if([label.text length] > 0) { if (width > maxWidth) { frame.size.width = maxWidth; } else { frame.size.width = width; } } else { frame.size.width = 0; } label.frame = frame; } @end
使用方法:1)设置
UILabel
文本2)[yourLBLObj setHeightOfLabel];
或[yourLBLObj setWidthOfLabel];
它会根据文字自动设置高度或宽度。
您只需计算string大小的UILabel
宽度,请尝试使用此简单代码设置UILabel
大小
// Single line, no wrapping; CGSize expectedLabelSize = [string sizeWithFont:yourFont]; // you get width,height in expectedLabelSize; //expectedLabelSize.width,expectedLabelSize.height
尝试这个
NSString *text1 = [NSString stringWithFormat:@"%@",commentText]; CGSize constraint1 = CGSizeMake(280, 2000); CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap]; UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ; lblComment.lineBreakMode = UILineBreakModeWordWrap; lblComment.numberOfLines = size1.height/15; [lblComment setFont:[UIFont systemFontOfSize:12]]; lblComment.text = text1; lblComment.tag = shareObjC.userId; [lblComment setNeedsDisplay]
您可以使用这段代码来计算标签宽度并进行设置
CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize];
//你可以从expectedLabelSize中获取宽度高度并相应地设置
目前正在使用IOS-8,并且我对@Suragch做了很小的修改(需要使用自动布局来完成这个工作)
以下是结果中的步骤和屏幕截图:
- 将textview放在UIView中,而不是直接在storyboard的content-view中
- 从故事板禁用textview的滚动
- 添加领导和顶部的约束,因为我已经添加到查看下面的截图(拖尾约束是可选的,但我已经添加)
不需要在swift中添加代码,这可以在故事板本身完成。
结果: