Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在启用本机分页的UICollectionView中查看上一个/下一个单元格?_Ios_Uicollectionview_Uicollectionviewlayout - Fatal编程技术网

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

Ios 在启用本机分页的UICollectionView中查看上一个/下一个单元格?,ios,uicollectionview,uicollectionviewlayout,Ios,Uicollectionview,Uicollectionviewlayout,我希望集合视图可以在单元格之间翻页并居中显示,但显示上一个单元格和下一个单元格的一部分,如下所示: 有很多黑客攻击,但我想通过UICollectionView的本机分页属性来实现这一点。将单元格设置为集合视图的全宽不会显示上一个/下一个单元格,而将单元格宽度设置为较小也不会在分页时对齐中心 例如,是否可以将集合视图设置为屏幕宽度的80%,并让上一个/下一个单元格出血到边界之外(没有剪辑到边界) 或者使用本机分页实现这一点的任何其他想法?我认为启用本机分页并不是一种简单的方法。 但是,通过使用

我希望集合视图可以在单元格之间翻页并居中显示,但显示上一个单元格和下一个单元格的一部分,如下所示:

有很多黑客攻击,但我想通过
UICollectionView
的本机分页属性来实现这一点。将单元格设置为集合视图的全宽不会显示上一个/下一个单元格,而将单元格宽度设置为较小也不会在分页时对齐中心

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


或者使用本机分页实现这一点的任何其他想法?

我认为启用本机分页并不是一种简单的方法。 但是,通过使用
ScrollViewWillendDraging(\uScrollView:UIScrollView,withVelocity:CGPoint,targetContentOffset:UnsafeMutablePointer)设置所需的目标,您可以轻松地进行自定义分页。通过添加一些逻辑,您可以创建分页。

您可以找到示例和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)
}
不要忘记在
UIViewController的
viewDidLayoutSubviews()
中调用
configureCollectionViewLayoutItemSize()
方法


有关更详细的参考信息

您可以通过禁用
clipstobunds
使用滚动视图进行操作。这将使它绘制出滚动视图之外的内容。之后需要做的是覆盖
hitTest
,这样它甚至可以检测到超出其边界的触摸(最好在它的superview上完成)。但是集合视图可能会有点问题,因为单元将退出队列。如果需要一点缓冲(在两个方向上加载/保持至少第一个屏幕外单元格),它可能会起作用,但也可能是完全严格的,一旦单元格离开屏幕,就将其移除。如果您发现了结果,请告诉我们。此外,如果您正在寻找快速解决方案,并且您不希望显示太多的单元格,那么可以使用具有堆栈视图的滚动视图轻松完成结果。我认为没有比手动完成此操作更好的方法。我在这里发布了一篇代码评论:实际上可能有。如果我理解正确,您可以将flow layout子类化并重写方法
targetContentOffset(forProposedContentOffset:)
。基本上,您禁用了分页,但可以计算分页生效所需的偏移量。