这是对事物如何工作的分析,我希望我能找到这种行为的解释,而不必阅读整个互联网关于iOS6上的自动布局 .

我有3个类似的场景,如下图所示 . 唯一的区别是它们如何布局视图 viewAviewB

1)

enter image description here

2)

enter image description here

3)

enter image description here

在每个场景中,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正在向右执行其连续移动而不会停止 . 仅在第一种情况下, viewAviewB 的父级)上的 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?