我正在尝试实现以下效果:
UICollectionView
显示一个对象类型的网格单元,例如相册。当我点击其中一个项目时,我想要将该元素滚动到屏幕顶部并从其打开类似 Springboard 的文件夹。在文件夹区域内,应显示另一个集合,其中包含详细项,即该相册的单个照片。在“父”视图中点击可以关闭文件夹。请参见此架构:
到目前为止,我已经为相册创建了常规集合视图。选择一个后,它会将所选项目滚动到顶部,然后使用JWFolders
在该位置打开一个空文件夹。一旦显示出来,我触发周围的UINavigationController
来推送我的第二个视图控制器,其中包含详细项。这个视图被布置好,以便让用户感觉它仍然是同一个视图。
这种方法存在几个问题,我想知道如何更好地解决它们:
JWFolders
打开效果需要截屏并将其两个部分向上/向下动画。这是可以的,但在 iPad3 上非常慢,因为它移动了很多像素并且 iPad3 的 GPU 不太符合要求。第二个视图需要完全匹配在第一个视图之上。这可能会意外破坏。
我的转换视图控制器的动画选择受限。默认的来自右侧的
UINavigationController
推送不太适合。我将其覆盖以进行交叉溶解,但仍然远非理想。
更新:
我稍微改变了方法。现在我使用一个容器视图控制器,其中包含两个嵌入的集合视图控制器。一个用于“相册”,另一个用于底部的“照片”部分。在两个之间使用
UIImageView
可以完成指向上的三角形。从维护的角度来看,这也很好,因为处理两个集合的维护完全是分开的。应用程序使用自动布局,因此我可以通过修改约束来更改每个嵌入视图所占的空间。这比使用JWFolders基于屏幕截图的方法要快得多,并且在iPad3上也可以很好地工作。
这几乎让我达到了目标。仅剩的问题是如何正确打开动画。我想同时滚动相册集合,使点击的项目移到顶部,并展开带有指向Album单元格的照片集合。
我是否可以通过布局约束“连接”低视图和该单元格,以便
scrollToItemAtIndexPath:atScrollPosition:animated:
调用打开低视图?
JWFolders
的作者。我写了那段代码一段时间了,它肯定可以使用一些优化,但主要瓶颈在于CALayer
的-renderInContext:
调用,这个调用无法进行优化。我希望有一种方法可以将这个库泛化,以避免截屏,但不幸的是目前还没有办法做到这一点。 - sudo rm -rf