【问题标题】:Pinch gesture to expand a UICollectionView Cell捏手势以展开 UICollectionView 单元格
【发布时间】:2019-06-11 23:04:02
【问题描述】:

我正在开发的应用程序需要与 iPad 上的照片应用程序非常相似的布局。有一个UIViews 的网格,用户应该能够捏合到一个网格中,当他们捏合时,观察该视图的大小直到全屏。

到目前为止,我已经设置了一个UICollectionViewController 和一个自定义集合视图单元格。我将捏合手势识别器添加到自定义单元格中。当用户捏合时,单元格会变大。

我现在遇到的问题是,当它扩展时,单元格并没有在所有其他单元格之上分层。相反,它隐藏在它之后加载的单元格之下。

我在想解决方案可能是当集合视图控制器识别出捏合手势时,它可以隐藏被捏合的单元格。然后,创建一个新的UIView,它是集合视图单元格的副本,其边界与放置单元格的位置相同。然后,该视图可以是可以捏合、旋转和平移的视图。一旦用户结束手势,视图就会动画回到原来的单元格位置,然后设置为nil

但是,我不确定这是否是最佳解决方案,也许有一些简单的方法可以确保某个单元格位于集合视图中的所有其他单元格之上。

下面显示了我当前实现如何缩放单元格的 sn-p 代码。这是导致单元格在扩展时隐藏在后面的单元格下的问题。

 @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(_:)?需要引用集合视图本身...不完全确定完整的含义是什么。
  • 也许使用 Z 索引?
  • bringSubviewToFront 完成了这项工作!谢谢乔希!
  • 这不是真正的问题,对吧?您的问题更多的是关于最佳实践

标签: ios cocoa-touch uicollectionview


【解决方案1】:

补救单元格落后于其他单元格的一种简单的方法是在集合视图上调用bringSubviewToFront(_:),传递单元格。

警告但是,我不确定这是最佳:因为你并不真正拥有单元格/集合视图的层次结构,一般来说你应该'不要像这样直接触摸子视图。

一个密切相关的可能性——不是那么简单,但可能更健壮,因此更可取——是自定义布局。由于集合视图的 UICollectionViewLayout 对象 can specify the zIndex of a particular cell,您可以在捏合手势开始时重新加载单元格并仅更新该单元格的 Z 索引。

【讨论】:

  • 就最佳实践而言,单元格扩展的手势识别器应该放在 UICollectionViewController 下还是自定义集合视图单元格中?
  • 在这种情况下,在我看来它应该进入集合视图本身。缺点是你必须弄清楚哪个单元格被击中了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多