4

今天是个好日子!

我的应用程序有问题。我正在使用 UIViewPropertyAnimator 为我的模糊设置动画。我让模糊效果从 nil (0) 运行到 .light (1),但由于灯光效果太多,我将 UIViewPropertyAnimator 设置为 0.1 (.fractioncomplete = 0.1)。

这很好用!但问题是,如果您离开应用程序(不是杀死,只是通过按主页按钮或转到另一个应用程序离开),它会自动播放并从 0.1 变为 1。

我认为这是一个错误?我希望有人对此有解决方案。

这里有一些图片:(没有足够的声誉直接发布它们)

0.1模糊的图片

1 模糊的图片

代码:

let effectView = UIVisualEffectView(effect: nil)
var animator: UIViewPropertyAnimator?

viewdidload:

effectView.frame = view.bounds
effectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
mainView.addSubview(effectView)
animator = UIViewPropertyAnimator(duration: 1, curve: .linear) {
   self.effectView.effect = UIBlurEffect(style: .light)
}

模糊动作(需要先启动/暂停,因为苹果的一个已知错误可以唤醒动画师):

self.animator?.startAnimation()
self.animator?.pauseAnimation()
self.animator?.fractionComplete = CGFloat(0.1)

提前致谢 !

4

2 回答 2

9

我通过在设置pausesOnCompletion. 无需重新启动动画师。UIViewPropertyAnimatortruefractionComplete

于 2019-05-15T00:35:41.647 回答
3

我重现了您的问题,并确认了这种行为,但我怀疑这是一个错误。属性动画师只是从暂停状态返回到活动状态并运行动画。要克服它,您必须先克服它stop,然后再进入状态finish当前部分(文档中描述了各个状态)。这里还有一个问题 - 在设置fractionComplete为 0 后立即停止它,所以你必须等待一段时间(非常短)。在您的“blurAction”下尝试此代码:

    self.animator?.startAnimation()
    self.animator?.pauseAnimation()
    self.animator?.fractionComplete = CGFloat(0.1)

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { 
        self.animator?.pauseAnimation()
        self.animator?.stopAnimation(true)
        self.animator?.finishAnimation(at: .current)
    }

我验证它适用于后台/前台应用程序生命周期更改。

于 2017-04-04T10:31:26.290 回答