Answers:
请检查我的要点,在其中我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(CGRectGetWidth(self.bounds), CGFLOAT_MAX);
CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
constrainedToSize:maximumLabelSize
lineBreakMode:[self lineBreakMode]];
return expectedLabelSize.width;
}
@end
您可以更简单地使用该类中sizeToFit
可用的方法UIView
,但是将行数设置为1是安全的。
如果您使用的是AutoLayout,那么您将拥有一个内置的解决方案。通过将行数设置为0,框架将适当调整标签的大小(增加高度)以适合您的文本。
sizeWithFont:
已弃用,请sizeWithAttributes:
改用:
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
return expectedLabelSize.width;
}
使用[label sizeToFit];
将获得与Daniels Category相同的结果。
尽管我建议使用自动布局,并让标签根据约束来调整自身大小。
如果我们希望UILabel
根据文字大小缩小和扩展,则带自动布局的情节提要是最好的选择。以下是实现此目的的步骤
将UILabel放在视图控制器中,然后将其放置在所需的位置。也0
用于的numberOfLines
属性UILabel
。
给它加上顶部,前导和尾随的空间图钉约束。
Update Frame
然后单击Fix Misplacement
。现在,如果文本较少,则该UILabel将缩小,如果文本较多,则将扩展。这并不像其他答案那么复杂。
只需使用自动布局添加约束即可固定标签的左侧和顶部。
之后,它将自动调整大小。
sizeToFit
使用自动布局时无需设置。我的示例项目的完整代码在这里:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
@IBAction func changeTextButtonTapped(sender: UIButton) {
myLabel.text = "my name is really long i want it to fit in this box"
}
}
myLabel.preferredMaxLayoutWidth = 150 // or whatever
代码。(我还将按钮固定在标签的底部,以便当标签高度增加时,按钮可以向下移动。)UITableViewCell
请参见此答案。使用[label sizeToFit];
调整中的UILabel文本
我根据上面Daniel的回复创建了一些方法。
-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX);
CGSize expectedLabelSize = [text sizeWithFont:label.font
constrainedToSize:maximumLabelSize
lineBreakMode:label.lineBreakMode];
return expectedLabelSize.height;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label
{
CGRect newFrame = label.frame;
newFrame.size.height = [self heightForLabel:label withText:label.text];
label.frame = newFrame;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
label.text = text;
[self resizeHeightToFitForLabel:label];
}
@implementation UILabel (UILabel_Auto)
- (void)adjustHeight {
if (self.text == nil) {
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
return;
}
CGSize aSize = self.bounds.size;
CGSize tmpSize = CGRectInfinite.size;
tmpSize.width = aSize.width;
tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}
@end
这是类别方法。您必须先设置文本,然后才能调用此方法来调整UILabel的高度。
您可以使用以下两种方式根据文本和其他相关控件来调整标签大小:
对于iOS 7.0及更高版本
CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : labelFont
}
context:nil].size;
在iOS 7.0之前,这可用于计算标签大小
CGSize labelTextSize = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
//根据labelTextHeight重新构造其他控件
CGFloat labelTextHeight = labelTextSize.height;
如果您不想计算标签文本的大小,则可以在UILabel实例上使用-sizeToFit as-
[label setNumberOfLines:0]; // for multiline label
[label setText:@"label text to set"];
[label sizeToFit];// call this to fit size of the label according to text
//在此之后,您可以获取标签框架以重新框架其他相关控件
我在自动布局方面遇到了很大的问题。我们在表格单元格中有两个容器。根据项目描述(0-1000个字符)调整第二个容器的大小,并应根据它们调整行的大小。
缺少的成分是描述的底部约束。
我已经将动态元素的底部约束从= 0更改为> = 0。