天道酬勤,学无止境

调整 UILabel 的高度以适合文本(Resizing the height of UILabel to fit text)

问题

我的 Cell 子类中有 UILabel ,它应该有一个标题。 标题的大小可以是各种长度,因此我需要调整 UILabel 的大小以适应文本并防止文本过长我还需要能够设置 maxHeight。 宽度应该是一样的。 如何在 tableViewCell 子类中快速创建这样的代码?

到目前为止,我在awakeFromNib中有这个

theTitleLabel?.font = UIFont(name: "HelveticaNeue", size: 13)
theTitleLabel?.textColor = UIColor(rgba: "#4F4E4F")
theTitleLabel?.numberOfLines = 0
theTitleLabel?.lineBreakMode = NSLineBreakMode.ByTruncatingTail
回答1

最简单的方法是使用自动布局约束。 您使用的是awakeFromNib ,所以我假设您在Interface Builder(xib 或故事板文件)中的某处有该单元格。

如果可以避免,请不要在代码中设置视图。 在 Interface Builder 中进行操作要容易得多。

  1. 在界面生成器中找到您的标签并设置其属性(字体、颜色、换行模式等)。

  2. 添加宽度约束(或对左右边距的约束,具体取决于您想要的)。

  3. 添加高度约束,将其关系从= (equals)更改为< (less than)

大功告成,无需代码。

回答2
    CGSize maximumLabelSize = CGSizeMake(MAX_WIDTH, MAX_HEIGHT);
    CGSize expectedSize = [lbl sizeThatFits:maximumLabelSize];

    CGSize s = CGSizeMake(STATIC_WIDTH, expectedSize.height);
    yourLabel.frame = CGRectMake(yourLabel.frame.origin.x, nameLbl.frame.origin.y, s.width, s.height);
回答3

Swift 2版本,来自 Zigglzworth 的回答:

let maximumLabelSize = CGSizeMake(maxWidth, maxHeight);
let expectedSize = theLabel.sizeThatFits(maximumLabelSize)

