UIScrollView的content Inset&O
Inset&Offset&Bounds###
如下图所示,例如上面64pix是一个导航栏,我们的UIScrollView为铺满整屏,此时设置contentInset.top的值为64,这样当app打开时,content的内容就会显示在导航栏的下面,不会被遮挡,这是我们大家最常用的一个常识。
此时的contentOffset的值为(0,-64),这个可能比较让人困惑。
看下图从本质上面解释这个事情。
contentOffset_Inset.png解释一下就是:
在scrollView的滚动世界里,有3点要说明:
- scrollView的bounds.origin为(0,0)处,就是图中content区域的顶点(0,0)是我们的所有参考系,如果我们在UIScrollView中添加子视图,就是参考这个坐标点。
- 而所谓的contentOffset就是UIScrollView当前的bounds的origin值。UIScrollView是通过调整它的bounds来达到滚动的效果
- 如果设置了contentInset,那么UIScrollView的bounds滚动区域得到了扩展,修改了UIScrollView bounds.origin的最大值和最小值,而contentSize大小并没有变化。UIScrollView初始bounds.origin为contentInset左上的顶点处,并且坐标值为相对于我们坐标系content区域的顶点(0,0)的值。
那么很显然上面左图此时UIScrollView的bounds.origin值为contentInset的左上顶点处,而这个值相对于content区域的顶点(0,0)的相对坐标为(0,-64),所以此时的bounds.origin和contentOffset为(0,-64)。
如果scrollView在content区域游动到右边的图片中的样子时,很显然scrollView的origin为正值,此时scrollView.bounds的origin为(100,100)
本质:
无非就是UIScrollVIew调整自身的bounds.origin值,而子视图的绘制是参考UIScrollView bounds.origin (0, 0)处的,达到滚动的效果.
向下滚:origin.y减去某个值,坐标原点(0,0)下移.
向右滚:origin.x减去某个值,坐标原点(0,0)右移.
向上滚:origin.y加上某个值,坐标原点(0,0)上移.
向左滚:origin.x加上某个值,坐标原点(0,0)左移.
contentSize###
它决定了你的UIScrollView能不能滚动。
本质是设置origin的可调整空间,最大值和最小值
。
如果需要UIScrollView滚动你必须根据内容正确的设置contentSize的大小。就是你要告诉UIScrollVIew下图黄色图层的大小是多少。
如果设置不正确:
- 没设置,contentSize为(0,0),不用说,不能滚动。
- 设置太大,content中没有内容的空白部分能够拖动到UIScrollView被显示。
- 设置太小,content下面超出的内容,没办法显示。
- 如果contentSize小于或等于UIScrollView.bounds.size那么不能滚动。
contentSize在缩放zoom过程中的变化####
先上图:
首先 - (UIView * nullable)viewForZoomingInScrollView:(UIScrollView * nonnull) scrollView
通过方法可以指定能够被缩放的VIEW。
在这个例子中我们选中VIEW1为可缩放的对象。此时打印scrollView的contentSize值为VIEW1的frame size。
-
我们缩放VIEW1至右图的值,此时打印scrollView的contentSize值为变化后的VIEW1放大后的frame size的大小(奇怪的是VIEW1的bounds size并没有变化,所以:缩放应该就是transform的效果)**。
-
此时,UIScrollView变的可以滑动,因为contentSize的值大于了UIScrollView的size大小。但是范围为绿色的框框,由于VIEW1的frame值设定Y轴为100,缩放后这个不会变化。
-
结果是,VIEW1放到后只能看到上部分,超出UIScrollView高度的范围不可视,同时也不能滑动向下滑动,因为contentSize的高和UIScrollView的高是一样的。
虽然结果这样,但能反映出导致contentSize是什么,它就是给定了可滚动content区域的一个size值,而且这个区域的顶点坐标为UIScrollView的bounds.origin处,一个点和一个size构成了一个可滚动空间。(如果有contentInset就在此外面再加一圈)
结论:
1. 如果你没有设置contentSize,它的值为0,UIScrollView不可滑动。
2. 如果在UIScrollViewDelegate中设置某个视图为可zoom,那么contentSize的值将等于该视图的被zoom后的大小。