【问题标题】:pushviewcontroller animation is slow/choppypushviewcontroller 动画很慢/断断续续
【发布时间】:2012-02-08 15:45:26
【问题描述】:

我推送了一个ViewController,其中包含的视图不多,UIScrollView,其中包含 10 个视图,我有一个单例 ViewController,然后一次又一次地推送它,而没有再次释放和分配 ViewController,所以所有我在viewDidLoad()viewWillAppear() 中做的事情,但是动画很慢而且断断续续,会是什么?

【问题讨论】:

  • 这是在什么设备上运行的?

标签: uiviewcontroller uinavigationcontroller pushviewcontroller


【解决方案1】:

我遇到了一个问题,当 UIViewController A 执行 pushViewController 来推送 UIViewController B 时,推送动画会在大约 25% 处停止,停止,然后在其余部分滑动 B。

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

解决方法是视图控制器 B 没有在其根视图上设置背景颜色(根视图是 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;

}

【讨论】:

  • 果然,设置了背景色,一切又恢复了流畅。谢谢。
  • 确认,这是正确答案。作为记录,您不必在 init 方法中设置 BG 颜色;您可以轻松地将其放入 viewDidLoad。
  • 有人知道为什么会这样吗?
  • 是的!这就是答案,但到底是什么?为什么背景颜色会变慢?
  • 从 Interface Builder 遇到了同样的问题。默认背景导致推送动画在大约三分之一的持续时间处暂时冻结,然后捕捉到正在完成的动画。背景也出现了黑色,所以可能很清楚。设置一个特定的颜色解决了这个问题,我希望我知道为什么。
【解决方案2】:

仅解决此问题,切勿将主视图的背景颜色设置为清除颜色。

当你的下一个视图覆盖上一个视图时,如果你将背景设置为清除颜色,意味着它是透明的,前一个视图总是可见一段时间,这会破坏动画。

【讨论】:

  • 确实如此。 “默认值为 nil,这会产生透明的背景颜色。” [苹果,developer.apple.com/reference/uikit/uiview/…]
  • 这个问题和答案很难找到;添加关键字«previous UIViewController lingering during push» 和 «former view controller shows halfway with segue animation»
【解决方案3】:

您可以从使用 Instruments > Time Profiler 开始,看看您的代码中是否有任何部分花费的时间超过了必要的时间。

您还可以使用 Instruments > Core Animation 工具,该工具可用于标记屏幕上无法有效绘制/动画的部分。

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

【讨论】:

  • 我使用的是 iPad 1 iOS 5,我查看了配置文件,我没有注意到奇怪的操作,一切似乎都很好,我查看了其他需要较长时间且非常流畅的应用程序,但是这个让我发疯了。
  • 在 Instruments 核心动画中,FPS 是什么意思?
  • FPS 是每秒帧数 - 基本上是动画在屏幕上渲染的速度。 60 是 iPhone 上的最大值。 20 FPS 很慢 - 然后某些东西运行效率低下。
  • 您已经确定您以 20 FPS 的速度运行,因此您知道某些事情花费的时间太长。运行 Time Profiler - 隐藏系统库并查看列表顶部弹出的内容。任何花费比 main() 更长或通常超过 5% 的时间都可能是低效的,需要引起注意。 Instruments 会将您指向耗时过长的代码行。这里很难解释 - 但你应该阅读仪器用户指南:developer.apple.com/library/mac/#documentation/developertools/…
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

    我的问题是我在viewWillAppear 中输入了大量加载代码。我的情况是

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
    
        tableView.reloadData()
    }
    

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

    【讨论】:

      【解决方案6】:

      这可能是下面链接的答案中讨论的已知错误。我有一个类似的问题,阅读下面的答案对我来说很清楚。

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

      this

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-27
            • 1970-01-01
            • 1970-01-01
            • 2016-12-24
            • 1970-01-01
            • 2011-05-25
            • 2011-02-15
            • 1970-01-01
            相关资源
            最近更新 更多