首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UILabel sizeToFit和约束

UILabel sizeToFit和约束
EN

Stack Overflow用户
提问于 2013-04-10 21:22:06
回答 3查看 24.8K关注 0票数 14

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

我想在列中显示几个视图,这些视图都有不同的内容。我想要一个接一个地放置它们(我已经使用约束创建了布局,如下所示)

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-10 21:35:13

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

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

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

代码语言:javascript
复制
- (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以强制标签回流并调整其高度,否则,如果视图被调整大小/旋转,自动布局不会意识到标签需要回流和调整大小。

票数 44
EN

Stack Overflow用户

发布于 2016-05-26 16:46:23

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

代码语言:javascript
复制
[self.lblBadgeValue sizeToFit];
self.constraintWidthBadgeLabel.constant =  self.lblBadgeValue.frame.size.width;
[self.lblBadgeValue needsUpdateConstraints];
[self.lblBadgeValue layoutIfNeeded];

  • 解释更多:
  • sizeToFit ->使标签适合其内容的高度、宽度。
  • 所以在运行时你需要更新约束高度,或者
  • 的宽度,之后你需要告诉编译器什么需要更新约束。如果在约束上有变化,最后你需要调用
票数 2
EN

Stack Overflow用户

发布于 2014-01-11 21:13:24

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

代码语言:javascript
复制
@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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15927086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档