捏合手势扩展UICollectionView单元格

5
我正在开发的应用程序需要一个与iPad上的照片应用程序非常相似的布局。有一个 UIView 的网格,用户应该能够将其缩小到单个视图中,并在缩小时观察该视图增大直至全屏。
到目前为止,我已经设置了一个 UICollectionViewController 和一个自定义集合视图单元格。我将捏合手势识别器添加到了自定义单元格中。当用户进行捏合操作时,单元格会增大。
我现在遇到的问题是,随着单元格的扩展,它并没有覆盖所有其他单元格。相反,它被隐藏在之后加载的单元格下面。
我想解决的办法是,当集合视图控制器识别到捏合手势时,它可以隐藏正在被捏合的单元格。然后,创建一个新的 UIView,它是集合视图单元格的副本,其边界等于单元格所放置的位置。然后,这个视图就可以被捏合、旋转和平移。一旦用户结束手势,视图将只需动画返回到原始单元格位置,然后被设置为nil
但是,我不确定这是否是最佳解决方案,也许有一些简单的方法可以确保某个单元格覆盖在集合视图的所有其他单元格之上。
下面是我当前实现的一小部分代码片段,用于展示如何缩放单元格。这就是导致单元格在扩展时隐藏在后续单元格下面的问题所在。
 @objc func scalePiece(_ gestureRecognizer : UIPinchGestureRecognizer) {
    guard gestureRecognizer.view != nil else { return 

    if gestureRecognizer.state == .began || 
       gestureRecognizer.state == .changed {

        gestureRecognizer.view?.transform = (gestureRecognizer.view?.transform.scaledBy(x: gestureRecognizer.scale, y: gestureRecognizer.scale))!

        gestureRecognizer.scale = 1.0

    }
}

尝试过使用 bringSubviewToFront(_:) 吗?需要对集合视图本身的引用... 不完全确定其全部影响。 - jscs
也许可以使用 Z 索引? - Julian Silvestri
bringSubviewToFront完成了任务!谢谢Josh! - P. B.
那其实不是问题的关键点,对吧?你的问题更多关于“最佳实践”。 - LinusGeffarth
是的,最好是关于最佳实践。我在考虑这些解决方案之间的性能差异,似乎bringSubviewToFront()似乎是计算成本最低的。 - P. B.
显示剩余2条评论
1个回答

1
一种简单的解决方案是在集合视图上调用bringSubviewToFront(_:),并传递需要置于最前面的单元格,以解决单元格在其他单元格后面的问题。
但需要注意的是,由于您实际上不拥有单元格/集合视图的层次结构,通常情况下不应直接触摸子视图。
另一种相关性更强的可能性是自定义布局。由于集合视图的UICollectionViewLayout对象可以指定特定单元格的zIndex, 因此可以在捏合手势开始时重新加载单元格并仅更新该单元格的Z索引。

在最佳实践方面,单元格扩展的手势识别器应该放置在UICollectionViewController下还是自定义集合视图单元格中? - P. B.
在这种情况下,我认为它应该放在集合视图本身。缺点是你必须弄清楚哪个单元格被点击了。 - jscs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接