【问题标题】:Correct approach (in autolayout) to resize superview and re-layout subviews?调整超级视图大小和重新布局子视图的正确方法(在自动布局中)?
【发布时间】:2014-06-10 05:38:50
【问题描述】:

我正在尝试理解自动布局问题。我有一个小的自定义视图,它本身有一个 imageView 和几个标签。图像是从服务器获取的,并包含一些元数据,以帮助应用程序确定文本应该放置在哪里。现在,我只需要限制标签的宽度(触发自动换行)以避免将文本放在背景中的徽标顶部。

为了使这更容易,我想我可以为这两个标签创建一个包含视图。这样,我可以调整容器的大小,并且(我认为)子视图也会效仿。

我很确定我已经正确设置了约束,因为在我开始摆弄框架之前一切正常:

当从服务器获取图像时,我调整框架的大小如下:

CGRect frame = self.labelContainerView.frame;
frame.size.width = my_limited_width;
self.labelContainerView.frame = frame;

我可以看到容器本身已经调整大小,但它的子视图没有:

为了尝试触发布局,我已经完成了:

[self.labelContainerView setNeedsLayout];
[self.labelContainerView layoutIfNeeded];

... 但这最终只是从 .xib 恢复原始约束。这是一个方便的功能......而且它是我可能需要的......但不是我需要的。

我看到一些帖子暗示在这里调整框架大小是错误的;你应该掌握适当的约束并摆弄它。我试过了:

self.rightMarginConstraint.constant = 150;

...它几乎可以工作:

但在这种情况下,第一个(较大的)标签永远不会超过两行,即使它的高度限制设置为

显然,我对视图、框架和自动布局协同工作的方式了解不够,无法亲自看到解决方案,这就是我在这里问的原因。解决这个问题的正确方法是什么?

【问题讨论】:

  • 如果您使用自动布局,设置框架绝对不是要走的路。你的第二种方法是正确的。关于标签高度问题......它可能与“标签底部空间:字幕”约束有关。字幕标签是否对父视图有底部空间限制?另外,当第一个标签很大时,您希望发生什么?简单的下移字幕?隐藏它?
  • 如果减小宽度,则需要更改容器的高度以腾出空间。你有什么能做到这一点?
  • @Matías R:只需将字幕向下移动即可。字幕标签没有底部空间限制。
  • 简单地将行数设置为0并删除第一个标签中的高度约束(两者)
  • 您是否修改了内容拥抱/抵抗优先级的值?这可能是原因。无论如何,我应该将其发布为答案吗?

标签: ios xcode5 autolayout


【解决方案1】:

正如@MatíasR 在 cmets 中指出的那样,正确的方法是操纵约束而不是直接设置框架。

我将此提交给 Apple 开发者技术支持 (DTS) 并收到了我问题第二部分的答案。当布局发生时,标签需要更新它们的preferredMaxLayoutWidth:

- (void)viewDidLayoutSubviews
{
    self.titleLabel.preferredMaxLayoutWidth = self.titleLabel.bounds.size.width;
    self.subtitleLabel.preferredMaxLayoutWidth = self.subtitleLabel.bounds.size.width;
    [super viewDidLayoutSubviews];
}

我仍然不得不强制一个新的布局,但这很容易:

self.rightMarginConstraint.constant = 150;
[self.labelContainerView setNeedsLayout];
[self.labelContainerView layoutIfNeeded];

感谢 @MatíasR 帮助消除变量。一旦我知道了正确的方法,我就能够向 DTS 提交一段非常具体的示例代码。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多