theLabel.frame = CGRectMake(theLabel.frame.origin.x, theLabel.frame.origin.y, expectedSize.width, expectedSize.height)
回答4
let lblMassage = UILable()        
lblMassage.text ="Resizing the height of UILabel to fit text.................."
lblMassage.numberOfLines = 0
lblMassage.lineBreakMode = NSLineBreakMode.byTruncatingTail
lblMassage.preferredMaxLayoutWidth = 190
lblMassage.sizeToFit()

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • UILabel-自动调整标签大小以适合文本?(UILabel - auto-size label to fit text?)
    问题 是否可以自动调整UILabel框/边框的大小以适合所包含的文本? (我不在乎它最终是否大于显示屏) 因此,如果用户输入“ hello”或“我的名字真的很长,我希望它适合此框”,它不会被截断并且标签会相应地“加宽”吗? 回答1 请检查我的要点,其中我为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
  • 调整UILabel的大小以适合?(Sizing a UILabel to fit?)
    问题 如何修改iPhone开发人员手册第6章“ 09a-PrefsTable”食谱中的以下代码段(在tableView:cellForRowAtIndexPath:UITableViewController方法中): if (row == 1) { // Create a big word-wrapped UILabel cell = [tableView dequeueReusableCellWithIdentifier:@"libertyCell"]; if (!cell) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"libertyCell"] autorelease]; [cell addSubview:[[UILabel alloc] initWithFrame:CGRectMake(20.0f, 10.0f, 280.0f, 330.0f)]]; } UILabel *sv = [[cell subviews] lastObject]; sv.text = @"When in the Course of human events, it becomes necessary for one people to dissolve the political
  • 如何调整标签大小以适合文本的长度(How to adjust a label size to fit the length of the text)
    问题 在过去的质量检查中,我已经搜索了有关此问题的解决方案,但找不到合适的解决方案。 有谁知道如何动态调整UILabel大小以适合文本长度? 我上传了我不想要的(第一行)和我想要的(第二行)的屏幕截图。 我将不胜感激任何线索,建议或代码示例。 谢谢你。 回答1 您要搜索的是UILabel方法sizeToFit 我可以尝试向您解释,但是知道如何使用UILabel的最佳答案是:https://stackoverflow.com/a/1054681/666479 回答2 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
  • 动态更改UILabel的字体大小(Dynamically changing font size of UILabel)
    问题 我目前有一个UILabel : factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)]; factLabel.text = @"some text some text some text some text"; factLabel.backgroundColor = [UIColor clearColor]; factLabel.lineBreakMode = UILineBreakModeWordWrap; factLabel.numberOfLines = 10; [self.view addSubview:factLabel]; 在我的iOS应用程序的整个生命周期中, factLabel获得了许多不同的值。 有些包含多个句子,有些则只有5或6个单词。 如何设置UILabel以便更改字体大小,以使文本始终适合我定义的边界? 回答1 单线: factLabel.numberOfLines = 1; factLabel.minimumFontSize = 8; factLabel.adjustsFontSizeToFitWidth = YES; 上面的代码会将文本的字体大小减小到(例如) 8以使文本适合标签内的大小。 numberOfLines = 1是强制性的。 多行:
  • UILabel 中的字体不合适 - Ascender 或 Descender 被裁剪(Fonts not fitting properly in UILabel - Ascender or Descender cropped)
    问题 我已经进行了广泛的搜索/阅读/测试,但找不到解决此问题的方法。 我从 iOS 4.3 开始尝试过,但在 iOS7 中仍未解决。 问题是这样的:大尺寸的字体可以在 UILabel 中裁剪它们的 Ascenders 或 Descenders。 这是直接来自 Xcode 5.1 UI(根本没有代码!)的屏幕截图,显示了问题 - 字体大小为 300 磅: 如您所见,即使是像 Helvetica Neue(粗体或非粗体)这样的简单字体,也会对 Descender 进行裁剪。 (你看到 UIViewController > UIView > UILabel) 如果您尝试此操作,然后更改点大小,您将看到字体缩小,最终不会裁剪 Descender。 这里又是 160 点: 另请注意,某些字体不会被裁剪而其他字体会被裁剪 - 尝试使用 Noteworthy、Papyrus 或 Savoye LET - 所有这些都是标准的 iOS 和字体...... 我在这里谈论高度 - 我知道我可以使用 adjustsFontSizeToFitWidth=YES 来查看整个长度,我也知道我可以使用 sizeToFit,但是两者都不能保证不裁剪上升/下降。 另请注意,使用 Ascender/Descender 值计算高度无济于事,因为主要问题是字体在绘制时未在标签内垂直居中。 (如果是这样,这将是一个简单的计算
  • 计算 UILabel/UITableViewCell 的多行文本高度:计算与实际绘图时的不同结果(Calculating multiline text height for UILabel/UITableViewCell: different results when calculating vs actual drawing)
    问题 这个通用主题在这里被多次询问:如何使用不同数量的文本和不同的高度呈现 UITableViewCells。 规范的答案是:您使用 sizeWithFont:constrainedToSize:lineBreakMode: 在 heightForRowAtIndexPath 中计算表视图控制器委托中的高度。 稍后,单元格被绘制,如果需要,你可以使用类似 [label sizeToFit] 的东西,一切都像魔法一样。 我的问题:我正在为某些单元格换行,因为 sizeWithFont: 从实际绘图中返回不同的尺寸。 一个具体的例子: 文字是这样的:“人们忘记了@BillGates 在 1993 年从 NEC 那里获得了一块性感的 1/4 英寸厚的石板。本周发生的一切都与硬件无关!” CGSize theSize = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(310.0f, FLT_MAX) lineBreakMode:UILineBreakModeWordWrap]; NSLog(@"calculated size for %@: %f, %f",text, theSize.width, theSize.height); 这将返回:306.000000、84
  • 如何调整标签的字体大小以适合矩形?(How to adjust font size of label to fit the rectangle?)
    问题 是的,这是一个很酷的myLabel.adjustsFontSizeToFitWidth = YES; 财产。 但是,只要标签有两行或更多行,它就不会将文本的大小调整为任何内容。 因此,如果它不适合rect,它只会被截断。 还有另一种方法吗? 回答1 如果要确保标签在宽度和高度上都适合矩形,可以在标签上尝试不同的字体大小,以查看是否适合。 该代码段起始于300 pt,并尝试通过减小字体大小使标签适合目标矩形。 - (void) sizeLabel: (UILabel *) label toRect: (CGRect) labelRect { // Set the frame of the label to the targeted rectangle label.frame = labelRect; // Try all font sizes from largest to smallest font size int fontSize = 300; int minFontSize = 5; // Fit label width wize CGSize constraintSize = CGSizeMake(label.frame.size.width, MAXFLOAT); do { // Set current font size label.font = [UIFont
  • 调整UILabel的大小以适应插图(Resizing a UILabel to accommodate insets)
    问题 我正在构建一个用于扫描条形码的屏幕,并且需要在某些UILabels后面放置一个半透明的屏幕,以提高在浅色背景下的可见性。 这是屏幕现在的样子: 我在UILabel上设置背景色以获取半透明框。 我还创建了一个自定义UILabel子类,以允许我使用这种方法在UILabel的边缘和文本之间设置一些填充。 正如您在上面的屏幕中看到的那样, UILabel大小没有正确调整,无法考虑填充的大小。 “填充”只是在不改变标签宽度的情况下移动文本,从而导致文本截断。 这两个标签都将包含任意长度的文本,我确实需要UILabel来动态调整大小。 我可以重写哪种UILabel方法来增加标签的宽度和填充中的系数? 回答1 这是一个可以正确计算尺寸的标签类。 发布的代码在Swift 3中,但是您也可以下载Swift 2或Objective-C版本。 它是如何工作的? 通过计算适当的textRect,所有sizeToFit和自动布局的东西都可以按预期工作。 诀窍是首先减去插图,然后计算原始标签范围,最后再次添加插图。 代码 class NRLabel : UILabel { var textInsets = UIEdgeInsets.zero { didSet { invalidateIntrinsicContentSize() } } override func textRect(forBounds
  • 如何调整超级视图的大小以适合具有自动布局的所有子视图?(How to resize superview to fit all subviews with autolayout?)
    问题 我对自动布局的理解是,它采用了超级视图的大小,并基于约束和内在大小来计算子视图的位置。 有没有办法扭转这个过程? 我想基于约束和内在大小调整Superview的大小。 实现这一目标的最简单方法是什么? 我有Xcode设计的视图,用作UITableView的标头。 该视图包括标签和按钮。 标签的大小取决于数据。 根据约束,标签可以成功按下按钮,或者如果按钮和超级视图底部之间存在约束,则标签将被压缩。 我发现了一些类似的问题,但没有好的和简单的答案。 回答1 正确使用的API是UIView systemLayoutSizeFittingSize:并传递UILayoutFittingCompressedSize或UILayoutFittingExpandedSize 。 对于使用自动布局的普通UIView ,只要您的约束正确,它就应该起作用。 如果要在UITableViewCell上使用它(例如确定行高),则应在单元格contentView调用它并获取高度。 如果您的视图中有一个或多个多行UILabel,则需要进一步考虑。 对于这些,必须正确设置preferredMaxLayoutWidth属性,以便标签提供正确的intrinsicContentSize ,它将在systemLayoutSizeFittingSize's计算中使用。 编辑:根据要求
  • 将UILabel高度调整为文本(Adjust UILabel height to text)
    问题 我有一些标签要根据文本调整高度,这是我现在为此编写的代码 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) label.numberOfLines = 0 label.lineBreakMode = NSLineBreakMode.ByWordWrapping label.font = font label.text = text label.sizeToFit() return label.frame.height } 编辑: 问题不在这段代码中,所以我的解决方法是问题本身。 它可能对其他人仍然有用! 回答1 我刚把它放在操场上,对我有用。 已为Swift 4.0更新 import UIKit func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude)) label
  • iOS自动版式:调整父视图大小时出现UILabels问题(iOS Autolayout: Issue with UILabels in a resizing parent view)
    问题 我有一个仅包含UILabel的视图。 此标签包含多行文本。 父对象具有可变的宽度,可以通过平移手势来调整其大小。 我的问题是,当我这样做时,调整UILabel的大小不会重新计算其高度,以使所有内容仍然可见,而只是将其截断。 我设法修复了一点漏洞,但是运行起来非常慢: - (void)layoutSubviews { CGSize labelSize = [self.labelDescription sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)]; if (self.constraintHeight) { [self removeConstraint:self.constraintHeight]; } self.constraintHeight = [NSLayoutConstraint constraintWithItem:self.labelDescription attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:labelSize.height]; [self
  • UITextField 占位符文本:调整以适合(UITextField placeholder text: adjust to fit)
    问题 我将 UITextField 中的较长文本设置为占位符。 我想要的是这个占位符文本在字段宽度太小时时调整其字体大小。 我已经尝试过其他帖子中描述的这个解决方案(以编程方式和在 IB 中) self.fieldTest.adjustsFontSizeToFitWidth = true self.fieldTest.minimumFontSize = 10.0 我在这里缺少什么? 回答1 您可以创建UITextField的子类: class AutoSizeTextField: UITextField { override func layoutSubviews() { super.layoutSubviews() for subview in subviews { if let label = subview as? UILabel { label.minimumScaleFactor = 0.3 label.adjustsFontSizeToFitWidth = true } } } } 或者您可以在视图控制器的viewDidAppear添加一些代码: override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) for subview in fieldTest.subviews {
  • 将文本垂直对齐到UILabel中的顶部(Vertically align text to top within a UILabel)
    问题 我有一个UILabel带有两行文本的空间。 有时,当文本太短时,该文本会显示在标签的垂直中心。 如何垂直对齐文本以使其始终位于UILabel的顶部? 回答1 无法在UILabel上设置垂直对齐,但是您可以通过更改标签的框架来获得相同的效果。 我将标签设为橙色,以便您可以清楚地看到发生了什么。 这是执行此操作的快速简便的方法: [myLabel sizeToFit]; 如果您有一个带有较长文本的标签,该标签将包含多行,请将numberOfLines设置为0 (此处为零表示行数不受限制)。 myLabel.numberOfLines = 0; [myLabel sizeToFit]; 较长的版本 我将在代码中添加标签,以便您查看发生了什么。 您也可以在Interface Builder中设置大多数功能。 我的设置是一个基于视图的应用程序,其中包含我在Photoshop中制作的背景图像以显示边距(20点)。 标签是吸引人的橙色,因此您可以看到尺寸的变化。 - (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
  • 调整大小以适合其titleLabel的UIButton(UIButton that resizes to fit its titleLabel)
    问题 我有一个UIButton ,可以在情节UIButton中添加到视图控制器的视图中。 我添加了居中约束来定位它,并添加了空间约束来限制它的宽度。 在代码中,我添加: self.button.titleLabel.numberOfLines = 0; self.button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; [self.button setTitle:@"A real real real real real real real real long long name." forState:UIControlStateNormal]; self.button.backgroundColor = [UIColor redColor]; self.button.titleLabel.backgroundColor = [UIColor blueColor]; 结果如下所示: 我希望按钮可以调整其内容的大小。 我怎样才能做到这一点? 我试过了 [self.button sizeToFit]; 并且我尝试将内容拥抱和抗压缩自动布局约束的优先级设置为必选。
  • 根据文本调整UILabel的高度(Adjust UILabel height depending on the text)
    问题 考虑一下我在UILabel有以下文本(一长行动态文本): 由于外星军队的数量远远超过队伍,因此玩家必须利用世界末日的世界来发挥自己的优势,例如在垃圾箱,支柱,汽车,瓦砾和其他物体后面寻求掩护。 我想调整UILabel's高度,以便可以容纳文本。我正在使用UILabel以下属性来使文本自动换行。 myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0; 如果我没有朝正确的方向前进,请告诉我。 谢谢。 回答1 sizeWithFont constrainedToSize:lineBreakMode:是要使用的方法。 下面是一个如何使用它的示例: //Calculate the expected size based on the font and linebreak mode of your label // FLT_MAX here simply means no constraint in height CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX); CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize
  • 调整UITableView的大小以适合内容(Resizing UITableView to fit content)
    问题 我正在创建一个应用程序,它将在UILabel有一个问题,并在UITableView显示选择题答案,每行显示一个选择题。 问题和答案会有所不同,因此我需要此UITableView高度是动态的。 我想找到一个适合表的sizeToFit解决方案。 将表格的框架设置为所有内容的高度。 谁能建议我如何实现这一目标? 回答1 实际上,我自己找到了答案。 我只是为tableView.frame创建了一个新的CGRect ,其height为table.contentSize.height 这UITableView的height设置为其内容的height 。 由于代码修改了UI,因此请不要忘记在主线程中运行它: dispatch_async(dispatch_get_main_queue(), ^{ //This code will run in the main thread: CGRect frame = self.tableView.frame; frame.size.height = self.tableView.contentSize.height; self.tableView.frame = frame; }); 回答2 无需KVO,DispatchQueue或自行设置约束的Swift 5和4.2解决方案。 该解决方案基于Gulz的答案。 1)创建UITableView的子类:
  • UILabel sizeToFit不适用于自动布局iOS6(UILabel sizeToFit doesn't work with autolayout ios6)
    问题 我应该如何以编程方式(和使用哪种方法)配置高度取决于其文本的UILabel? 我一直在尝试使用Storyboard和代码的组合进行设置,但无济于事。 设置lineBreakMode和numberOfLines时,每个人都建议使用sizeToFit 。 但是,无论我是否将该代码放入viewDidLoad: , viewDidAppear:或viewDidLayoutSubviews我都无法正常工作。 我要么将框设置得太小而不能容纳较长的文本,否则它不会增长,或者我将其设置得太大而不会收缩。 回答1 请注意,在大多数情况下,Matt的解决方案可以按预期工作。 但是,如果对您不起作用,请进一步阅读。 要使标签自动调整高度,您需要执行以下操作: 设置标签的布局约束设置高度限制为低优先级。 它应该低于ContentCompressionResistancePriority 设置numberOfLines = 0 将ContentHuggingPriority设置为高于标签的高度优先级设置label的preferredMaxLayoutWidth。 标签使用该值来计算其高度 例如: self.descriptionLabel = [[UILabel alloc] init]; self.descriptionLabel.numberOfLines = 0; self
  • iOS:根据大小找到适合 UILabel 的正确字体大小(iOS: finding correct font size to fit in a UILabel depending on its size)
    问题 我有一个UILabel其属性text我想将文本段落设置为使用NSString 。 我有一个数组,其中存储了代表文本段落的字符序列。 该段落不必完全适合/包含在此UILabel 。 如果段落没有结束,我将转到下一个标签。 假设我有这个UILabel 160 X 240 的矩形大小,我怎么能确定正确的字体大小以便很好地填充UILabel这个字符串? 是否有根据屏幕上矩形大小计算字体大小的数学方法? 例如: UILabel *aLabel = [[UIlabel alloc] initwithFrame(CGRect){{0, 0}, 160, 240}]; aLabel.font = [UIFont fontWithName:@"Courier New" size:<???>]; //(font unit in points) NSMutableString *aString = [[NSMutableString alloc] init]; //The following tries to fit the character one by one within the label rect based on //the width and height of the UILabel by appending String int index = 0; for(int x = 0
  • iOS:自动版式中的多行UILabel(iOS: Multi-line UILabel in Auto Layout)
    问题 我在尝试通过自动版式实现一些非常基本的版式行为时遇到了麻烦。 我的视图控制器在IB中如下所示: 顶部标签是标题标签,我不知道它将是多少行。 我需要标题标签来显示所有文本行。 我还需要在标题的正下方布置其他两个标签和小图像,无论它高高多少。 我在标签和小图像之间设置了垂直间距约束,在标题标签和其超级视图之间设置了顶部间距约束,在小图像和其超级视图之间设置了底部间距约束。 白色的UIView没有高度限制,因此应垂直拉伸以包含其子视图。 我已将标题标签的行数设置为0。 如何获得标题标签以调整大小以适合字符串所需的行数? 我的理解是因为使用自动布局,所以不能使用setFrame方法。 而且我必须使用“自动布局”,因为我需要其他视图保持在标题标签下方(因此受约束)。 我怎样才能做到这一点? 回答1 在UILabel上使用-setPreferredMaxLayoutWidth ,自动布局应处理其余部分。 [label setPreferredMaxLayoutWidth:200.0]; 请参阅UILabel文档上的preferredMaxLayoutWidth。 更新: 只需将情节提要中的height约束设置为Greater than or equal to ,而无需设置setPreferredMaxLayoutWidth。 回答2 将标签集的行数扩展为0,并且更重要的是
  • 如何设置自适应多行UILabel文本?(How do I set adaptive multiline UILabel text?)
    问题 我的故事板笔尖中有一个名为titleLabel的UILabel ,设置为默认高度。 我希望它以编程方式扩展高度以适合其内容。 到目前为止,这是我尝试过的: // just setting content titleLabel.text = "You don't always know what you are getting with mass-market cloud computing services. But with SimpliCompute, the picture is clear. SimpliCompute gives you powerful virtual servers you can deploy using just your web browser. That’s enterprise grade technology you can deploy and control on-the-fly." titleLabel.numberOfLines = 0 titleLabel.preferredMaxLayoutWidth = 700 titleLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping titleLabel.sizeToFit() 这一切对我都不起作用!