ios - 为依赖于已解决内部布局的尺寸正确实现 intrinsicContentSize

标签 ios layout uiview uilabel autolayout

我有一个似乎有效的解决方案,但我想确保它是安全的并按预期使用该工具。我可以将我的问题归结为这种情况——我有一个包含多个垂直堆叠的 UILabel 的 UIView。每个标签都可以填充任意文本,这些文本可以垂直包装和扩展标签。在 View 中堆叠标签的自动布局约束是微不足道的。我想要做的是让 UIView 通过 intrinsicContentSize 将其首选高度( View 的高度应适合所有标签)传达给它的所有者。但是,在返回适当的高度之前,需要解决内部布局问题。我的理解是从[super layoutSubviews]返回后保证求解器完成,这就是我在做的:

- (void)layoutSubviews
{
    [super layoutSubviews];

    // solver's complete, now we can measure?
    [self invalidateIntrinsicContentSize];
}

我的intrinsicContentSize 实现引用最后一个标签的框架来计算高度。这一切似乎都适用于我目前的情况,但这让我很紧张。似乎求解器在布置其内部结构时要求当前 View 的 intrinsicContentSize。我不会详细介绍,但我遇到过这种模式进入无限循环的情况。我能够通过调整我的一些布局代码来解决这个问题 - 这并没有激发信心。

有更好的方法吗?这似乎是一件很常见的事情,当我开始解决这个问题时,我认为这就是 intrinsicContentSize 的用途。我所见过的 intrinsicContentSize 的实现一直都是微不足道的——维度的硬编码大小,或者测量不依赖于已解决的内部布局的单个 View 。

请注意,我不能只通过 NSString sizeWith... 方法来测量标签,因为内部布局太复杂了。

请注意,我探索了使用 systemLayoutSizeFittingSize:,但从 intrinsicContentSize 调用它会导致无限循环。

如有任何回应,我们将不胜感激!提前致谢!

最佳答案

我想更新这个线程并结束这个问题 - 我认为这里对于其他可能有类似误解的刚开始使用 AutoLayout 的人来说仍然有值(value)。了解 intrinsicContentSize 的真正目的很重要——这不是典型 View 将其首选大小传达给父 View 的方式。如果一个 View 使用 AutoLayout 对其 subview 进行布局,那么它将使用定义其内部布局的约束来通知其父 View 其大小——具体来说,它将是将 subview 与其父 View 相关联的约束,这将有助于定义 parent 的大小。这实际上是 AutoLayout 中既神奇又令人沮丧的部分 - 它是导致布局的所有这些约束( View 内部和外部)的总和。只有当您的 View 不使用 AutoLayout 来定义其大小(例如 UILabel 或 UIImageView 的经典情况)时,才真正需要固有大小。

我认为与多行文本相关的早期 iOS 错误/不一致导致我走上了 intrinsicContentSize 的道路。多行文本仍然不完美,但希望在 iOS10 中更好。

关于ios - 为依赖于已解决内部布局的尺寸正确实现 intrinsicContentSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19820475/

相关文章:

html - 两个 HTML 元素并排显示但内嵌自动换行

带有 NIB 文件的 iOS UIView 子类不显示 IB 中设计的 UI

iphone - 我的 UIViewController 的中心属性是 "lying"

ios - 以编程方式设置包括安全区域的背景图像 (Swift)

ios - 自定义委托(delegate)找不到声明

javascript - ExtJs 4.1 中的布局

swift - UIView 阴影在 iphone 5s 中不显示

ios - 以编程方式启动和关闭 UINavigationView

ios - 当用户触摸 UIBarButtonItem 时,在 tableView 上显示 UISearchBar

c# - 使组件根据大小变化填充最大空白