【发布时间】:2014-09-28 09:59:19
【问题描述】:
我的问题与
有关UIView/CALayer: Transform triggers layoutSubviews in superview
据报道,来自苹果的 TSI 回复:
通常,更改视图(或图层)的几何属性会 在视图层次结构中触发一连串的布局失效 因为父视图可能具有涉及的自动布局约束 修改的孩子。请注意,自动布局以某种形式处于活动状态 无论您是否明确启用它。
在我的情况下,我有一个非常简单的视图层次结构,其中视图 A 包含视图 B
在 A 的 layoutSubviews 中,我正在设置 B 的框架。
当我在 B 的支持层上执行动画(变换和不透明度)时,有时会调用 A 的 layoutSubviews。这显然是一个问题,因为我在 A 的 layoutSubviews 中设置了 B 的框架,这会破坏动画。
如何避免B的布局和动画的这种冲突?
【问题讨论】:
-
从您链接到的那个页面:每次我更改转换时,如何避免从超级视图到 layoutSubviews?没有办法绕过这种行为。它是 UIKit 内部簿记的一部分,需要保持视图层次结构一致。
-
(似乎暗示你在动画变换时不能绕过这个)
-
是的,你是对的。很明显,无法绕过这种行为。但这意味着不可能在受自动布局影响的视图和不受影响的视图中划分层次结构。
-
来自UIView documentation:“只有当子视图的自动调整大小和基于约束的行为不能提供您想要的行为时,您才应该覆盖此方法。您可以使用您的实现来设置框架矩形直接访问您的子视图。”我想您可以做的一件事是对动画进行手动条件检查;即,如果 B 正在制作动画,则让此方法跳过 B,使用通过动画调用设置/取消设置的 BOOL 标志
-
我用我找到的围绕这个主题的解决方案添加了一个答案
标签: ios objective-c uiview core-animation autolayout