pushviewcontroller动画很慢/波涛汹涌

时间:2012-01-12 10:37:13

标签: uiviewcontroller uinavigationcontroller pushviewcontroller

我推送的ViewController包含的视图不多,UIScrollView里面包含10个视图,我有一个单例ViewController并一次又一次地推送它而不再释放和分配ViewController,所以我在viewDidLoad()viewWillAppear()中执行的所有操作,但动画缓慢且不连贯,可能是什么?

8 个答案:

答案 0 :(得分:90)

我遇到一个问题,当UIViewController A执行pushViewController推送UIViewController B时,推送动画将停止在25%左右,停止,然后在剩下的时间内滑动B.

这个DID不会发生在iOS 6上,但是当我开始在XCode 5中使用iOS 7作为基础SDK时,就会发生这种情况。

修复是视图控制器B在其根视图上没有设置backgroundColor(根视图是viewController.view的值,您通常在loadView中设置)。在该根视图的初始化程序中设置backgroundColor可以解决问题。

我设法解决了这个问题:

// CASE 1: The root view for a UIViewController subclass that had a halting animation

- (id)initWithFrame:(CGRect)frame

{

     if ((self = [super initWithFrame:frame])) {

          // Do some initialization ...

          // self.backgroundColor was NOT being set

          // and animation in pushViewController was slow and stopped at 25% and paused

     }

     return self;

}

// CASE 2: HERE IS THE FIX

- (id)initWithFrame:(CGRect)frame

{

     if ((self = [super initWithFrame:frame])) {

          // Do some initialization ...

          // Set self.backgroundColor for the fix!

          // and animation in pushViewController is no longer slow and and no longer stopped at 25% and paused

          self.backgroundColor = [UIColor whiteColor]; // or some other non-clear color

     }

     return self;

}

答案 1 :(得分:27)

  

只解决此问题,不要将主视图的背景颜色设置为清除颜色。

当您的下一个视图超过上一个视图时,如果您将背景设置为清除颜色,则表示它是透明的,之前的视图在某些时候始终可见,这会破坏动画。

答案 2 :(得分:4)

您可以先使用Instruments> Time Profiler,查看代码中是否有任何部分需要的时间超过必要时间。

你也可以使用仪器>核心动画工具,可用于标记未有效绘制/动画的部分屏幕。

如果您使用的是旧款iPhone或原装iPod - 复杂的屏幕,我注意到一些应用程序有些不稳定。

答案 3 :(得分:0)

我遇到了这个问题,这是因为推送视图控制器中的旧代码导致视图“淡入”,在viewWillAppear上将alpha设置为0,并在viewDidAppear上将alpha设置为1。

我删除了执行此操作的旧代码,并且推送工作正常。

-(void)viewWillAppear {
    self.view.alpha = 0; //REMOVE THIS LINE
}

答案 4 :(得分:0)

我的问题是我将批量加载代码放在viewWillAppear中。我的情况是

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    tableView.reloadData()
}

我有很多行,所以pushViewController是滞后的。

答案 5 :(得分:0)

这可能是下面链接答案中讨论的已知错误。我有一个类似的问题,阅读下面的答案为我澄清了。

我今天遇到了同样的问题。我挖掘了这个主题,似乎它与主要的runloop正在睡着有关。

请参阅this

答案 6 :(得分:0)

在我的情况下,我在viewWillLayoutSubviews()方法中设置了ui更改代码(例如shadow和cornerRadius和...),当我将这些代码放入其他方法(如viewWillAppear())中时,过渡会变得更加顺畅

答案 7 :(得分:0)

快速:如果您要在任何视图上应用阴影,那么您也可以尝试以下代码。

view.layer.shouldRasterize = true
view.layer.rasterizationScale = UIScreen.main.scale