在调查内存泄漏时,我发现了一个与在转换动画块中调用 setRootViewController:
技术相关的问题:
[UIView transitionWithView:self.window
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ self.window.rootViewController = newController; }
completion:nil];
如果旧的视图控制器(被替换的视图控制器)当前呈现另一个视图控制器,那么上面的代码不会将呈现的视图从视图层次结构中删除。
也就是说,这个操作序列..。
transitionWithView:
使 Z 成为新的根视图控制器... 对用户来说看起来没问题,但是调试视图层次结构工具会显示 Y 的视图仍然在 Z 的视图后面,在 UITransitionView
中。也就是说,在上述三个步骤之后,视图层次结构是:
我怀疑这是一个问题,因为在转换时,X 的视图实际上不是视图层次结构的一部分。
如果我在 transitionWithView:
之前将 dismissViewControllerAnimated:NO
发送到 X,得到的视图层次结构是:
如果我将 dismissViewControllerAnimated:
(YES 或 NO)发送给 X,然后在 completion:
块中执行转换,那么视图层次结构就是正确的。不幸的是,这会影响动画效果。如果动画解雇,它浪费时间; 如果不动画,它看起来破碎。
我正在尝试其他一些方法(例如,创建一个新的容器视图控制器类作为我的根视图控制器) ,但是没有找到任何有效的方法。我会随时更新这个问题。
最终的目标是直接从呈现的视图转换到新的根视图控制器,而不留下任何杂乱的视图层次结构。