14

有没有什么简单的方法可以帮助我使用它们的内容大小动态改变依赖视图的位置?

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

初始布局

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

尺寸适合通话后

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

4

3 回答 3

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];
}

多行标签暴露了自动布局的弱点之一。我们必须更新preferredMaxLayoutWidth以强制标签重排并调整其高度,否则如果视图被调整大小/旋转,自动布局不会意识到标签需要重排和调整大小。

于 2013-04-10T13:35:13.243 回答
2

如果您仍想为标签使用自动布局约束。这是一个解决方案:

[self.lblBadgeValue sizeToFit];
self.constraintWidthBadgeLabel.constant =  self.lblBadgeValue.frame.size.width;
[self.lblBadgeValue needsUpdateConstraints];
[self.lblBadgeValue layoutIfNeeded];
  • 解释更多:
  • sizeToFit -> 使标签适合其内容的高度、宽度。
  • 所以在运行时你需要更新约束高度,或者标签的宽度
  • 之后你需要告诉编译器知道什么需要更新约束。
  • 最后,如果约束发生变化,您需要调用布局。
于 2016-05-26T08:46:23.110 回答
-1

这也有效。 https://github.com/jszumski/auto-layout-table-cells/blob/master/DynamicCellHeights/JSLabel.m

@interface JSLabel : UILabel

@end

@implementation JSLabel

- (id)init {
    self = [super init];

    // required to prevent Auto Layout from compressing the label (by 1 point usually) for certain constraint solutions
    [self setContentCompressionResistancePriority:UILayoutPriorityRequired
                                          forAxis:UILayoutConstraintAxisVertical];

    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];

    self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds);

    [super layoutSubviews];
}

@end
于 2014-01-11T13:13:23.737 回答