🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> 原文:http://www.swiftyper.com/Swift/scrollviewpart1.html # ScrollView 学习笔记 - Part1 `ScrollView`在iOS当中可谓是无处不在,从锁屏画面的滑动解锁到手机的APP列表界面都用到了`ScrollView`,同时它还是两相重量级控件`TableView`以及`CollectionView`的父类。 所以它可以说是相当有分量的一个控件,有必要进行一下系统的学习。 然而在学习`ScrollView`之前,必须要对一个`View`的`Frame`和`Bounds`有清晰的认识,因为这两个属性是理解`ScrollView`的基础。 ## Frame `Frame`指的是一个view以**父视图**的坐标系统为参考系的位置和大小。 ![](https://box.kancloud.cn/2015-11-19_564d445f8b9ea.png) 所以图中绿色view的`Frame`的位置是`(60, 80)`,长和宽都为200. ## Bounds `Bounds`指的是一个view以**自身**的坐标系统为参考系的位置和大小。 事实上,因为`Bounds`始终以自身的坐标系为参考,所以它的位置永远都是`(0, 0)`, 听起来很奇怪,既然它永远是0,我们还要`Bounds`做什么,一个`Frame`不就够了么。表面上,`Bounds`是确实是多余的没错,但是当我们开始改变一个view的`Frame`与`Bounds`的位置的时候,我们就可以听到其中的差别了。 ## 改变Frame ![](https://box.kancloud.cn/2015-11-19_564d446533a46.png) 图中,白色view的`Frame`位置是`(0, 0)`,当我们将它设置为`(60, 80)`的时候,整个view会向右下方移动,这个是比较直观的。 ## 改变Bounds ![](https://box.kancloud.cn/2015-11-19_564d4465e02bc.png) 但是,当我们改变view的`Bounds`的时候,它看起来好像是将`Frame`的位置设置为负数一样,因为它看起来整个view都向左上方跑了,但是事实不是这样的,它整个view的位置都没有改变,而是view里面的内容,不再是从`(0, 0)`的位置开始显示,变成了从`(60, 80)`的位置开始显示,所以左上的部分没有显示在屏幕里面。 这跟`ScrollView`的原理是类似的,当我们“滚动”的时候,我们只是改变了屏幕里显示的内容而已。 ## 总结 `Frame`和`Bounds`是比较容易造成混淆,区别它们的不同点,对于理解`ScrollView`的原理有很大的帮助。在感到困惑的时候,可以画下草图来帮忙理解。