在Storyboard中对UIScrollView使用autolayout自动布局应该注意的地方

尝试在Storyboard中对UIScrollView使用autolayout自动布局,遇到了种种麻烦,记录一下
git

一、UIScrollView在StoryBoard中的布局github

在StoryBoard中使用UIScrollView必定要用下图中的这种布局,若是刚开始没想到用UIScrollView后来才想加,能够选中全部Subview而后选择Editor - Embed in - Scroll View,ContentView忘加了也能够相似操做,其它的设置可参考async


二、UIScrollView边距的肯定布局

通常状况下一个View的边距肯定是经过Leading, Trailing, Top, Bottom space肯定的,一般我是使用最快捷的方式:在StoryBoard中右键拖动出View与SuperView的线来选择。可是若是对UIScrollView使用此方法,使其与SuperView边缘重合,即设置边距为0,会发现怎么也和SuperView对齐不了。测试

究其缘由,是由于有一个默认Margin的存在,UIScrollView四周的默认Margin是8。ui

解决方法是:不要用快捷方式,在StoryBoard的右下角,点自动布局第二个的Pin图标,在弹出的小窗口中去掉"Constrain to margins"的勾选,而后将其上的四个边距设置为0spa


三、Content View的约束必定要齐全.net

这个涉及到contentsize的大小,不全的话会出现很奇怪的问题,好比滑动不到底部。设计

当Content View中的内容高度不超过屏幕的高度时,能够设置bottom为1,不然就不会滑动了code

若是遇到提示“Has ambiguous scrollable content height”,就得考虑约束不全的问题了。好比你的scrollview底部有一个动态高度的label,设计为与scrollview bottom的距离为1,与其上的一个控件距离为0,你想着label的高度由scrollview的高度来控制,即依赖scrollview的高度,岂不知scrollview的高度是根据内部subview的高度来计算的,也就是依赖于后者的。这种状况就最好用代码设置contentsize了。

当ContentView中的内容高度超过屏幕的高度时,该怎么布局呢?首先最大的问题超过屏幕的区域怎么在StoryBoard中显示出来,办法是在StoryBoard中修改ViewController的size,以下图:

       

另外一篇文章的经验:UIScrollView 实践经验

UIScrollView 在 Auto Layout 是一个很特殊的 view,对于 UIScrollView 的 subview 来讲,它的 leading/trailing/top/bottom space 是相对于 UIScrollView 的 contentSize 而不是 bounds 来肯定的,因此当你尝试用 UIScrollView 和它 subview 的 leading/trailing/top/bottom 来互相决定大小的时候,就会出现「Has ambiguous scrollable content width/height」的 warning。正确的姿式是用 UIScrollView 外部的 view 或 UIScrollView 自己的 width/height 肯定 subview 的尺寸,进而肯定 contentSize。由于 UIScrollView 自己的 leading/trailing/top/bottom 变得很差用,因此我习惯的作法是在 UIScrollView 和它原来的 subviews 之间增长一个 content view,这样作的好处有:

  • 不会在 storyboard 里留下 error/warning

  • 为 subview 提供 leading/trailing/top/bottom,方便 subview 的布局

  • 经过调整 content view 的 size(能够是 constraint 的 IBOutlet)来调整 contentSize

  • 不须要 hard code 与屏幕尺寸相关的代码

  • 更好地支持 rotation

Sample 中的 AutoLayout 演示了 UIScrollView + Auto Layout 的例子。



四、在代码中修改contentsize

有时候contentsize多是动态的,须要在代码中修改。一般是在ViewController的viewDidAppear方法中setContentsize。

可是在个人项目中发现一个问题,iPhone6/iPhone5测试正常,在iOS6中设置无效,设置时打印contentsize是正常的稍后打印contentsize.height竟然变为0了,真是奇哉怪也。

最后是想起了这篇文章的方法,将setContensize放在dispatch_async(dispatch_get_main_queue(), ^{ });中解决问题


参考:

使用Autolayout建立UIScrollView

UIScrollView使用autolayout技术

相关文章
相关标签/搜索