如何防止 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() 并不总是在自定义表格视图单元格中产生正确的结果