UICollection 的镜像滚动

Posted

技术标签:

【中文标题】UICollection 的镜像滚动【英文标题】:Mirror scrolling of UICollection 【发布时间】:2013-04-10 05:32:47 【问题描述】:

我创建了一个具有自定义布局的 UICollection,以允许垂直和水平滚动。它是一个由相等部分和每个部分中的项目组成的网格(即 10 x 10、20 x 20 等)。我希望能够放置两个仍然可见的标题,一个在顶部,一个在左侧。我还没有找到在 UICollection 本身中执行此操作的方法。因此,我在左侧设置了 UICollection,在顶部设置了另一个。但是,当用户左右和/或上下滚动网格时,我希望这两个集合能够反映这些移动。

所以,我的问题是:有没有办法将主 UICollection 的水平移动镜像到顶部 UICollection,然后将主 UICollection 的垂直移动镜像到侧面 UICollection?

谢谢!

【问题讨论】:

【参考方案1】:

UICollectionViewUIScrollView 的子类。它向其委托发送UIScrollViewDelegate protocol 中定义的所有消息。

您要回复的消息是scrollViewDidScroll:。当您的主集合视图发送此消息时,您希望通过获取其contentOffset 并将偏移量应用于您的边距集合视图来响应它。

// Implement this in your main collection view's delegate.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    [self synchronizeCollectionViewContentOffsets];


- (void)synchronizeCollectionViewContentOffsets 
    CGPoint offset = self.mainCollectionView.contentOffset;
    self.leftMarginView.contentOffset = CGPointMake(0, offset.y);
    self.topMarginView.contentOffset = CGPointMake(offset.x, 0);

【讨论】:

当视图首次显示时,它会自动滚动到主 UICollectionView 中的特定单元格,这确实会触发 scrollViewDidScroll 方法,然后触发 synchronize 方法;然而,在第一行创建的偏移点基本上是 0,0,即使它滚动到的点甚至不接近那个点。当我尝试滚动网格时也是这种情况。创建的偏移点始终为 1.343243x-34 或类似的值。【参考方案2】:

所以,我想通了。使用 self.mainCollectionView.contentOffset 总是返回 (0,0),所以尝试使用我通过 Storyboard 和视图控制器实际分配给它的对象名称。这行得通。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
    [self synchronizeCollectionViewContentOffsets];


-(void)synchronizeCollectionViewContentOffsets 
    CGPoint offset = myCollectionView.contentOffset;
    myLeftMargin.contentOffset = CGPointMake(0, offset.y);
    myTopMargin.contentOffset = CGPointMake(offset.x, 0);

myCollectionView、myLeftMargin 和 myTopMargin 通过 Storyboard 链接到 UICollectionView。

【讨论】:

以上是关于UICollection 的镜像滚动的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-UICollection实现轮播图片自动循环滚动功能

UICollection 单元格快速混合

如何在 UICollectionView 中快速添加分页?

如何在 iOS swift 中的 ARSCNView 中显示 uicollection 视图

触摸 CollectionView 时禁用动画?

如何同步 UICollectionViewCell 内的 UITableView 之间的滚动(在 UICollectionViewController 内)