我没有看到解释它的限制,没有提到什么类.看起来像一些故事板魔术.
我认为容器视图必须是UIView的一个子类,我会有一个野蛮的猜测,并假定它的UIContainerView,但搜索文档只产生两个结果.
那么它如何工作?
解决方法
故事板中每个视图控制器的顶级视图还具有自动调整掩码设置为UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight,无论该故事板是否启用自动布局.
如果启用了自动布局,则每个顶级视图都将其转换为AutotoresizingMaskToConstraints设置为YES.这与这些顶级视图的所有后代不同.所有的后代都将AutotoresizingMaskToConstraints设置为NO.
嵌入关系表示为UIStoryboardEmbedSegue类的一部分. (这是一个私有类,而不是公共API的一部分.)
当UIStoryboardEmbedSegue收到执行消息时,它会加载目标视图控制器的视图,并将其添加为容器视图的子视图.然后将嵌入视图的自动调整Mask设置为UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight.这是多余的,因为Interface Builder已经在故事板中设置了它.
然后 – [UIStoryboardEmbedSegue执行]检查嵌入视图的翻译自动设置MaskToConstraints.这也是多余的,因为Interface Builder将其设置为YES.
如果嵌入视图的翻译AutotoresizingMaskToConstraints为YES,则执行将嵌入视图的框架设置为容器视图的边界.再次,多余.
如果嵌入视图的翻译AutotoresizingMaskToConstraints为NO,执行添加约束H:| [childView] |和V:| [childView] |,因此强制嵌入视图填充容器视图. (是的,它实际上使用视觉格式语言.)这个分支不应该达到.
当视图将AutotoresizingMaskToConstraints设置为YES时,自动布局会自动添加NSAutoresizingMaskLayoutConstraint类型的约束,并在更改视图框架时保持最新.例如,窗口的根视图用于使用自动调整约束填充窗口:
<NSAutoresizingMaskLayoutConstraint:0x7555d00 h=-&- v=-&- UIView:0x7671780.midX == UIWindow:0x7551010.midX>,<NSAutoresizingMaskLayoutConstraint:0x7555de0 h=-&- v=-&- UIView:0x7671780.width == UIWindow:0x7551010.width>,<NSAutoresizingMaskLayoutConstraint:0x7555eb0 h=-&- v=-&- UIView:0x7671780.midY == UIWindow:0x7551010.midY + 10>,<NSAutoresizingMaskLayoutConstraint:0x7555ef0 h=-&- v=-&- UIView:0x7671780.height == UIWindow:0x7551010.height - 20>
所以这就是“导致容器视图保持其子视图的框架与其边界匹配”.
我通过查看.storyboard文件(这是令人惊讶的可读XML),并在Hopper中查看了 – [UIStoryboardEmbedSegue perform].
至于为什么他们有冗余的检查,我可以想到几个可能的原因:
> IB(可能在预发行版本中)并不总是以现在的方式设置视图属性,因此在加载旧故事板时代码不是多余的.>苹果公司有内部工具生成不同于IB的故事板.>该代码是为了与IB的未来版本的前向兼容性,允许顶级故事板视图具有不同的属性.