如何防止 sizeToFit 更改 UILabel 宽度?

Posted

技术标签:

【中文标题】如何防止 sizeToFit 更改 UILabel 宽度?【英文标题】:How can I prevent sizeToFit from changing the UILabel width? 【发布时间】:2013-11-06 15:21:36 【问题描述】:

我现在有一个 UILabel,并且 UILabel.text 的值会定期变化。

我遇到的问题是,如果每次 UILabel.text 值发生变化,UILabel 的宽度会根据标签的内容而变化。

我该如何解决这个问题?这是我现在拥有的代码:

outputLabel.text = errorMessage;
outputLabel.hidden = NO;
[outputLabel sizeToFit];

更新 我使用 sizeToFit 的原因是因为我需要自动改变高度。

谢谢,

彼得

【问题讨论】:

如果您不想调整标签大小,请不要致电sizeToFit。该方法的重点是调整标签的大小以适合其包含的文本。 但是我想改变高度。 然后根据固定宽度计算新文本的大小。然后设置标签的框架以匹配计算的高度和给定的宽度。 我不完全确定该怎么做 NSString(在UIKit 类别中)有多种方法可以执行计算。搜索一下如何确定字符串的大小。 【参考方案1】:

使用以下技巧完成工作:

首先是uiLabel的set标签。我的 cell.yourLable 标签是 998

cell.yourLable.numberOfLines = 0;
[cell.yourLable sizeToFit];

UILabel *myLbl=[cell.contentView viewWithTag:998];
CGRect frm=cell.yourLable.frame;
frm.size.width = cell.contentView.frame.size.width;
myLbl.frame=frm;

这里的诀窍是通过标签获取相同的 UiLabel 并通过设置框架设置其宽度。

【讨论】:

【参考方案2】:

我继承了 UILabel 并覆盖了 sizeThatFits 方法,看起来像这样:

- (CGSize)sizeThatFits:(CGSize)size

    CGSize res = [super sizeThatFits:size];

    return CGSizeMake(size.width, res.height);

然后,如果我将标签添加到笔尖,我会从对象库中放置一个 UILabel。之后,我确保将放置标签的类设置为我的自定义类,而不是默认的 UILabel。

它基本上只是用原始宽度覆盖新宽度,因此它永远不会改变宽度,而是动态改变高度。

【讨论】:

【参考方案3】:

[UILabel sizeThatFits:] 与具有无限高度的CGSize 一起使用,例如(320, 10000)

【讨论】:

该方法返回一个CGSize(它不会改变UILabel),您需要从该CGSize中提取高度并将其分配给UILabel 上次我检查了 10000 不是无限的。 ;) 使用HUGE_VALF @chaiguy thx,只是懒得检查实际的 const 名称是什么 :) 无论如何,如果一个人有 10000 像素的高度视图,他应该更担心其他事情。 处理 CGFloat 值时,始终使用 CGFLOAT_MAX 或 CGFLOAT_MIN。不要依赖他们总是双打。【参考方案4】:

您可以创建一个类别或 UILabel 的子类,并添加此方法以根据输入文本仅调整标签的高度

- (void)heightToFit 

    CGSize maxSize = CGSizeMake(self.frame.size.width, CGFLOAT_MAX);
    CGSize textSize = [self.text sizeWithFont:self.font constrainedToSize:maxSize lineBreakMode:self.lineBreakMode];

    CGRect labelRect = self.frame;
    labelRect.size.height = textSize.height;
    [self setFrame:labelRect];

并使用它来代替 sizeToFit

【讨论】:

这听起来很愚蠢。我将如何创建 UILabel 的子类,我看到人们谈论这个,但我从来没有发现如何做到这一点 ios7 以来已弃用,现在要使用的新方法是 'sizeWithAttributes:' 因此您需要在 rutime 实现以使用 iOS6 和之前的方法或 iOS7 方法。使用调整标签大小的方法创建子类或类别的另一个好理由 我不是为 iOS 6 开发应用程序 所以你只需要用新方法替换不推荐使用的方法 @Manu - 仅供参考 - 如果您有一个部署目标为 iOS 6 或更早版本的应用程序以及 iOS 7 的 Base SDK,您可以安全地将sizeWithFont... 与 iOS 7 或更早版本一起使用。不推荐使用的方法可以毫无问题地使用(除了可能的警告)。如果你只支持 iOS 7,那么你应该使用新的方法。

以上是关于如何防止 sizeToFit 更改 UILabel 宽度?的主要内容,如果未能解决你的问题,请参考以下文章

在带有阴影的 UILabel 上使用 SizeToFit()?

如何以编程方式在 UILabel 上设置 sizeToFit 宽度和高度?

如何在自动布局中使用 NSLineBreakByTruncatingMiddle 和 sizeToFit 实现 Multiline UILabel?

在 UILabel 上调用 sizeToFit() 并不总是在自定义表格视图单元格中产生正确的结果

UILabel sizeToFit 中的 UICollectionView

你如何收紧 UILabel sizeToFit 以使用更小的边距?