pushviewcontroller 动画缓慢/断断续续

问题描述 投票:0回答:9

我推送一个

ViewController
,其中不包含太多视图,
UIScrollView
,其中包含10个视图,我有一个单例
ViewController
,并一次又一次地推送它,而无需再次释放和分配
ViewController
,所以所有的事情我用
viewDidLoad()
viewWillAppear()
来做,但是动画很慢而且断断续续,这可能是什么?

uiviewcontroller uinavigationcontroller pushviewcontroller
9个回答
99
投票

我遇到了一个问题,当 UIViewController A 执行 PushViewController 来推送 UIViewController B 时,推送动画会在大约 25% 处停止,停止,然后在剩下的时间内滑动 B。

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

解决方法是视图控制器 B 没有在其根视图上设置 backgroundColor(根视图是 viewController.view 的值,通常在 loadView 中设置)。在根视图的初始值设定项中设置背景颜色解决了问题。

我设法解决这个问题如下:

// 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;

}

32
投票

解决这个问题的唯一方法,永远不要将主视图的背景颜色设置为透明颜色。

当您的下一个视图覆盖前一个视图时,如果您将背景设置为透明颜色,则意味着它是透明的,前一个视图在某些时候始终可见,这会破坏动画。


4
投票

您可以首先使用“仪器”>“时间分析器”,查看代码中是否有任何部分花费的时间超过必要的时间。

您还可以使用“仪器”>“核心动画”工具,该工具可用于标记屏幕上无法有效绘制/动画的部分。

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


0
投票

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

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

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

0
投票

我的问题是我将质量负载代码放入

viewWillAppear
中。我的情况是

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

    tableView.reloadData()
}

而且我有很多行,所以pushViewController很滞后。


0
投票

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

我今天也遇到了同样的问题。我深入研究了这个主题,似乎它与主运行循环休眠有关。

参见这个


0
投票

在我的例子中,我在viewWillLayoutSubviews()方法中设置了ui更改代码(例如shadow和cornerRadius等等),当我将这些代码放入其他方法(如viewWillAppear())时,过渡变得更平滑


0
投票

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

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

0
投票

12 年后,可以确认确保在 viewDidLoad 中在控制器视图上设置背景颜色仍然是这里的解决方案:D

© www.soinside.com 2019 - 2024. All rights reserved.