【发布时间】:2015-01-01 23:43:30
【问题描述】:
在调查内存泄漏时,我发现了一个与在过渡动画块中调用 setRootViewController: 的技术相关的问题:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
如果旧的视图控制器(被替换的那个)当前正在呈现另一个视图控制器,那么上面的代码不会从视图层次结构中删除呈现的视图。
也就是这一系列的操作……
- X 成为根视图控制器
- X 呈现 Y,因此 Y 的视图在屏幕上
- 使用
transitionWithView:使 Z 成为新的根视图控制器
...对用户来说看起来不错,但是调试视图层次结构工具将显示 Y 的视图仍然存在于 Z 的视图后面,位于 UITransitionView 内。也就是经过上面三个步骤,视图层次结构是:
- 用户界面窗口
- UITransitionView
- UIView(Y 的视图)
- UIView(Z 的视图)
- UITransitionView
我怀疑这是一个问题,因为在转换时,X 的视图实际上并不是视图层次结构的一部分。
如果我在transitionWithView: 之前将dismissViewControllerAnimated:NO 发送到X,则生成的视图层次结构是:
- 用户界面窗口
- UIView(X 的视图)
- UIView(Z 的视图)
如果我将dismissViewControllerAnimated:(是或否)发送到X,然后在completion: 块中执行转换,那么视图层次结构是正确的。不幸的是,这会干扰动画。如果动画解雇,它会浪费时间;如果没有动画,它看起来就坏了。
我正在尝试一些其他方法(例如,创建一个新的容器视图控制器类作为我的根视图控制器),但没有找到任何可行的方法。我会随时更新这个问题。
最终目标是直接从呈现的视图过渡到新的根视图控制器,并且不会留下杂散的视图层次结构。
【问题讨论】:
-
我目前也有同样的问题
-
我刚遇到同样的问题
-
运气好能找到合适的解决方案吗?同样的问题在这里。
-
@DavidBaez 我最终编写了代码以在更改根之前主动关闭所有视图控制器。不过,它非常特定于我的应用程序。自发布此消息以来,我一直想知道是否可以交换
UIWindow,但没有时间进行太多实验。
标签: ios cocoa-touch uiviewcontroller core-animation