【发布时间】:2012-02-06 11:40:04
【问题描述】:
是否可以自动调整 UILabel 框/边界的大小以适应包含的文本? (我不在乎它是否比显示器大)
因此,如果用户输入“你好”或“我的名字很长,我希望它适合这个框”,它永远不会被截断,并且标签会相应地“加宽”?
【问题讨论】:
-
任何人请帮我提供快速代码..
标签: ios iphone objective-c uilabel
是否可以自动调整 UILabel 框/边界的大小以适应包含的文本? (我不在乎它是否比显示器大)
因此,如果用户输入“你好”或“我的名字很长,我希望它适合这个框”,它永远不会被截断,并且标签会相应地“加宽”?
【问题讨论】:
标签: ios iphone objective-c uilabel
请查看我的要点,我为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
您可以更简单地使用 UIView 类中提供的 sizeToFit 方法,但将行数设置为 1 以确保安全。
如果您使用的是 AutoLayout,那么您有一个内置的解决方案。通过将行数设置为 0,框架将适当调整标签大小(增加高度)以适合您的文本。
sizeWithFont: 已弃用,因此请改用sizeWithAttributes::
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
return expectedLabelSize.width;
}
【讨论】:
使用[label sizeToFit]; 将获得与 Daniels 类别相同的结果。
虽然我建议使用自动布局并让标签根据约束自行调整大小。
【讨论】:
如果我们希望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 中查找动态调整大小的标签,请参阅 this answer。【讨论】:
使用[label sizeToFit];调整UILabel中的文字
【讨论】:
以下是我发现适合我的情况的方法:
1) UILabel 的高度使用自动布局具有 >= 0 约束。宽度是固定的。 2)将文本分配到 UILabel 中,此时它已经有一个超级视图(不确定这有多重要)。 3)然后,做:
label.sizeToFit()
label.layoutIfNeeded()
标签的高度现在已正确设置。
【讨论】:
我根据上面丹尼尔的回复创建了一些方法。
-(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 as 的实例上使用 -sizeToFit-
[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
// 之后就可以获取标签框来重构其他相关控件了
【讨论】:
[label sizeToFit];
【讨论】:
我在自动布局方面遇到了很大的问题。 我们在表格单元格中有两个容器。第二个容器根据项目描述(0 - 1000 个字符)调整大小,并且应根据它们调整行大小。
缺少的成分是描述的底部约束。
我已将动态元素的底部约束从 = 0 更改为 >= 0。
【讨论】:
每次都适合! :)
name.text = @"Hi this the text I want to fit to"
UIFont * font = 14.0f;
CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
nameOfAssessment.font = [UIFont systemFontOfSize:font];
【讨论】:
您可以显示一行输出然后设置属性 Line=0 并显示多行输出然后设置属性 Line=1 和更多
[self.yourLableName sizeToFit];
【讨论】:
还有这个办法:
[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];
【讨论】:
UILabel 上看不到 changeTextWithAutoHeight:width: 方法。您能否提供一个链接到 UIKit 文档中可以找到此方法的位置。