2

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

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

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

4

2 回答 2

5

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

  1. 实例化新的控制器(我们称它为 B,而原来的控制器是 A)
  2. 添加 B 的视图作为窗口的子视图(来自 self.view.window)
  3. 将 B 的框架设置为在您想要的任何方向上离开屏幕,或者使其 alpha 为 0,或者使其大小为零,具体取决于您想要的过渡类型。
  4. 使用 animateWithDuration:animations:completion: remove A's view (在完成块中) 做任何你想要的转换
  5. 在完成块中,使 B 成为窗口的根视图控制器
于 2013-02-06T23:40:35.490 回答
1

本质上,您正在让系统自动保留和释放,以及在概述的调用 rdelmar 的答案下方发生的任何事情。转换视图控制器只是为视图设置动画,同时让系统将控制器保存在内存中。

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

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

And never, ever trust iOS to work the same way it did the last version. Everything I said is subject to being wrong the same way iOS 6 broke retain on annotating, and the manuals stated iOS 3 animations will become obsolete (and are now replaced instead?) gah, just saying be careful with efficiency, it may be broken or updated in the somewhat distant future if you try it.

于 2013-02-15T17:24:04.727 回答