有没有简单的方法可以帮助我使用内容大小动态更改相关视图的位置?
我想在列中显示几个视图,这些视图都有不同的内容。我希望它们一个接一个地放置(我使用看起来像这样的约束创建了布局)
但每当我更改标签内容并调用sizeToFit
时,系统似乎都会忽略布局。
目前我只对高度属性感兴趣,我知道也可以使用约束矩形,在过去我在UIView上写了很多类别来动态改变大小(我想每个人都这样做)。但也许有一种我不知道的简单方法?
答案 0 :(得分: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
以强制标签重排并调整其高度,否则如果视图调整大小/旋转,则自动布局无法实现标签需要重新调整和调整大小。
答案 1 :(得分:2)
如果您仍想为Label使用自动布局约束。这是一个解决方案:
[self.lblBadgeValue sizeToFit];
self.constraintWidthBadgeLabel.constant = self.lblBadgeValue.frame.size.width;
[self.lblBadgeValue needsUpdateConstraints];
[self.lblBadgeValue layoutIfNeeded];
答案 2 :(得分:-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