UINavigationController popViewControllerAnimated缓慢转换

时间:2014-01-29 18:57:49

标签: ios objective-c cocoa-touch uiviewcontroller uinavigationcontroller

我有一个基于UINavigationController的应用程序,其中包含多个视图。

当我通过在导航控制器上调用下面的方法弹回到前一个视图控制器时,我看到一个缓慢的过渡。我在视图控制器的viewWillAppear中想到它的唯一原因是我正在转换我做了一些重要的事情需要花费一秒多一点。有没有什么方法可以在这种情况下更快地进行转换?

[self.navigationController popViewControllerAnimated:YES];

修改 几件重要的事情:

  1. 我在设备上运行。
  2. 我尝试将viewWillAppear中的所有代码注释掉,但我得到了同样的行为。
  3. 仅在iOS 7中观察到延迟。在iOS 6中尝试过它似乎在那里工作正常。

4 个答案:

答案 0 :(得分:16)

我知道我也有点迟到了,但我有一个非常类似的问题,我有一个标题图像占据了整个宽度,当弹出它时会对正在弹出的视图造成令人讨厌的颤抖效果到。

我的修复非常简单。我只需要确保顶级视图剪切其子视图。由于我的视图是在Interface Builder中设计的,因此只需选择外部视图容器(具有粗边框的容器)并选中“剪辑子视图”选项。

答案 1 :(得分:2)

我可能会迟到,但对于来到这里的Google员工来说: 如果您在离开视图控制器时遇到不稳定的用户体验,那么像全尺寸背景图像这样的花哨UI界面尝试添加以下内容

#import <QuartzCore/QuartzCore.h>
...
-(void)viewWillDisappear:(BOOL)animated{
    self.view.layer.shouldRasterize = YES;
    self.view.layer.rasterizationScale = [UIScreen mainScreen].scale;
}

它会压平你的图层,因此更容易处理。

编辑: 或者,如果你真的绝望:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *fakeBackground = [[UIImageView alloc] initWithImage:snapshot];
[[self.view  subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
[self.view addSubview:fakeBackground];

答案 2 :(得分:0)

两件事......

1)你在使用模拟器吗?你是小牛队吗?升级后,我遇到了严重的性能问题。

2)当涉及到查看控制器时...我尽可能地远离viewWillAppear。覆盖你的init函数并在那里进行大部分初始化。这样它就可以提前开始,不会随时调用。只有每次控制器出现时需要调用的东西都应放在那里,并且该方法应该是精益的。

答案 3 :(得分:0)

所以你阻止主线程,这就是过渡动画生涩的原因。 如果您在viewwillappear中执行的操作与UI无关,请尝试在另一个线程中执行这些操作。

如果这些操作与UI相关,请将计时器设置为.3秒,直到转换完成,然后在计时器触发时(动画完成后)执行与UI相关的操作。