iOS 7自动布局视图嵌入在滚动视图中

时间:2014-03-31 18:48:54

标签: ios iphone uiview uiscrollview autolayout

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

所以我创建了故事板并添加了一个通过滚动视图嵌入的视图。视图有白色背景,我将滚动视图背景设置为蓝色:

enter image description here

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

enter image description here

但是在风景中没有,叶子视图没有调整大小和滚动视图(右边的蓝色区域变得可见)

enter image description here

1 个答案:

答案 0 :(得分:2)

滚动视图的技巧是您在滚动视图及其子视图之间添加的自动布局约束将指示滚动视图的contentSize,而不是子视图本身的大小。见Technical Note TN2154 - UIScrollView And Autolayout。这实际上是一个非常有用的功能(我们不再需要手动计算/调整contentSize),但这使得根据屏幕尺寸调整子视图大小是不直观的。

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

您可以通过将文档大纲和 control -dragging(或右键单击拖动)从子视图扩展到根视图来完成此操作:

enter image description here

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

enter image description here

执行此操作时,滚动视图的子视图将随着方向的改变而改变宽度。当设备处于纵向时,这是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磅,但做任何你想做的事。

你显然也可以去老学校&#34;并响应布局事件以编程方式调整子视图的约束,但上述技术消除了这样做的需要。