这是对事情如何运作的分析,我希望我能找到这种行为的解释,而不必阅读关于iOS6 +上的自动布局的整个互联网。
我有3个类似的场景,如下图所示。唯一的区别是他们如何布置观看次数viewA
和viewB
:
1)
2)
3)
在每个场景中,ViewController每秒多次调用moveGrandchild
方法。在该方法中,它抓取一个不是self.view的直接子节点的视图,并为其设置一个新帧。新帧仅与{1}}值不同。人们会期望origin.x
会不断向屏幕的右侧移动,这正是发生的事情。但不同的是,在每个场景中调用viewB
时。
以下是每种方案的控制台输出:
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
(layoutSubviews
的父级)viewA
被重复调用。
当图像显示:viewB
时,表示视图是使用// frame set explicitly
创建的,并且没有创建涉及该视图的约束。当它显示:initWithFrame:
时,表示涉及该视图的约束被添加到其父视图中。
问题是:为什么每次我在场景1中更改viewB的框架时都会在viewA上调用layoutSubviews而不是其他任何框架?