UICollectionView - 分离 scrollViewDidScroll 和 scrollToItemAtIndexPath

Posted

技术标签:

【中文标题】UICollectionView - 分离 scrollViewDidScroll 和 scrollToItemAtIndexPath【英文标题】:UICollectionView - separating scrollViewDidScroll and scrollToItemAtIndexPath 【发布时间】:2014-08-17 17:32:33 【问题描述】:

我的屏幕有一个日历视图,下面是一个UICollectionView,上面有一个按日期排序的事件列表。

当用户更改日历中的月份时,我使用 UICollectionView scrollToItemAtIndexPath 将集合视图滚动到该月的事件。

当用户滚动浏览UICollectionView 时,我使用scrollViewDidScrollUICollectionView indexPathsForVisibleItems 来检测滚动并更改日历以匹配可见事件的月份。

现在,问题是更改日历月份调用scrollToItemAtIndexPath,它触发scrollViewDidScroll,这会更改日历月份,这......你明白了。

有什么办法可以分开这两个电话吗?我想我想要的只是在用户滚动触发 scrollViewDidScroll 时才调用它,但我对任何其他达到我目标的解决方案都很满意。

【问题讨论】:

【参考方案1】:

UICollectionView 继承自 UIScrollView。因此,您可以访问tracking 属性来确定“用户是否触摸了内容以启动滚动。”

那里看似迟钝的措辞是指用户可能已经开始触摸但尚未开始滚动的事实。但是,如果视图在用户没有开始触摸的情况下滚动,则可以安全地假设为程序化滚动。

【讨论】:

【参考方案2】:

这就是我最终做的 - 感觉很老套,但它确实有效。如果有人有更清洁的方法,我很高兴听到。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    // Don't change calendar month if currently scrolling
    if (scrolling)
        return;

    // change calendar month


- (void)scrollEventsToCurrentMonth 
    // find index path
    // scroll to index path

     scrolling = TRUE;
     [self performSelector:@selector(stoppedScrolling) withObject:NULL afterDelay:0.5];


- (void)stoppedScrolling 
    scrolling = FALSE;

【讨论】:

以上是关于UICollectionView - 分离 scrollViewDidScroll 和 scrollToItemAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

没有二维数组的快速 UICollectionView 部分分离

ios UICollectionView简单说明

复杂的交叉布局架构和关注点分离

Felix/OSGi:如何使用不是 OSGi 服务的 SCR 组件?

安卓手机屏幕录像之scr

全志H3 uboot传参到内核分析,boot.scr文件分析