0

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

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

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 都在不停地向右连续移动。只有在第一种情况下,才会重复调用layoutSubviewson viewA(的父级)。viewB

当图像显示:// frame set explicitly时,这意味着创建了一个视图,initWithFrame:并且没有创建涉及该视图的约束。当它说:// frame determined by autolayout using constraints时,这意味着涉及该视图的约束已添加到其父视图。

问题是:为什么每次我在场景 1 中更改 viewB 的框架时都会在 viewA 上调用 layoutSubviews 而不是在其他任何情况下?

4

0 回答 0