美文网首页
scrollView中contentSize、contentIn

scrollView中contentSize、contentIn

作者: pluskok | 来源:发表于2019-06-03 10:36 被阅读0次

    转 ( 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的重要属性内边距

    相关文章

      网友评论

          本文标题:scrollView中contentSize、contentIn

          本文链接:https://www.haomeiwen.com/subject/qpwqxctx.html