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

Posted

技术标签:

【中文标题】手动滚动显示相同内容的两个 UICollectionView【英文标题】:Manually scrolling two UICollectionViews showing the same content 【发布时间】:2013-06-25 17:30:20 【问题描述】:

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

我重写了UIScrollViewDelegate 方法并添加了一些代码,这样当用户滚动主CV 时,拇指CV 也会滚动。但是,我也想启用相反的功能(滚动拇指将快速移动主体)。但是我得到了反馈效果。

这是我的代码 sn-p:

#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;

【问题讨论】:

【参考方案1】:

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


【讨论】:

谢谢。这就是我想做的事情,尽管我打算继承 UICollectionViews 并跟踪它们的触摸事件以跟踪哪个正在主动滚动。在我修正了偏移量的数学之后,您提供的委托方法效果很好。【参考方案2】:

使用委托。子类化 CollectionView 并实现 scrollViewDelegate 的选择器 scrollViewDidScroll:。同时创建一个名为

的新属性
id scrollDistanceDelegate;

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

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

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

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

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

但这应该是可以处理的。

【讨论】:

以上是关于手动滚动显示相同内容的两个 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

使表格内容响应屏幕大小

两个ListView(元素高度不同)滚动定位

如何停止正文内容显示在页脚内容及下方

单击元素时滚动可滚动div内的内容

实现一组图片循环且首尾相连的滚动效果

如何将两个数据表内容的滚动同步在一起(ag-grid)