我继承了一个过于复杂的项目(所以我不知道所有的内部工作原理),我遇到了一个错误。我的应用程序的某些部分使用 CATransaction 完成了一些较长的动画,并且似乎导致在动画处于活动状态时重复调用 layoutSubviews。这在 ios5 上不会发生,并且一切看起来都正确,但在 ios6 上它被称为不间断并干扰了视图的许多布局。堆栈跟踪全部隐藏/变灰,但它似乎开始于CA::Transaction::commit()
ios版本之间的CATransaction有什么变化导致这样的事情吗?
我继承了一个过于复杂的项目(所以我不知道所有的内部工作原理),我遇到了一个错误。我的应用程序的某些部分使用 CATransaction 完成了一些较长的动画,并且似乎导致在动画处于活动状态时重复调用 layoutSubviews。这在 ios5 上不会发生,并且一切看起来都正确,但在 ios6 上它被称为不间断并干扰了视图的许多布局。堆栈跟踪全部隐藏/变灰,但它似乎开始于CA::Transaction::commit()
ios版本之间的CATransaction有什么变化导致这样的事情吗?
看到这篇文章:UIView/CALayer:Transform triggers layoutSubviews in superview
Apple 通过 TSI 回复了我:
为什么我会看到这种行为?这是不一致还是我误解了一些核心概念?
每当系统感觉发生了变化,需要视图重新计算其子视图的框架时,视图就会被标记为布局。这可能比您预期的更频繁地发生,并且恰好在系统选择将视图标记为需要布局是实现细节时发生。
为什么它会向上级联视图层次结构?
通常,更改视图(或图层)的几何属性将触发视图层次结构上的一连串布局失效,因为父视图可能具有涉及修改的子视图的自动布局约束。请注意,无论您是否明确启用它,自动布局都以某种形式处于活动状态。
每次更改转换时,如何避免将超级视图转换为 layoutSubviews?
没有办法绕过这种行为。它是 UIKit 内部簿记的一部分,需要保持视图层次结构一致。
听起来像一个自动布局问题。视图或其任何子视图是否使用自动布局?自动布局很好,但看起来不是非常快速和高效,因此在制作动画时可能会导致问题。
当然,如果视图的一个形状的大小以影响子视图放置或大小的方式发生变化,则可能需要在动画中的每个步骤中布置子视图。考虑动画和它有什么效果。