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。
然后向上滚动contentOffset.y>0。
contentInset表示contentView.fram.orgin与scrollerView.fram.orgin的关系。可以类比于css里的padding。
比如scroller.contentInset = UIEdgeInsetsMake(50, 0, 0, 0);
则内容视图开始的位置为(0,50)
底部离父view的距离还是不变,下图是拉到最底部的时候
scroller.contentInset = UIEdgeInsetsMake(0, 0, 50, 0);
那么contentView底部离scrollerView底部的距离为50;
下图是拉到最底部的时候
最后做了一个小的demo,利用contentOffset计算来实现UITableView的sectionView跟随滚动并在顶部悬停的效果。
demo github地址