【问题标题】:Using Auto Layout to position a self-resizing view使用自动布局来定位自调整大小的视图
【发布时间】:2014-03-22 01:08:00
【问题描述】:

我有一个自定义视图,它实现了sizeThatFits:,并且偶尔会调整自身的大小(它会根据宽度调整高度)。我想使用自动布局将此视图(“A”)放置在其兄弟(“B”)之上,因此我有一个约束,将 A 的底部设置为 B 的顶部。

虽然 A 的框架确实会扩大和缩小,但 B 的框架不会随之移动。实现可与 Auto Layout 一起使用的自调整视图的推荐方法是什么?

【问题讨论】:

    标签: cocoa ios7 uikit autolayout


    【解决方案1】:

    您不能手动设置 A 的大小;这会破坏自动布局(并且在布局发生时自动布局将覆盖它)。您必须实现此视图的intrinsicContentSize 并使用它来指定视图的大小。现在,当需要调整 A 的大小时,调用它的 invalidateIntrinsicContentSize。这将导致执行布局。 intrinsicContentSize 将被调用,并且约束将运行(因为布局正在以良好的顺序执行)。

    还有一件事:听起来您可能未充分确定此处的约束条件。您不能只是将 A 置于 B 之上;你必须说,除了它的大小,它的顶部和左侧(或它的中心,水平和/或垂直)。换句话说,一旦你做了自动布局,你必须一直这样做。否则事情不会如你所愿。

    【讨论】:

    • 我的自定义视图的高度由它的宽度决定(它正在布置文本)但intrinsicContentSize 不像sizeToFit: 那样给我一个矩形。我正在考虑像 UILabel 那样公开一个名为 preferredMaxLayoutWidth 的属性。如果一切按计划进行,我将得到一个确定其自身高度的视图,并且使用该视图的代码可以使用约束来指定其宽度和位置。
    • 听我说。如果要使用自动布局,则不能使用矩形定位此视图并设置其框架。不可以。您必须使用约束来定位其 x 和 y。这只留下大小(高度和宽度),intrinsicContentSize 会给你这些。如果宽度是固定的,那么也给它一个宽度约束(或一个尾随约束),并返回 UIViewNoIntrinsicMetric 为您从 intrinsicContentSize 返回的大小的宽度。
    • 我想我明白你在说什么。我计划使用约束来指定我的自定义视图的位置,但是我的自定义视图需要知道它的宽度才能计算它在intrinsicContentSize 中的高度。 Apple 文档说“这个固有大小必须独立于内容框架”,所以我想我会借用 UILabel 公开 preferredMaxLayoutWidth 属性的方法作为获取宽度以计算高度的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多