scrollView中contentSize、contentInset和contentOffset知识点回顾

一、概述
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的重要属性内边距

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值