10

对于仅限 iOS7 的应用程序,我有一个 UITableView (尽管如果有帮助的话,将其更改为 UICollectionView 将是学术性的),其中的单元格如下所示:

+----------------------------------+=======+
| Label1                           | sub-  |
| Label2     Label3                | view  |
+----------------------------------+=======+

我想转换到第二个视图,其中子视图被缩小到更大,并且标签位置发生变化,更像这样:

          +----------+
          |          |
          | subview  |
          |          |
          +----------+
             Label1
             Label2
             Label3

这类似于 iOS7 日历应用程序,其中视图在途中转换和动画部件。我知道我需要实现UIViewControllerAnimatedTransitioning,但我在概念上遇到了这样的事情如何工作的问题。我是否隐藏单元格的子视图,用新视图的子视图替换它们但在同一个地方,然后为它们设置动画?还是有不那么复杂的方法?任何示例代码都将不胜感激,因为我发现的所有示例都没有将子视图从一个视图转移到另一个视图。

ETA:我想得越多,我就越想知道:使用带有流式布局的 UICollectionView 是否可以更好地处理这个问题,并且只需将细节通过动画调整到屏幕的完整大小?

4

1 回答 1

10

我认为 iOS7 日历动画是通过集合视图动画过渡布局完成的,这非常棒,但在这种情况下并不是你想要的。此外,它们似乎将您保留在同一个视图控制器中,这可能不适合您上面描述的主从场景。

我最近一直在玩动画转换,发现 iOS7 中可用的新快照视图非常适合这种事情。

我是自动布局的忠实粉丝,但使用约束的过渡动画太复杂了。但是,您可以假设在过渡开始时,您的视图已经布局,因此您可以应用以下原则:

  • 将传入视图添加到视图层次结构
  • 在此之上创建一个空白画布视图
  • 创建传出视图的快照并将其添加到画布
  • 创建传入视图的快照并将其添加到画布
  • 执行两者之间的动画
  • 移除画布

因为布局已经发生,您可以在这些快照上使用现有视图的centerframe属性,并为它们设置动画。它使代码更容易阅读。这就是奥吉上面的评论所要表达的。

在您的情况下,您可以通过将所选单元格的各种视图与传入控制器的视图联系起来,并将它们设置为新位置的动画来获得您想要的效果。

我已经制作了一个带有此转换的示例项目,可在 GitHub 上找到。最终效果如下所示:

示例视频

这只是一个演示如何执行动画的简单示例。在生产代码中,您可能会让参与的控制器符合一个协议,在该协议中它们返回许多视图以用于转换,而不是直接公开属性并将转换绑定到那些特定的类。

于 2014-02-08T21:26:49.743 回答