Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UILabel sizeToFit和约束_Iphone_Cocoa_Autolayout - Fatal编程技术网

Iphone UILabel sizeToFit和约束

Iphone UILabel sizeToFit和约束,iphone,cocoa,autolayout,Iphone,Cocoa,Autolayout,是否有任何简单的方法可以帮助我使用依赖视图的内容大小动态更改它们的位置 我想在列中显示几个视图,它们都有不同的内容。我希望它们一个接一个地放置(我已经使用如下所示的约束创建了布局) 但每当我更改标签内容并调用sizeToFit时,系统似乎忽略了布局 目前我只对height属性感兴趣,我知道约束rect也可以使用,在过去,我在UIView上编写了许多类别来动态更改大小(我想每个人都这样做了)。但也许有一种我不知道的简单方法?-sizeToFit如果使用自动布局,则不应调用。这是“旧”系统的一部

是否有任何简单的方法可以帮助我使用依赖视图的内容大小动态更改它们的位置

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

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


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

-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
以强制标签回流并调整其高度,否则,如果视图大小调整/旋转,则自动布局无法实现标签需要回流并调整其大小。

这也行得通。


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

[self.lblBadgeValue sizeToFit];
self.constraintWidthBadgeLabel.constant =  self.lblBadgeValue.frame.size.width;
[self.lblBadgeValue needsUpdateConstraints];
[self.lblBadgeValue layoutIfNeeded];
  • 进一步解释:
  • sizeToFit->使标签适合高度、宽度和宽度 它的内容
  • 所以在运行时,您需要更新约束高度, 或标签的宽度
  • 在那之后,你需要说“你知道吗?” 这就是需要更新的约束
  • 最后你需要打电话 如果布局在约束上有更改

谢谢!为我工作(我完全删除并创建了新视图,xcode似乎隐式存储了一些布局相关的数据)是的,IB+autolayout现在有很多问题。希望苹果将来能改进它。你能详细解释一下你的代码吗,特别是
alignmentRectForFrame
的使用。我有同样的解决方案,通过对UILabel进行子类化来实现:见我下面的帖子。这项工作很神奇,感谢你简洁地解释为什么它优于
sizeToFit()
。我可以在没有
layoutSubviews()
检查的情况下完成此操作。这很好用。
[self.lblBadgeValue sizeToFit];
self.constraintWidthBadgeLabel.constant =  self.lblBadgeValue.frame.size.width;
[self.lblBadgeValue needsUpdateConstraints];
[self.lblBadgeValue layoutIfNeeded];