ios - 调整 super View 大小和重新布局 subview 的正确方法(在自动布局中)?

标签 ios xcode5 autolayout

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

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

Screenshot from Xcode

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

Image before fiddling

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

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

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

Resized container with un-resized child views

为了尝试触发布局,我已经完成了:
[self.labelContainerView setNeedsLayout];
[self.labelContainerView layoutIfNeeded];

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

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

...它几乎可以工作:

Adjusted constraint on right edge of superview

但在这种情况下,第一个(更大的)标签永远不会超过两行,即使它的高度约束设置为 <= 非常大。布局系统不会重新计算标签需要多少行。

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

最佳答案

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

我将此提交给 Apple Developer Technical Support (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 提交一段非常具体的示例代码。

关于ios - 调整 super View 大小和重新布局 subview 的正确方法(在自动布局中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23277318/

相关文章:

ios - 如何重新定位隐藏 View 的表格 View 单元格中的标签?

javascript - 检查 React Native 中是否始终启用位置服务(iOS 和 Android 均如此)

swift - 以编程方式自动布局各种尺寸的图像数组

ios - 在React Native中滑动动画

xcode - 将所有 Xcode 设置恢复到原始状态

ios - 无法在 Xcode 5 中设置 SVN

iphone - 更改版本号并在 Xcode 5 中构建

ios - 在 Xcode 7 中使用 AutoLayout 将 5 个 subview 均匀地分布在其父 View 的宽度上

ios - @导入X;导致错误 Could not build module X

objective-c - 使用核心数据的父实体继承和逆关系