ios – 什么导致容器视图保持其子视图的框架匹配其边界?

前端之家收集整理的这篇文章主要介绍了ios – 什么导致容器视图保持其子视图的框架匹配其边界?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想更好地了解集装箱视图在故事板中的工作原理.行为似乎是容器视图将强制其子视图调整大小以填充容器.

我没有看到解释它的限制,没有提到什么类.看起来像一些故事板魔术.

我认为容器视图必须是UIView的一个子类,我会有一个野蛮的猜测,并假定它的UIContainerView,但搜索文档只产生两个结果.

那么它如何工作?

解决方法

故事板编辑器(Interface Builder)在编辑期间将嵌入视图的框架设置为容器视图的边界.因此,当故事板写入文件时,视图的序列化大小相同.无论故事板是否启用自动布局,都会发生这种情况.

故事板中每个视图控制器的顶级视图还具有自动调整掩码设置为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的未来版本的前向兼容性,允许顶级故事板视图具有不同的属性.

猜你在找的iOS相关文章