自己实现pageEnable

2019-07-21  本文已影响0人  学习无底

项目中有个地方需要按页滑动,想了几种方法都没有好好的实现。用系统提供的pagingEnabled需要视图宽高和屏幕一致,效果才理想。

但在项目中看到前人的实现,居然可以完美的实现,很惊讶,就研究下了下。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    self.start = scrollView.contentOffset.x;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSLog(@"decelerate:%d", decelerate);
    self.end = scrollView.contentOffset.x;

    NSInteger index = self.index;
    if (self.end - self.start >= 20) {
        index++;
    }else if (self.start - self.end >= 20) {
        index--;
    }

    if (index < 0) {
        index = 0;
    }
    if (index >= 10) {
        index = 9;
    }
    self.index = index;
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.collView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
    });
}

dispatch_async(dispatch_get_main_queue()这个是关键,没有的话没有效果。- (**void**)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(**inout** CGPoint *)targetContentOffset这个方法中也可以实现同样的效果。

经过打印发现:

异步block我们可以理解为在- (**void**)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(**BOOL**)decelerate这个方法之后执行代码,不加异步是在方法中。在这个方法之后调用- (**void**)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(**BOOL**)animated;,会停止减速,相当于加速减速过程,瞬间完成,并且没有滑动的距离。

上一篇下一篇

猜你喜欢

热点阅读