自动布局上的UILabel iPhone六分之六+时preferredMaxLayoutWidth设置的顶部和底部增加额外的填充

new*_*per 24 iphone objective-c xib ios ios8

我创建了一个示例项目来重现这个.

我有一个带有UILabel的xib文件,它具有固定的顶部,前导和尾随约束.我添加了一个minHeight约束并将行数设置为0.

我将preferredMaxLayoutWidth设置为Automatic(在xib文件中检查).

在viewDidLoad中,我是这样的:

self.myLabel.layer.borderColor = [[UIColor redColor] CGColor];
self.myLabel.layer.borderWidth = 2.0f;
Run Code Online (Sandbox Code Playgroud)
self.myLabel.text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
Run Code Online (Sandbox Code Playgroud)

当我在iPhone 6或6+上运行模拟器时,我得到了这个:

在此输入图像描述

我不知道哪里是顶部和底部填充是从哪里来的,它是成正比的字符的UILabel正显示出量.

我忘记了一些神奇的设置吗?它在iPhone 4"设备上运行良好.

现在,如果我没有设置preferredMaxLayoutWidth,它没有额外的填充,但这会打破UILabel中的多行.它切断了文本.我没有使用Size-Class.

编辑:

因此,我在示例项目中更改了一些内容以匹配我的实际项目中的情况.我添加了一个tableView(将top,leading,bottom和trailing约束设置为其父视图).tableView上的每个单元格都有4个标签.顶部标签对单元格的contentView具有顶部,前导和尾随约束,后续标签对其上方的标签具有垂直约束.每个标签都有一个heightGreaterThan约束集和一个widthGreaterThan集.

这是没有设置preferredMaxLayoutWidth的情况(请注意标签如何限制为1行). 没有preferredMaxLayoutWidth

使用preferredMaxLayoutWidth.现在UILabel显示整个内容,但在顶部和底部有一个填充. 使用preferredMaxLayoutWidth但具有顶部和底部填充

Edit2: 示例项目:https://www.dropbox.com/s/sdahx9njnsxiv98/MultiLineUILabel.zip?dl = 1

new*_*per 8

所以我最终做的是为标签创建一个子类并覆盖setBounds:并将preferredMaxLayoutWidth设置为其边界.

- (void)setBounds:(CGRect)bounds {
    [super setBounds:bounds];

    if (self.preferredMaxLayoutWidth != bounds.size.width) {
        self.preferredMaxLayoutWidth = bounds.size.width;
        [self setNeedsUpdateConstraints];
}}
Run Code Online (Sandbox Code Playgroud)

此外,在UITableViewCell子类中,我重写layoutSubiews

- (void)layoutSubviews {
    [super layoutSubviews];

    [self.contentView layoutIfNeeded];

    // labelsCollection is an IBOutletCollection of my UILabel sublasses
    for (UILabel *label in self.labelsCollection) {
        label.preferredMaxLayoutWidth = label.bounds.size.width;
}}
Run Code Online (Sandbox Code Playgroud)

这一直都有效.我认为这种奇怪行为的原因是UILabel最初在xib文件中设置为280px(320px - 两侧填充)但在运行时,它改变其宽度以适应更大的屏幕(因为我设置了前导和尾随约束它增加了宽度,将'preferredMaxLayoutWidth'更改为更大的值).由于某种原因,UILabel不会将其preferredMaxLayoutWidth更新为更大的值,并导致顶部和底部的空白区域.

这是我的假设.

希望这可以帮助.