手动滚动显示相同内容的两个UICollectionViews

正如标题所示,我有一个UIViewController与两个UICollectionViews以水平方式显示相同的内容。 主要一次显示一张照片,大拇指显示几张。

我已经重写了UIScrollViewDelegate方法,并添加了一些代码,以便当用户滚动主要的CV,然后拇指CV也滚动。 不过,我想要启用相反的方式(滚动拇指,这将快速移动主)。 不过,我收到了反馈的效果。

这是我的代码片段:

 #pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if(scrollView == self.mainCollectionView){ CGFloat x = self.mainCollectionView.contentOffset.x / self.mainCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.thumbsCollectionView.contentOffset = contentOffset; } else if(scrollView == self.thumbsCollectionView){ // CGFloat x = self.thumbsCollectionView.contentOffset.x / self.thumbsCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 // CGFloat y = 0; // CGPoint contentOffset = CGPointMake(x, y); // self.mainCollectionView.contentOffset = contentOffset; } } 

我想我可以跟踪下/上事件来掩盖什么是允许发生的事情,但在我尝试之前,我想我会看看是否有不同的方式来做到这一点? 我是否忽略了一个可以帮助我的方法?

谢谢。

编辑:解决scheme。 有一个UIScrollViewDelegate方法提供了我需要跟踪哪个布局被触摸。 更新的代码:

 #pragma mark - UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if(scrollView == self.mainCollectionView && self.scrollingView == self.mainCollectionView){ CGFloat x = self.mainCollectionView.contentOffset.x / self.mainCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.thumbsCollectionView.contentOffset = contentOffset; } else if(scrollView == self.thumbsCollectionView && self.scrollingView == self.thumbsCollectionView){ CGFloat x = self.thumbsCollectionView.contentOffset.x / SM_IPHONE_THUMB_CONTAINER_SIZE * self.mainCollectionView.frame.size.width; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.mainCollectionView.contentOffset = contentOffset; } } -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ self.scrollingView = scrollView; } 

当scrollViewWillBeginDragging:被调用时,跟踪当前拖动的滚动视图。

scrollViewDidScroll: ,更新不拖动的滚动视图:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ if(scrollView == self.mainCollectionView && self.mainCollectionView == self.scrollingView){ // new check CGFloat x = self.mainCollectionView.contentOffset.x / self.mainCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.thumbsCollectionView.contentOffset = contentOffset; } else if(scrollView == self.thumbsCollectionView && self.thumbsCollectionView== self.scrollingView){ // new check CGFloat x = self.thumbsCollectionView.contentOffset.x / self.thumbsCollectionView.bounds.size.width * SM_IPHONE_THUMB_CONTAINER_SIZE; // cell width + spacing 48 + 8 CGFloat y = 0; CGPoint contentOffset = CGPointMake(x, y); self.mainCollectionView.contentOffset = contentOffset; } 

使用代表 inheritanceCollectionView并实现scrollViewDelegate的select器scrollViewDidScroll :. 还要创build一个名为的新属性

 id scrollDistanceDelegate; 

现在在子类CollectionView中创build自己的协议。 该协议将在滚动视图滚动时被调用,并将发送滚动的距离。 所以协议select器可以是:

 scrollView: (UIScrollView *) sv didScrollADistance: (CGFloat) distance 

所以,现在在scrollViewDidScroll:select器中,当滚动视图滚动时,它将计算距离。 然后调用scrollDistanceDelegate的scrollView:didScrollDistance:方法。

此时,顶部CollectionView的scrollDistanceDelegate将被设置为底部CollectionView,底部CollectionViews的scrollDistancedelgate将被设置为顶部CollectionView。

所以现在当一个CollectionView滚动时,另一个会滚动。 我看到的唯一问题是反馈回路。 一个滚动,另一个滚动,它告诉第一个滚动….

但这应该能够被处理。