这是对事物如何工作的分析,我希望我能找到这种行为的解释,而不必阅读整个互联网关于iOS6上的自动布局 .
我有3个类似的场景,如下图所示 . 唯一的区别是它们如何布局视图 viewA
和 viewB
:
1)
2)
3)
在每个场景中,ViewController每秒多次调用 moveGrandchild
方法 . 在该方法中,它抓取一个不是self.view的直接子节点的视图,并为其设置一个新帧 . 新帧仅与 origin.x
值不同 . 人们会期望 viewB
会不断向屏幕的右侧移动,而这正是发生的事情 . 但不同的是,在每个场景中调用 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正在向右执行其连续移动而不会停止 . 仅在第一种情况下, viewA
( viewB
的父级)上的 layoutSubviews
被重复调用 .
当图像显示: // frame set explicitly
时,表示使用 initWithFrame:
创建了视图,并且未创建任何涉及该视图的约束 . 当它显示: // frame determined by autolayout using constraints
时,表示涉及该视图的约束被添加到其父视图中 .
The question is: why is layoutSubviews being called on viewA every time I change frame of viewB in scenario 1 but not on any others?