iOS UIScrollView的 contentInset、contentSize、contentOffset 之间的关系分析

概念以及原理

我们以水平滚动的UIScrollView 为例
以下文中 ‘内容初始点’ 和 ‘bounds初始点’均指的是UIScrollView滚动方向上的点
‘内容初始点’指的是 frame的origin 为CGPointMake(0, 0)
的子视图的初始位置
‘内容结束点’ 和 ‘bounds 结束点’ 同理

contentInset

确定了
UIScrollview 的内容初始点 距离 bound 初始点的距离和
UIScrollView 滚动到最大contentOffset.x 的时候 内容结束点
到bounds 结束点的距离

contentSize

UIScrollView 内容的大小,contentSize.width在UIScrollView滚动方向上的大小和contentInset没有关系,在非滚动方向上等于bounds 的大小减去 contentInset

contentOffset

UIScrollView的偏移量, 在内容初始点和bounds 初始点 重合的时候, contentOffset.x 为0,
由此可知,当contentOffset.x 为0 的时候,内容原点在bounds原点.如果需要内容结束点滚动到bounds 原点,则需要的偏移量为
contentSize.width ,如果内容结束点滚动到bounds 结束点,偏移量为
contentSize.width - bounds.size.width (这是在 内容宽度大于bounds宽度的情况下)

实际应用

需求效果

请添加图片描述

需求分析

使用水平滚动的UICollectionView 来实现这种拖拽到最后的拉伸跳转功能哥哥,我们正常滑动的时候是不能展示出尾部的松开查看更多视图的,只有拖拽的时候才能展示出来,这里我们可以使用区尾来实现,但是如果我们正常地展示区尾,则我们正常的滚动就能滚动到区尾。所以需要我们设置一个contentInset, 是我们不能正常的滚动到区尾,只有拖拽才能看到

代码实现

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section
{
///区尾的宽度
    return CGSizeMake(96, itemHeight);
}
/* 设置collectionView的contentInset, 这里设置-84 
是因为,区尾的宽度是96, contentInset 的84 是
collectionView 正常滚动到最大距离的时候,内容结束点和
bounds结束点之间的距离, 这样保证了 96 - 84 = 12 的在
bounds 之中,为了达到和左边的12 相等的效果
*/
 [collectionView setContentInset:UIEdgeInsetsMake(0, 12 , 0, - 84)];
///修改尾部的样式
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
/*
在滚动方向,contentsize 和 contentInset没有关系
如果内容结束点滚动到bounds 结束点,偏移量为
contentSize.width - bounds.size.width , 
在尾部视图完全展示出来的时候修改文案
*/
    if (scrollView.contentOffset.x > scrollView.contentSize.width  - scrollView.bounds.size.width) {
            self.footerView.selected = YES;
        } else {
            self.footerView.selected = NO;
        }
}

Guess you like

Origin blog.csdn.net/LIUXIAOXIAOBO/article/details/121408638