我应该如何配置程序(并且在这种方法)一个UILabel其高度依赖于它的文字? 我一直在试图将其设置使用故事板和代码的组合,但无济于事。 每个人都建议sizeToFit
同时设定lineBreakMode
和numberOfLines
。 但是,不管我把代码中viewDidLoad:
, viewDidAppear:
或viewDidLayoutSubviews
我无法得到它的工作。 无论我做框长文本太小了,它不会增长,或者我让过大,它不缩水。
Answer 1:
请注意 ,在大多数情况下, 马特的解决方案按预期工作。 但是,如果它不为你工作,请继续读下去。
为了让您的标签自动调整高度,你需要做以下几点:
- 设置布局限制了标签
- 设置高度限制低优先级。 它应该比ContentCompressionResistancePriority低
- 设置numberOfLines = 0
- 比标签的高度优先级设置ContentHuggingPriority更高
- 设置为preferredMaxLayoutWidth标签。 这个值由标签来计算其高度
例如:
self.descriptionLabel = [[UILabel alloc] init];
self.descriptionLabel.numberOfLines = 0;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.descriptionLabel.preferredMaxLayoutWidth = 200;
[self.descriptionLabel setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
[self.descriptionLabel setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:self.descriptionLabel];
NSArray* constrs = [NSLayoutConstraint constraintsWithVisualFormat:@"|-8-[descriptionLabel_]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)];
[self addConstraints:constrs];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-8-[descriptionLabel_]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
[self.descriptionLabel addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[descriptionLabel_(220@300)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(descriptionLabel_)]];
使用Interface Builder
成立了四个约束。 高度限制是强制性的。
然后去标签的属性检查器并设置行数为0。
去标签的尺寸检查,并增加垂直ContentHuggingPriority和垂直ContentCompressionResistancePriority。
选择和编辑高度约束。
并降低高度约束的优先级。
请享用。 :)
Answer 2:
在IOS 6,采用自动布局,如果一个UILabel的侧面(或宽度)和顶部固定,它会自动生长和垂直缩小以适合其内容, 与所有和没有与它的耐压缩性或任何搞乱没有代码 。 它是死的简单。
在更复杂的情况下,只需设置标签的preferredMaxLayoutWidth
。
无论哪种方式,正确的事情会自动发生。
Answer 3:
虽然问题状态编程,已经遇到了同样的问题,而宁愿在Interface Builder的工作,我想这可能是添加到与Interface Builder的解决方案现有的答案是有用的。
第一件事情是忘记sizeToFit
。 自动布局将处理这代表您基于内在的内容大小。
问题因此,如何让一个标签,以适应它的内容与自动布局? 特别 - 因为这个问题提到它 - 高度。 需要注意的是同样的原则也适用于宽度。
因此,让我们开始与具有高度设置为41px高的例子的UILabel:
正如你可以在屏幕抓取上面看到, "This is my text"
的上方和下方都有填充。 这是UILabel的高度之间填充,并且它的内容,文本。
如果我们在模拟器中运行应用程序,果然,我们看到同样的事情:
现在,让我们选择在Interface Builder中的UILabel,并看看在尺寸检查的默认设置:
注意上面的突出制约因素。 这是内容抱死优先级 。 作为埃里卡丧盾介绍它的优秀的iOS自动布局揭秘 ,这是:
途中观点倾向于避免微胖围绕它的核心内容
对我们来说,用的UILabel,其核心内容是文本。
下面我们就来这个基本场景的心脏。 我们已经给我们的文本标签两个约束。 他们发生冲突。 一说“的高度必须等于41个像素高”。 另一个写着“抱抱以它的内容,所以我们没有任何额外的填充”。 在我们的例子中,拥抱的看法给它的文本 ,所以我们没有任何额外的填充。
现在,随着汽车的布局,有两个不同的指令,说做不同的事情,运行时必须选择一个或另一个。 它不能两者都做。 所述的UILabel不能同时为41个像素高, 并且没有填充。
这个解决的方式,是通过指定的优先级。 一个指令必须具有比其他更高的优先级。 如果两个指示说不同的事情,并且具有相同的优先级,会出现异常。
因此,让我们给它一展身手。 我的身高限制了1000的优先级,这是必需的 。 内容拥抱高度是250,这是弱 。 如果我们降低高度约束优先于249,会发生什么?
现在我们可以看到神奇的开始发生。 让我们尝试在SIM卡:
真棒! 内容拥抱来实现的。 只是因为高度优先级249小于内容拥抱优先级250。 基本上,我说:“我在这里指定的高度比我所为内容拥抱指定不太重要”。 因此,内容拥抱获胜。
底线,获得标签以适合文本可为指定高度的简单-或宽度-约束和正确的设置在与该轴内容拥抱优先约束关联的优先权。
将离开做的宽度相当于作为练习读者!
Answer 4:
在IOS7 sizeToFit注意到的是不是也工作 - 也许是解决方案可以帮助你太
[textView sizeToFit];
[textView layoutIfNeeded];
Answer 5:
确保标签的preferredMaxLayoutWidth另一种选择是保持与标签的宽度同步:
#import "MyLabel.h"
@implementation MyLabel
-(void)setBounds:(CGRect)bounds
{
[super setBounds:bounds];
// This appears to be needed for iOS 6 which doesn't seem to keep
// label preferredMaxLayoutWidth in sync with its width, which
// means the label won't grow vertically to encompass its text if
// the label's width constraint changes.
self.preferredMaxLayoutWidth = self.bounds.size.width;
}
@end
Answer 6:
我觉得我花了一段时间才能找到合适的解决方案,我应该贡献:
- 我们的目标是让自动布局完成其工作而没有调用sizeToFit(),我们将通过指定权的限制做到这一点:
- 指定顶部,底部,并在您的UILabel前/后空间的限制
- 套系属性的数量为0
- 增加的内容拥抱优先1000
- 放下内容压缩性优先级500
- 在您的底部容器约束,较低的优先级为500
基本上,什么情况是,你告诉你的UILabel,即使它有一个固定的高度限制,它可以使打破约束,使自己以拥抱的内容(如果有,例如单行)小,但它不能打破约束,使其更大。
Answer 7:
在我来说,我创建包含一个UILabel一个UIView子类(未知长度的)。 在iOS7代码是直截了当:设置限制,不用担心内容拥抱或压缩性,和一切工作正常。
但是在iOS6的的的UILabel总是夹在一个单一的线。 答案都不以上为我工作。 内容拥抱和压缩性设置被忽略了。 该削波防止的唯一解决方案是包括在标签上的preferredMaxLayoutWidth。 但我不知道该怎么设置首选宽度,它的父视图的大小是未知的(事实上,它会通过内容来定义)。
我终于找到了解决办法在这里 。 因为我工作的自定义视图,我可以只添加下面的方法来设置首选布局宽度的限制已经被计算一次之后,再重新计算它们:
- (void)layoutSubviews
{
// Autolayout hack required for iOS6
[super layoutSubviews];
self.bodyLabel.preferredMaxLayoutWidth = self.bodyLabel.frame.size.width;
[super layoutSubviews];
}
Answer 8:
我有xCode6把“首选宽度”为自动和引脚标签顶部,开头和结尾的解决
Answer 9:
我添加UILabel
编程,在我的情况下,这已经足够了:
label.translatesAutoresizingMaskIntoConstraints = false
label.setContentCompressionResistancePriority(UILayoutPriorityRequired, forAxis: .Vertical)
label.numberOfLines = 0
Answer 10:
UIFont *customFont = myLabel.font;
CGSize size = [trackerStr sizeWithFont:customFont
constrainedToSize:myLabel.frame.size // the size here should be the maximum size you want give to the label
lineBreakMode:UILineBreakModeWordWrap];
float numberOfLines = size.height / customFont.lineHeight;
myLabel.numberOfLines = numberOfLines;
myLabel.frame = CGRectMake(258, 18, 224, (numberOfLines * customFont.lineHeight));
Answer 11:
我就遇到了这个问题,以及与包含一个UILabel作为一个如果它的内部元素UIView子类。 即使有自动布局和尝试所有建议的解决方法,标签只是不会收紧其高度的文本。 就我而言,我只希望标签是一条线。
总之,什么工作对我来说是添加一个需要高度约束的的UILabel和手动设置到正确的高度时,intrinsicContentSize被调用。 如果你没有包含在另一个的UIView的的UILabel,你可以尝试继承的UILabel和首先设置高度约束,然后返回提供了类似的实现
[超级instrinsicContentSize]; 代替[self.containerview intrinsiceContentSize]; 像我这样做下面是具体到我UIView sublass。
- (CGSize)intrinsicContentSize
{
CGRect expectedTextBounds = [self.titleLabel textRectForBounds:self.titleLabel.bounds limitedToNumberOfLines:1];
self.titleLabelHeightConstraint.constant = expectedTextBounds.size.height;
return [self.containerView intrinsicContentSize];
}
完美现在适用于iOS 7和iOS 8。
Answer 12:
为我工作溶液; 如果您的的UILabel具有固定的宽度,从所述约束改变constant =
以constant <=
在界面文件
Answer 13:
在我的情况下使用时,在一个UITableViewCell标签,该标签将在调整,但高度会超出表格单元格高度。 这是对我工作。 我按照马克斯·麦克劳德做了,然后确信细胞高度为UITableViewAutomaticDimension。
您可以添加这是你的init或awakeFromNib,
self.tableView.rowHeight = UITableViewAutomaticDimension.
在故事板,选择单元格,打开尺寸检查,并确保行高设置为“默认”的uchecking“自定义”复选框。
有一个在8.0的问题也需要它在代码中设置。