在启用本机分页的情况下查看 UICollectionView 中的上一个/下一个单元格?

Posted

技术标签:

【中文标题】在启用本机分页的情况下查看 UICollectionView 中的上一个/下一个单元格?【英文标题】:Peek previous/next cells in UICollectionView with native paging enabled? 【发布时间】:2018-06-21 11:25:10 【问题描述】:

我想要一个集合视图来翻阅单元格并居中,但显示上一个和下一个单元格的一部分,如下所示:

那里有大量的黑客攻击,但我想通过UICollectionView 的本机分页属性来实现这一点。将单元格设置为集合视图的整个宽度不会显示上一个/下一个单元格,并且使单元格宽度更小不会在分页时对齐到中心。

例如,是否可以将集合视图设为屏幕宽度的 80%,并让上一个/下一个单元格溢出边界(没有剪辑到边界)?

或者任何其他使用本机分页实现此目的的想法?

【问题讨论】:

您可以通过禁用clipsToBounds 来使用滚动视图。这将使它绘制滚动视图之外的内容。之后需要做的是覆盖hitTest,这样它甚至可以检测到超出其界限的触摸(最好在它的超级视图上完成)。但是由于单元格出列,集合视图可能有点问题。如果它需要一点缓冲区(至少在两个方向上加载/保持第一个屏幕外单元格),它可能会起作用,但它也可能是完全严格的,并且一旦单元格离开屏幕就删除它。如果您知道结果,请告诉我们。 另外,如果您正在寻找一个快速的解决方案,并且您不希望显示太多这些单元格,那么可以使用具有堆栈视图的滚动视图轻松完成结果。 我认为没有比手动执行此操作更好的方法了。我在这里发布了代码审查:codereview.stackexchange.com/questions/197017/… 其实可能有。如果我理解正确,您可以将流布局子类化并覆盖方法targetContentOffset(forProposedContentOffset:)。基本上,您禁用分页,但可能会计算使分页生效所需的偏移量。 【参考方案1】:

iOS Swift 4

使用以下两种方法来平滑上一个和下一个屏幕。

private func calculateSectionInset() -> CGFloat 
    let deviceIsIpad = UIDevice.current.userInterfaceIdiom == .pad
    let deviceOrientationIsLandscape = UIDevice.current.orientation.isLandscape
    let cellBodyViewIsExpended = deviceIsIpad || deviceOrientationIsLandscape
    let cellBodyWidth: CGFloat = 236 + (cellBodyViewIsExpended ? 174 : 0)
    let buttonWidth: CGFloat = 50
    let inset = (collectionFlowLayout.collectionView!.frame.width - cellBodyWidth + buttonWidth) / 4
    return inset


private func configureCollectionViewLayoutItemSize() 
    let inset: CGFloat = calculateSectionInset() // This inset calculation is some magic so the next and the previous cells will peek from the sides. Don't worry about it
    collectionFlowLayout.sectionInset = UIEdgeInsets(top: 0, left: inset, bottom: 0, right: inset)
    collectionFlowLayout.itemSize = CGSize(width: collectionFlowLayout.collectionView!.frame.size.width - inset * 2, height: collectionFlowLayout.collectionView!.frame.size.height)

不要忘记在UIViewControllerviewDidLayoutSubviews() 中调用configureCollectionViewLayoutItemSize() 方法。

更详细的参考Click Here

【讨论】:

【参考方案2】:

我认为在启用本机分页的情况下没有一种简单的方法可以做到这一点。 但是您可以通过使用scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 轻松地进行自定义分页来设置您想要的目的地。通过添加一些逻辑,您可以创建分页。 你可以找到例子here和here

【讨论】:

以上是关于在启用本机分页的情况下查看 UICollectionView 中的上一个/下一个单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何在启用分页的情况下实现 UIScrollView 平铺?

在启用分页的情况下将表格视图添加到滚动视图。

UICollectionView 在启用分页的情况下不会滚动完整的 320 点

在启用分页的情况下使两个 UICollectionView 同步滚动

尝试在启用分页的情况下访问 VESA LFB 时出现页面错误

在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化