如何创建自定义UIViewController过渡动画?

时间:2013-02-06 23:01:17

标签: iphone ios animation uiviewcontroller

这个问题好像被问了很多,但我从来没有找到一个确定的答案,关于是否可以像UIKit一样进行自定义转换。

我知道你可以做一些技巧,比如截取当前视图和即将到来的视图,然后在动画下更改视图控制器时动画。但是,这需要相当多的内存,因为你基本上有2个完全额外的屏幕值(因为屏幕截图)。

我正在寻找一种更优雅的方式来呈现带有自定义动画的视图控制器。或者,是否有一种更节省内存的方法来实现上述方法?

2 个答案:

答案 0 :(得分:5)

有几种方法可以实现这一点,具体取决于您想要转换的方式,控制器是否嵌入容器控制器等。在最简单的情况下,您有一个控制器,并且您想要转换到另一个控制器控制器,您可以通过以下步骤完成:

  1. 实例化新控制器(让我们称之为B,原来的A)
  2. 将B的视图添加为窗口的子视图(来自self.view.window)
  3. 根据您想要的转换类型,将B的帧设置为关闭屏幕,使其成为您想要的任何方向或使其为0,或使其大小为零。
  4. 使用animateWithDuration执行您想要的转换:动画:完成: 删除A的视图(在完成块中)
  5. 在完成块中,使B成为窗口的根视图控制器

答案 1 :(得分:1)

基本上,你正在让系统自动保留和释放,以及在rdelmar的回答中所做的任何事情。转换视图控制器只是让视图动画化,同时让系统将控制器保留在内存中。

但是,为了回答更多问题,UIView动画也会创建重复项并缓存图像。 (顺便说一下,系统缓存不会卸载它的内存,因此请避免使用UIImage imageNamed。

如果你想要效率,你可能想要使用计时器自己编码,并鼓起你能想到的所有图形技巧。

永远不要相信iOS的工作方式与上一版本相同。我所说的一切都是错误的,就像iOS 6在注释中保留的那样,并且说明iOS 3动画的手册将变得过时(而现在更换了?)gah,只是说要注意效率,可能会被打破或者如果你尝试的话,在遥远的未来更新。