这是对事情如何工作的分析,我希望我能找到这种行为的解释,而不必阅读整个互联网关于 iOS6+ 上的自动布局。
我有 3 个类似的场景,如下图所示。唯一的区别是它们如何布局视图viewA
和viewB
:
1)
2)
3)
在每种情况下,ViewControllermoveGrandchild
每秒都会调用几次方法。在该方法中,它获取一个不是 self.view 的直接子视图的视图,并为其设置一个新框架。新框架与前一个框架的不同之处仅在于origin.x
值。人们会期望 aviewB
会不断地向屏幕右侧移动,而这正是发生的情况。但是,不同之处在于在每种情况下何时layoutSubviews
调用。
以下是每个场景的控制台输出:
1)
2013-11-08 11:31:27.048 ProbaAutoLayout[3641:907] VC viewDidLayoutSubviews
2013-11-08 11:31:27.052 ProbaAutoLayout[3641:907] ViewA layoutSubviews
2013-11-08 11:31:27.054 ProbaAutoLayout[3641:907] ViewB layoutSubviews
2013-11-08 11:31:27.240 ProbaAutoLayout[3641:907] ViewA layoutSubviews
2013-11-08 11:31:27.439 ProbaAutoLayout[3641:907] ViewA layoutSubviews
2013-11-08 11:31:27.639 ProbaAutoLayout[3641:907] ViewA layoutSubviews
...无限重复...
2)
2013-11-08 11:34:06.532 ProbaAutoLayout[3658:907] VC viewDidLayoutSubviews
2013-11-08 11:34:06.536 ProbaAutoLayout[3658:907] ViewA layoutSubviews
2013-11-08 11:34:06.539 ProbaAutoLayout[3658:907] ViewB layoutSubviews
3) 同 2)
在每种情况下,viewB 都在不停地向右连续移动。只有在第一种情况下,才会重复调用layoutSubviews
on viewA
(的父级)。viewB
当图像显示:// frame set explicitly
时,这意味着创建了一个视图,initWithFrame:
并且没有创建涉及该视图的约束。当它说:// frame determined by autolayout using constraints
时,这意味着涉及该视图的约束已添加到其父视图。
问题是:为什么每次我在场景 1 中更改 viewB 的框架时都会在 viewA 上调用 layoutSubviews 而不是在其他任何情况下?