【问题标题】:Completion block in (animateWithDuration:animations:completion:) is unpredictably delayed(animateWithDuration:animations:completion:) 中的完成块被意外延迟
【发布时间】:2015-07-29 14:49:10
【问题描述】:

代码太大,无法在此处发布。我的问题如下。当我用duration == 0.3 调用animateWithDuration:animations:completion:(可能带有选项)时,这并不意味着完成块将通过相同的延迟被调用。它被调用了 2 秒,对我来说太长了。

这种大延迟通常出现在内存警告之前,但有时可能会按预期工作。

谁能解释一下是什么导致了这种奇怪的行为?

【问题讨论】:

  • 对不起,没有代码真的很难弄清楚。在黑暗中拍摄是不可预测的,所以答案也是......
  • 我希望有一些常见的原因。如“内存泄漏通常出现在为对象分配内存却忘记释放时”
  • 在你做动画的同时,你可能有一些东西阻塞了主线程/UI。
  • 我的手被绑在这里,伙计:)
  • Vyachaslav - 遗憾的是,不,完成块问题没有“常见”原因。要么你试图从某个后台线程做一些 UI 工作,要么你正在做一些阻塞主线程的事情。您应该创建MCVE,这是最简单的示例,可以显示您所描述的问题。这是我们可以帮助您的唯一方法(通常,您会在创建 MCVE 的过程中自己发现问题的根源)。

标签: ios animation delay animatewithduration completion


【解决方案1】:

是否涉及任何计时器,例如动画计时器触发? 当我的动画被定时器触发时,我遇到了类似的问题。原来动画不止一次开始了。 animationOngoing 标志阻止动画在完成之前再次启动。

// Timer function
    func timerTextToggle(timer: NSTimer) {
    if self.animationOngoing == false {
        self.flipAnimation()
    }
}

// Animation function
func flipAnimation() {
// important note: it's UIViewAnimationOptions,
// not UIViewAnimationTransition
    self.animationOngoing = true
    if self.animationToggle == false {
        UIView.transitionFromView(self.singleTapLabel!,
            toView: self.doubleTapLabel!,
            duration: animDuration,
            options: UIViewAnimationOptions.TransitionFlipFromBottom,
            completion: {
                (value: Bool) in
                self.animationOngoing = false
        })
    } else {
        UIView.transitionFromView(self.doubleTapLabel!,
            toView: self.singleTapLabel!,
            duration: animDuration,
            options: UIViewAnimationOptions.TransitionFlipFromTop,
            completion: {
                (value: Bool) in
                self.animationOngoing = false
        })
    }
    self.animationToggle = !self.animationToggle
}

【讨论】:

  • 对不起,我不明白你的意思。可以发布任何示例吗?也许RZViewActions 库对它有影响。它允许同时播放动画,但它本身不会导致这个问题,因为演示工作正常。
  • 不,我不通过这种方式使用NSTimer。也许performSelector:... 的一些额外调用具有类似的效果。找到原因我会写的
【解决方案2】:

我遇到了与此类似的问题,虽然没有关于您的方案的更多信息,但我不知道这是否也适用于您的问题。

我在animateWithDuration:delay:options:animations:completion 的完成块中的UITextField 上调用becomeFirstResponder。日志显示完成块被及时调用,但键盘需要几秒钟才能显示。这仅在首次启动键盘时发生。

This answer 帮我解决了这个问题……原来这与 iOS 模拟器有关。当我不调试应用程序时,这个问题并没有发生......另一个在模拟器中追逐一个实际上不存在的错误几个小时的经典示例。

【讨论】:

    【解决方案3】:

    这个问题的原因找到了。在主线程中渲染了很多 UIWebView 对象。而且似乎不可能阻止它们的加载。无论如何,时间分析器显示即使它们在屏幕上不可见,也会花费大量时间来渲染它们。 是的,由于要求,我无法在内存警告事件之前释放它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多