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