在滚动视图中embedded的视图的iOS 7自动布局

这里可能是iOS新手的下一个愚蠢的问题,我正在试验的是滚动和自动布局的东西。

所以我创build了故事板,并添加了一个由滚动视图embedded的视图。 查看有白色背景,我设置滚动查看背景是蓝色的:

在这里输入图像说明

你看到的约束都有0值,以匹配父母。 在肖像模式下一切都很好:

在这里输入图像说明

但是在风景不是,叶子视图不调整和滚动视图(蓝色的一个区域变得可见)

在这里输入图像说明

滚动视图的技巧是在滚动视图和子视图之间添加的自动布局约束将决定滚动视图的contentSize ,而不是子视图本身的大小。 请参阅技术说明TN2154 – UIScrollView和Autolayout 。 这实际上是一个非常有用的function(我们不再需要手动计算/调整contentSize ),但是它使得根据屏幕尺寸调整子视图变得不直观。

如果您希望滚动视图的子视图在从纵向到横向时更改其大小,则可以在滚动视图的子视图和根视图(即在子视图和其超级视图的超级视图之间)之间添加约束。 这不会替代滚动视图和它的子视图(你仍然需要指定滚动视图的contentSize )之间的约束,但补充它,以便子视图改变宽度的根视图。

您可以通过展开文档大纲和控制拖动(或右键单击拖动)从子视图到根视图来执行此操作:

在这里输入图像说明

然后可以指定使其宽度相等:

在这里输入图像说明

当你这样做时,滚动视图的子视图将随着方向改变而改变宽度。 这是一个200点高的子视图,当设备是肖像的recursiveDescription描述:

 (lldb) po [[UIWindow keyWindow] recursiveDescription] <UIWindow: 0x8cbba70; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x8cbbca0>; layer = <UIWindowLayer: 0x8cbb4a0>> | <UIView: 0x8cbd990; frame = (0 0; 320 480); autoresize = RM+BM; layer = <CALayer: 0x8cbd040>> | | <UIScrollView: 0x8cbdb70; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8cc19a0>; layer = <CALayer: 0x8cbd440>; contentOffset: {0, 0}> | | | <UIView: 0x8cbdf00; frame = (0 0; 320 200); autoresize = W+H; layer = <CALayer: 0x8cbdf60>> 

而当我进入景观,最后子视图的宽度自动改变:

 (lldb) po [[UIWindow keyWindow] recursiveDescription] <UIWindow: 0x8cbba70; frame = (0 0; 320 480); autoresize = W+H; gestureRecognizers = <NSArray: 0x8cbbca0>; layer = <UIWindowLayer: 0x8cbb4a0>> | <UIView: 0x8cbd990; frame = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM; layer = <CALayer: 0x8cbd040>> | | <UIScrollView: 0x8cbdb70; frame = (0 0; 480 320); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8cc19a0>; layer = <CALayer: 0x8cbd440>; contentOffset: {0, 0}> | | | <UIView: 0x8cbdf00; frame = (0 0; 480 200); autoresize = W+H; layer = <CALayer: 0x8cbdf60>> 

显然,你也可以用高度做同样的事情。 在这个例子中,我只是有一个高度约束,把高度固定在200点,但是做任何你想要的。

你显然也可以去“旧学校”,并响应布局事件,以编程方式调整子视图的约束,但上述技术无需这样做。