UICollectionView - 分隔scrollViewDidScroll和scrollToItemAtIndexPath

时间:2014-08-17 17:32:34

标签: ios objective-c cocoa-touch uicollectionview

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

当用户更改日历中的月份时,我会使用UICollectionView scrollToItemAtIndexPath将收藏视图滚动到该月份的活动。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

- (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;
}