【问题标题】:UICollectionView for Springboard like foldersUICollectionView 用于类似 Springboard 的文件夹
【发布时间】:2013-01-31 05:34:36
【问题描述】:

我正在尝试达到以下效果:

UICollectionView 显示父对象类型的单元格网格,例如。 G。相册。当我点击其中一项时,我想将该元素滚动到屏幕顶部并从中打开类似 Springboard 的文件夹。在该文件夹区域内,应显示另一个集合,由详细项目组成,即。 e.该相册的单张照片。点击剩余的“父”视图会再次关闭文件夹。请参阅此架构:

到目前为止,我所做的是专辑的常规收藏视图。当我选择一个时,它会滚动到顶部的选定项目,然后使用JWFolders 在该位置打开一个空文件夹。一旦显示出来,我就会触发周围的UINavigationController 来推动我的第二个视图控制器和细节项。那个是经过布局的,所以它在用户看来就好像它仍然是同一个视图。

这种方法有几个问题,我想知道如何更好地做到这一点:

  1. JWFolders 截取屏幕截图并向上/向下动画两半以实现打开效果。这没问题,但在 iPad3 上相当慢,因为它移动了很多像素,而 iPad3 的 GPU 不能完全胜任这项任务。

  2. 第二个视图需要像素完美才能匹配第一个视图。这很可能会意外中断。

  3. 对于视图控制器转换可以使用哪些动画,我受到限制。默认的UINavigationController 从右边推送是不合适的。我覆盖它以进行交叉溶解,但仍然远非理想。

我想获得有关如何以可维护的方式解决此问题的指示,这种方式不需要对框架的设计目的进行太多创造性的黑客攻击。我可能在这里遗漏了一些明显的东西,因此非常感谢您提供示例或一般建议。

更新:

我稍微改变了方法。现在我使用一个包含两个嵌入式集合视图控制器的容器视图控制器。一个用于“相册”,一个用于底部的“照片”部分。在两者之间使用UIImageView,我可以完成指向上方的三角形。从维护的角度来看,这也很好,因为这两个集合完全分开处理,使维护更容易。

该应用程序使用自动布局,因此我可以通过修改约束来更改两个嵌入式视图各自占用的空间量。这比使用 JWFolders 的基于屏幕截图的方法快得多,并且在 iPad3 上也能很好地工作。

几乎将我带到我想去的地方。剩下的一件事是让开场动画正确。我想同时滚动相册收藏,以便点击的项目移到顶部并展开照片收藏,三角形指向相册单元格。

我能否通过布局约束以某种方式将下部视图“连接”到该单元格,以便 scrollToItemAtIndexPath:atScrollPosition:animated: 调用将下部视图拖开?

【问题讨论】:

  • 您使用什么代码来动画打开您的 imageViews 集合?
  • 现在手头没有它,但它基本上是为我的视图下边缘和超级视图底部之间的空间从其原始值设置为 0 的动画自动布局约束。
  • 如果您熟悉 Xcode Instruments,您应该尝试对代码进行时间分析。您可能在某些地方可以改进 JWFolders 的动画制作方式,因为它所做的动画不应该占用大量资源。
  • 问题在于,在视网膜 iPad 3 上,当您截取分割屏幕截图并移动每一半时,只会移动大量像素。这只是硬件的限制(而且我不愿意为了这样的事情开始研究 OpenGL)。
  • 嘿,JWFolders 的作者在这里。我不久前编写了该代码,它肯定可以使用一些优化,但主要的瓶颈是CALayer-renderInContext: 调用,它只是无法优化。我希望有一种方法可以概括这个库以避免截屏,但不幸的是没有办法这样做。

标签: ios xcode cocoa-touch ios6 uicollectionview


【解决方案1】:

为了解决这个问题,我会丢失库并导致 iOS 在没有屏幕截图或其他技巧的情况下移动这些显示元素。在轻按时,使轻按的图标保持其正常外观,同时使所有其他图标变暗。从顶部到点击图标所在行的末尾查找集合视图的内容。创建两个新的集合视图 - 一个包含上半部分,包括您点击的图标,另一个包含下面的其余部分。将这些视图分开动画,为文件夹视图腾出空间。

文件夹视图是另一个 UICollectionView 出现在创建的间隙中。 在主视图中,根据抽屉是打开还是关闭,呈现一个或三个视图。我可能会考虑创建一个带有集合视图的视图控制器,并使用视图控制器包含来管理所有三个视图。您可以完全控制这些视图的呈现方式,因此您可以像 Springboard 一样同时为顶部和底部视图设置动画以显示文件夹视图。

当一切正常后,您可以概括并开始做一些事情,例如决定将点击的图标作为底部集合的一部分,如果图标在屏幕上较低,则文件夹显示在上方。

(我犹豫要不要回答这个问题,因为有大量的赞成票但没有答案,所以我可能错过了一些东西——但这就是我开始尝试实现跳板效果的方式。)

【讨论】:

  • 感谢您的(第一个)回答 :) 我不认为您错过了什么。我问这个问题是因为我希望避免将几个集合视图与动画等杂耍,并且更喜欢一些可以在其他地方使用的“更简单”的方式,也是。但我得出的结论是,这可能是唯一可行的方法,尽管它需要更多的工作。我们目前正在处理与您的建议类似的事情。
【解决方案2】:

要以相对简单的方式解决此问题,您可以尝试将文件夹设为简单的 UICollectionView 子类,然后在点击相册单元格时插入该单元格。 在集合视图数据源中,您必须为文件夹单元格返回不同的大小等。 在文件夹中,您必须创建文件夹集合视图,避免将文件夹单元格作为单元格文件夹集合视图的数据源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多