ScrollView的几个重要的属性

contentSize://滚动范围,内容的尺寸
contentInset://内边距
contentOffset://偏移量(scrollView.bounds.originbounds://以自己内容的左上角为坐标原点,scrollView矩形框的位置个尺寸
frame://以父控件内容的左上角为坐标原点,scrollView矩形框的位置和尺寸

以上是scrollView的几个重要的属性,接下来结合scrollView的子类tableView,来真正的搞明白它们之间的联系,把下面几种情况搞清楚了,再涉及到这方面的问题,基本上没有搞不定的。

关于tableView的cell,tableHeaderView tableFooterView contentInset(内边距),contentOffset(偏移量),contentSize(滚动范围)的综合解释

以求偏移量为例

偏移量=内容顶部与tableView的顶部之差
第一种情况:
  • 没有cell,没有tableHeaderView,没有tableFooterView,没有内边距,什么都没有了,所以内容(可以滚动的范围size),只能和frame大小相同
第二种情况:
  • 没有cell,没有tableHeaderView,没有tableFooterView,没有内边距,有其它的子控件,然后并没有卵用,内容还是那么大小 和 第一种情况一样
    这里写图片描述
第三种情况:
  • 没有cell,没有内边距,有tableHeaderView,有tableFooterView,头部视图和尾部视图也是内容(size)的一部分,所以当没有cell的时候,滚动范围size的大小就是它们两个的和,当其和大于frame的时候,就可以滚动,滚动产生的偏移量就是下面
    这里写图片描述
第四种情况:
  • 没有tableHeaderView,没有tableFooterView,没有内边距
    有cell 那么滚动产生的偏移量就是size的顶部减去frame的顶部
    这里写图片描述
第五种情况:
  • 没有tableHeaderView,没有tableFooterView
    有cell 有内边距Inset
  • 内边距与内容没有半毛钱的关系,如果有的话,也就是内边距紧紧挨着内容(cell或者头部视图), 毕竟大家都姓内,所以,求所求的偏移量的大小,与内边距无关
    这里写图片描述
第六种情况:
  • 没有内边距,有cell,有tableHeaderView,有tableFooterView
    头部视图与尾部视图都属于内容 所以所求的偏移量一定会与它们有关系的
    这里写图片描述
第七种情况:
  • 没有tableHeaderView,没有tableFooterView,没有内边距
    有cell 有自己添加的其它子控件 添加的子控件不会添加到内容中 所以对于偏移量来说 也没什么卵用
    这里写图片描述
第八种情况:
  • 有cell,有tableHeaderView,有tableFooterView,有内边距
    这里写图片描述
第九种情况:
  • 有cell,有内边距 有自己的子控件,这种情况下,子控件可以会与内边距的位置重叠
    这里写图片描述
第十种情况:
  • 什么都有
    这里写图片描述
最后总结

1.偏移量的变化 只与 内容 和 frame 有关
而内容与头部视图尾部视图有关 所以偏移量与头部尾部视图有关
2.添加的子控件 的原点是内容的原点
3.内边距只有一个功能 : 改变内容的显示位置 只是一个梯子而已

上面运用在tableView头部下来刷新

static BOOL willRefreshing; // 是否要即将刷新
static BOOL refreshing; // 是否正在刷新

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (refreshing) return;

    if (scrollView.contentOffset.y <= - (NavMaxY + TitlesViewH + 65)) {
        willRefreshing = YES;
        self.header.backgroundColor = [UIColor redColor];
    } else {
        willRefreshing = NO;
        self.header.backgroundColor = [UIColor blueColor];
    }
}

/**
 *  手松开就会调用这个方法
 */
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (refreshing) return;

    if (willRefreshing) { // 进入刷新状态
        refreshing = YES;

        self.header.backgroundColor = [UIColor yellowColor];

        // 增加内边距:让header停留住
        [UIView animateWithDuration:0.25 animations:^{
            UIEdgeInsets inset = scrollView.contentInset;
            inset.top += 65;
            scrollView.contentInset = inset;
        }];

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            self.header.backgroundColor = [UIColor blueColor];

            // 恢复内边距:让header回去
            [UIView animateWithDuration:0.25 animations:^{
                UIEdgeInsets inset = scrollView.contentInset;
                inset.top -= 65;
                scrollView.contentInset = inset;
            }];

            // 刷新完毕
            refreshing = NO;
        });
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值