UIScrollView与AutoLayout

总结一下,最近遇到的UIScrollView与AutoLayout在使用中的一些问题。

UIScrollView之前直接使用的情况比较少,所以对它的原理不是很清楚。这里其他的UIScrollView基础不说了,只说说它的精髓contentSize。

1. contentSize默认情况下width,height都为0.

2. contentSize为0并不会影响它的显示.

3. contentSize小于UIScrollView的frame的size,UIScrollView是不会滑动的.

4. 只需要更新contentSize的大小(保证比自身的frame的size大),就会自动出现滚动条,并不需要调用其他的方法(setNeedsLayout等).


下面说说,在Storyboard中,使用UIScrollView,常见做法。

1. 在View中添加一个UIScrollView.

2. 设置UIScrollView的上下左右边距,都设置为0.


UIScrollView与AutoLayout_第1张图片

3. 添加一个contentView“盖”在UIScrollView上面,并且设置它的上下左右边距为0,View的宽与ScrollView的宽相同,高也相同。


UIScrollView与AutoLayout_第2张图片

4. 然后就可以把自己要添加的View 在添加到contentView上面。

这里有人要问了,为什么要contentView,我直接把view“贴”在scrollView上面不行吗?

我们来看看直接贴到scrollView上面,会出现什么问题。


UIScrollView与AutoLayout_第3张图片

如上图,我们想添加一个view,高度固定120,上边距10,左右边距各为10。往scrollView上面一贴,直接报错。

错误原因:

UIScrollView与AutoLayout_第4张图片

为什么呢?

因为scrollView的contentSize会根据它的子视图进行计算,而这里我们的view左右边距又依赖于scrollView,根本算不出来。所以报错了。

上面的这个原因你可能不信,不过我可以证明给你看。我们把view的宽度固定到200,然后再给一下边距10(这样scrollView就可以计算出contentSize),我们也可以算出,scrollView的contentSize,宽为10(左边距)+ 200(宽度) + 10 (右边距),高为10(上边距)+ 120(高度)+ 10(下边距)。

然后我们运行的结果如下:

UIScrollView与AutoLayout_第5张图片

跟我们的预期结果吻合。



按照上面的步骤设置完成之后,是不是就可以高枕无忧了?

我原来是这样想,后来才发现并不是。

我们首先来归一下类,自定义的View在contentView上面的布局的形式有几种。

1. 高度固定,且总高度没有超过contentView的

这种最简单,直接往上面码就行了。

UIScrollView与AutoLayout_第6张图片

2. 高度都固定,但是总高度超过了contentView

例如下面的,最后一个红色的View都超过了contentView,我们还是先直接码,但是最后发现,并不能拖动。


怎么办?

很简单,设置contentSize,使contentSize的高度大于你的View的总高度就可以滑动了。

- (void)viewDidAppear:(BOOL)animated{

[super viewDidAppear:animated];

_scrollView.contentSize=CGSizeMake(375,2000); //2000是随便设置,保证高度

}


好像是可以滑动了,但是细心一点可以发现,这里其实有一个bug,我们希望contentView总是能够把我们的view完全的“包住”,但是这里,并没有,仔细看上图,黄色的是scrollView,蓝色的是contentView,它并没有将我们的view包住。这里就需要动态的更改一下contentView的高度。

我们直接修改contentView的frame,企图增加它的高度,但是不出意外是失败了。这里我们就不演示了。为什么了,因为我们前面设置它的高度约束,contentView的高度=scrollView的高度。

所以这里我们就需要更改一下contentView的高度约束,然后可以动态的调整它。


然后在运行时更改它

UIScrollView与AutoLayout_第7张图片


完成。

3. 一部分View高度固定,一部分不固定

//TODO: 这个下次再说。

你可能感兴趣的:(UIScrollView与AutoLayout)