UILabel sizeToFit和约束

Nik*_*Nik 14 iphone cocoa autolayout

有没有简单的方法可以帮助我使用内容大小动态更改相关视图的位置?

我想在列中显示几个视图,这些视图都有不同的内容.我希望它们一个接一个地放置(我使用看起来像这样的约束创建了布局)

初始布局

但每当我更改标签内容和调用时sizeToFit,系统似乎都会忽略布局.

尺寸适合调用后

目前我只对高度属性感兴趣,我知道也可以使用约束矩形,在过去我在UIView上写了很多类别来动态改变大小(我想每个人都这样做).但也许有一种我不知道的简单方法?

Mik*_*ler 44

-sizeToFit如果您使用自动布局,则不应调用.这是"旧"系统的一部分.

看起来IB已经在您的约束中插入了明确的高度(标签旁边的垂直条表示这一点).尝试选择标签并按Cmd + =清除这些标签.

对于多行标签,您还需要在视图控制器中执行以下操作,以便在旋转/调整视图大小时使一切正常工作:

- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
{
    label.preferredMaxLayoutWidth =
        [label alignmentRectForFrame:label.frame].size.width;
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1];
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2];
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3];

    [self.view layoutSubviews];
}
Run Code Online (Sandbox Code Playgroud)

多行标签暴露了自动布局的一个缺点.我们必须更新preferredMaxLayoutWidth以强制标签重排并调整其高度,否则如果视图调整大小/旋转,则自动布局无法实现标签需要重新调整和调整大小.