在从UITableView到UIView的交互式过渡中动画子视图

时间:2013-10-15 13:46:48

标签: ios ios7 transitions

对于仅支持iOS7的应用程序,我有一个UITableView(虽然如果有帮助的话,可以将它更改为UICollectionView),其中单元格如下所示:

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

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

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

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

ETA:我越想到这一点,我就越想知道:使用带有流布局的UICollectionView可以更好地处理它,并且只需将细节设置为动画调整大小到屏幕的完整大小?

1 个答案:

答案 0 :(得分:11)

我认为iOS7日历动画是通过集合视图动画过渡布局来完成的,这对于这种情况来说很棒,但并不是你想要的。此外,它们似乎让您在同一个视图控制器中,这可能不适合您在上面描述的主细节场景。

我最近一直在玩动画过渡,并且发现iOS7中可用的新快照视图非常适合这类事情。

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

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

由于布局已经发生,您可以在这些快照上使用现有视图的centerframe属性,并为这些属性设置动画。它使代码更容易阅读。这就是Augie上面评论的内容。

在您的情况下,您可以通过将所选单元格的各种视图绑定到传入控制器的视图,并将它们设置为新位置来获得您所获得的效果。

我已经通过此转换创建了一个示例项目on GitHub。最终效果如下:

example video

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