转 ( https://blog.csdn.net/cyuyanenen/article/details/52096134)
一、概述
IOS中,UIScrollView是可以滚动的视图,它有两个子类,分别是UITableView和UITextView。UIScrollView有三个容易让人混淆的属性变量:
contentSize、contentInset和contentOffset。
二、具体比较
1、首先,UIScrollView有一个frame属性,一般为整个手机屏幕或者手机屏幕上某一块固定的区域,总之,我们看到的UIScrollView的大小实际就是其frame的大小,这一块区域设定后就是固定不动的。
2、contentSize 即scrollview可以滚动的区域,通过滚动,该contentSize范围内的视图都可以在UIScrollView的frame内看到。其属性类型如下:
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
假如一个scrollview的frame为(0,0,320,480),而它的contentSize为(320,960),即要通过上下滑动scrollview来查看(320,480)后的内容。
3、contentOffset 用来记录scrollview的滚动位置,即scrollview的contentSize区域顶点相对于frame顶点的偏移量。其属性类型为:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
小记:CGFloat offsetY = scrollView.contentOffset.y;
假设初始时contentSize区域的顶点和frame的顶点重合,那么当scrollview向下拉时,offsetY为负数;当上拉时,offsetY为正数,并不断增大。因为contentOffset代表的是偏移量,即相当于用“frame的顶点坐标(x1, y1)“减去“当前位置contentSize的顶点坐标(x2, y2)“,所以才有上述规律。
4、contentInset
<1> contentView是scrollview的内容显示区域,一般情况下和scrollview的contentSize保持一致;
<2> contentInset标识了contenView开始显示的位置,通过它可以为UIScrollView增加额外的滚动区域。(上,左,下,右)逆时针;
其属性类型为:
typedef struct UIEdgeInsets {
CGFloat top, left, bottom, right;
} UIEdgeInsets;
<3> contentInset的API文档的解释是”内容视图嵌入到封闭的滚动视图的距离”,可以理解为contenView(内容视图)的上下左右四个边扩展出去的大小。contentInset的单位是UIEdgeInsets,默认值为UIEdgeInsetsZero,也就是没有扩展的边。(这个属性和css中的margin属性类似)
<4> 默认情况下,scrollview的contentInset属性值为UIEdgeInsetsZero,不论scrollview的contentInset属性值是否为0,都不会对scrollview的contentOffset属性造成影响;
<5> 常用于判断scrollview是否滑动到底部的方法:
第一种:(只考虑scrollView的contentSize区域是否滑动到了底部)
// 第一种表达方式
contentSize.height - contentOffset.y <= frame.size.height
// 第二种表达方式(当前显示的控制器中有tabBar时)
scrollView.contentSize.height - scrollView.contentOffset.y <= self.view.height - self.tabBarController.tabBar.height;
第二种:(考虑整个scrollView的区域是否滑动到了底部,包括了scrollview的contentInset区域)
// 第一种表达方式
self.scrollView.contentSize.height + self.scrollViewOriginalInset.bottom + self.scrollViewOriginalInset.top - self.scrollView.frame.size.height >= 0;
// 第二种表达方式
contentOffset.y + frame.size.height – contentInset.bottom = size.height;
// 第三种表达方式
scrollView.contentOffset.y >= scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.height - self.tableView.tableFooterView.height;
5、小记
contentInset:除具体内容以外的边框尺寸(相当于为contentSize四周增加一定宽度的边框,只能看,不能放内容,只是增加了contentSize的滚动范围);
contentSize: 里面的具体内容(header、cell、footer),除掉contentInset以外的尺寸;
contentOffset:
(1)它可以用来判断scrollView滚动到什么位置;
(2)指scrollView的内容(contentSize)超出了scrollView的(frame)顶部的距离(除掉contentInset以外的尺寸);
拓展阅读:
(1)contentSize、contentOffset和contentInset的图解辨别
(2)谈谈 tableView的重要属性内边距