iOS自定义分页滚动视图生命周期的控制

思路

就是我们在横向滚动分页视图的的时候,触发横向scrollView 的
scrollViewDidscroll 代理方法,
然后获取到我们我们将要滚动到的那一个分页,
然后执行将要获取的分页的willAppear, 当前分页的viewDidAppear,
并设置将要展示的will-appearIndex, 等到滚动结束的时候,

执行willapperaindex位置的didAppear,

这里有两个重要的点
1 因为我们是在 scrollViewDidscroll 执行willappear的
所有要避免重复执行,:
这里我们通过判断self.willDisappearIndex == -1,因为我们符合条件
执行之后,self.willDisappearIndex就不是-1 了,并在停止滚动之后,将self.willDisappearIndex 置为-1

2 获取将要滚动到的index:
这里我们通过
CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
NSInteger leftIndex = floorf(ratio);
的方法,获取到当前偏移量左边的index,然后和当前的currentIndex
对比,获取到将要展示index.

代码

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  
    if (!scrollView.isDragging && !scrollView.isTracking && !scrollView.isDecelerating) {
        return;
    }
    CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
    NSInteger maxCount = round(scrollView.contentSize.width/scrollView.bounds.size.width);
    NSInteger leftIndex = floorf(ratio);
    leftIndex = MAX(0, MIN(maxCount - 1, leftIndex));
    NSInteger rightIndex = leftIndex + 1;
    if (ratio < 0 || rightIndex >= maxCount) {
        [self listDidAppearOrDisappear:scrollView];
        return;
    }
    if (rightIndex == self.currentIndex) {
        //当前选中的在右边,用户正在从右边往左边滑动
        if (self.listDict[@(leftIndex)] != nil) {
            if (self.willAppearIndex == -1) {
                self.willAppearIndex = leftIndex;
                [self listWillAppear:self.willAppearIndex];
            }
        }
        if (self.willDisappearIndex == -1) {
            self.willDisappearIndex = rightIndex;
            [self listWillDisappear:self.willDisappearIndex];
        }
    }else {
        //当前选中的在左边,用户正在从左边往右边滑动
        if (self.listDict[@(rightIndex)] != nil) {
            if (self.willAppearIndex == -1) {
                self.willAppearIndex = rightIndex;
                [self listWillAppear:self.willAppearIndex];
            }
        }
        if (self.willDisappearIndex == -1) {
            self.willDisappearIndex = leftIndex;
            [self listWillDisappear:self.willDisappearIndex];
        }
    }
    [self listDidAppearOrDisappear:scrollView];
}

当然我们使用ceilf函数也是可以的,但是要注意反过来使用


- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  
  
  if (!scrollView.isDragging && !scrollView.isTracking && !scrollView.isDecelerating) {
        return;
    }
    CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
    NSInteger maxCount = round(scrollView.contentSize.width/scrollView.bounds.size.width);
    NSInteger rightIndex = ceilf(ratio);
    rightIndex = MAX(0, MIN(maxCount - 1, rightIndex));
    NSInteger leftIndex = rightIndex - 1;
    if (ratio < 0 || rightIndex >= maxCount) {
        [self listDidAppearOrDisappear:scrollView];
        return;
    }
    if (leftIndex == self.currentIndex) {
        //当前选中的在右边,用户正在从右边往左边滑动
        if (self.listDict[@(leftIndex)] != nil) {
            if (self.willAppearIndex == -1) {
                self.willAppearIndex = rightIndex;
                [self listWillAppear:self.willAppearIndex];
            }
        }
        if (self.willDisappearIndex == -1) {
            self.willDisappearIndex = leftIndex;
            [self listWillDisappear:self.willDisappearIndex];
        }
    }else {
        //当前选中的在左边,用户正在从左边往右边滑动
        if (self.listDict[@(rightIndex)] != nil) {
            if (self.willAppearIndex == -1) {
                self.willAppearIndex = leftIndex;
                [self listWillAppear:self.willAppearIndex];
            }
        }
        if (self.willDisappearIndex == -1) {
            self.willDisappearIndex = rightIndex;
            [self listWillDisappear:self.willDisappearIndex];
        }
    }
    [self listDidAppearOrDisappear:scrollView];
    }

设置self.willDisappearIndex = -1 避免重复执行

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (!decelerate) {
        // 滑动到一半又取消滑动处理
        if (self.willDisappearIndex != -1) {
            [self listWillAppear:self.willDisappearIndex];
            [self listWillDisappear:self.willAppearIndex];
            [self listDidAppear:self.willDisappearIndex];
            [self listDidDisappear:self.willAppearIndex];
            self.willDisappearIndex = -1;
            self.willAppearIndex = -1;
        }
    }
 
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // 滑动到一半又取消滑动处理
    if (self.willDisappearIndex != -1) {
        [self listWillAppear:self.willDisappearIndex];
        [self listWillDisappear:self.willAppearIndex];
        [self listDidAppear:self.willDisappearIndex];
        [self listDidDisappear:self.willAppearIndex];
        self.willDisappearIndex = -1;
        self.willAppearIndex = -1;
    }
 
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值