关于contentInset和contentOffset和frame和bounds

frame和bound主要就是坐标系的问题。
frame相对的是父坐标的坐标系:该view在父view的位置和大小
bounds相对的是本身的坐标系:该view在本地坐标系中的位置和大小
详情可参考 ios view的frame和bounds之区别(位置和大小)

说contentInset和和contentOffset的时候就要先说说contentSize

以UIScrollerView举例。contentSize表示的是内容区域的大小。做过广告栏滚动的应该都用过这个属性。可以理解为UIScrollerView有一个子view是ContentView.


然后contentInset和contentOffset应该就是关于内容视图的一些坐标问题了。

contentOffset 是scrollview当前显示区域顶点相对于frame顶点的偏移量。可以理解为contentview的顶点相对于scrollerVIew的frame的偏移量。内容视图向上滚动contentOffset.y>0。

比如我写了一个UIScrollerView上面放了两张图片,初始的时候contentOffset.y==0。

关于contentInset和contentOffset和frame和bounds_第1张图片
contentOffset.y==0

然后向上滚动contentOffset.y>0。

关于contentInset和contentOffset和frame和bounds_第2张图片
contentOffset.y>0

contentInset表示contentView.fram.orgin与scrollerView.fram.orgin的关系。可以类比于css里的padding。
比如scroller.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
则内容视图开始的位置为(0,50)

关于contentInset和contentOffset和frame和bounds_第3张图片
scroller.contentInset = UIEdgeInsetsMake(50, 0, 0, 0)

底部离父view的距离还是不变,下图是拉到最底部的时候

关于contentInset和contentOffset和frame和bounds_第4张图片
scroller.contentInset = UIEdgeInsetsMake(50, 0, 0, 0)

scroller.contentInset = UIEdgeInsetsMake(0, 0, 50, 0);
那么contentView底部离scrollerView底部的距离为50;

下图是拉到最底部的时候


关于contentInset和contentOffset和frame和bounds_第5张图片
scroller.contentInset = UIEdgeInsetsMake(0, 0, 50, 0);

最后做了一个小的demo,利用contentOffset计算来实现UITableView的sectionView跟随滚动并在顶部悬停的效果。
demo github地址

关于contentInset和contentOffset和frame和bounds_第6张图片
contentOffset.gif

你可能感兴趣的:(关于contentInset和contentOffset和frame和bounds)