相关疑难解决方法(0)

在transitionWithView中更改rootViewController时泄漏视图

在调查内存泄漏时,我发现了一个与setRootViewController:在转换动画块中调用技术相关的问题:

[UIView transitionWithView:self.window
                  duration:0.5
                   options:UIViewAnimationOptionTransitionFlipFromLeft
                animations:^{ self.window.rootViewController = newController; }
                completion:nil];
Run Code Online (Sandbox Code Playgroud)

如果旧视图控制器(正在替换的视图控制器)当前正在呈现另一个视图控制器,则上述代码不会从视图层次结构中删除呈现的视图.

也就是说,这一系列操作......

  1. X成为Root View Controller
  2. X显示Y,因此Y的视图在屏幕上
  3. 使用transitionWithView:使Z中的新根视图控制器

...对用户看起来没问题,但Debug View Hierarchy工具将显示Y的视图仍然在Z的视图后面,在a UITransitionView.也就是说,在上面的三个步骤之后,视图层次结构是:

  • 的UIWindow
    • UITransitionView
      • UIView(Y的看法)
    • UIView(Z的观点)

我怀疑这是一个问题,因为在转换时,X的视图实际上不是视图层次结构的一部分.

如果我dismissViewControllerAnimated:NO之前发送到X transitionWithView:,则生成的视图层次结构为:

  • 的UIWindow
    • UIView(X的观点)
    • UIView(Z的观点)

如果我向dismissViewControllerAnimated:X 发送(是或否),然后在completion:块中执行转换,则视图层次结构正确.不幸的是,这会干扰动画.如果动画解雇,那就浪费时间; 如果没有动画,它看起来很破碎.

我正在尝试其他一些方法(例如,创建一个新的容器视图控制器类作为我的根视图控制器),但没有找到任何有效的方法.我会去的时候更新这个问题.

最终目标是直接从呈现视图转换到新的根视图控制器,而不会留下杂散视图层次结构.

cocoa-touch core-animation uiviewcontroller ios

94
推荐指数
3
解决办法
2万
查看次数