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

时间:2013-06-25 17:30:21

标签: iphone ios uiscrollview uicollectionview uiscrollviewdelegate

正如标题所示,我有一个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;

    }
}

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

感谢。

编辑:解决方案。有一个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;
}

2 个答案:

答案 0 :(得分:3)

在调用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;

}

答案 1 :(得分:1)

使用代表。对CollectionView进行子类化并实现scrollViewDelegate的选择器scrollViewDidScroll:。还要创建一个名为

的新属性
id scrollDistanceDelegate;

现在在子类CollectionView中创建自己的协议。滚动滚动视图时将调用此协议,并将发送滚动的距离。协议选择器可以是:

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

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

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

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

但是应该可以处理。