【问题标题】:Swift UIViewPropertyAnimator automatically plays when leaving appSwift UIViewPropertyAnimator 离开应用程序时自动播放
【发布时间】:2017-04-04 08:03:34
【问题描述】:

大家好!

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

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

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

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

picture with blur on 0.1

picture with blur on 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)

提前致谢!

【问题讨论】:

  • 您可以发布将模糊设置为 0、1 和 0.2 的代码以及包含它的方法吗?您的 viewWillAppear viewDidAppear 相关视图控制器的方法中有什么?
  • @WladekSurala 感谢您的回复,我已经更新了我的答案。
  • 那么你到底是用什么方法在你的动画师上设置这个fractionComplete?
  • @WladekSurala 所以首先,屏幕是正常的,然后你,比如说,按下一个按钮,就会弹出一个视图。带有一些按钮的背景在 blurview 下,当按下按钮时,会调用动作 blur(),您可以在其中找到 fractioncomplete(我的问题中的最后一个代码块)
  • 很高兴您提供了此信息,恭喜您提出了第一个好问题,请检查我的答案:)

标签: swift xcode ios10 uiviewpropertyanimator


【解决方案1】:

我通过在设置fractionComplete 后立即将UIViewPropertyAnimatorpausesOnCompletion 属性设置为true 解决了这个问题。无需重启动画器。

【讨论】:

  • 对我来说接受的答案不起作用,而这个答案起作用了。又好又简单?
  • 谢谢!你刚刚拯救了我的一天。你的答案应该是被接受的!
  • 谢谢!你真的拯救了我的一天。
【解决方案2】:

我重现了您的问题,并确认了这种行为,但我怀疑这是一个错误。属性动画师只是从暂停状态返回到活动状态并运行动画。要克服它,您必须先 stop 它,然后 finish 在状态的 current 部分(各个状态在 docs 中描述)。这里还有一个问题 - 在将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)
    }

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

【讨论】:

  • 感谢您的宝贵时间!有用。但是有一个新问题......我怎样才能让动画师再次活跃?我尝试了 3 行:start、pause 和 fractionComplete,但应用程序因以下错误而崩溃:动画师必须至少有一个动画块才能启动!'
  • 啊,你想让你的动画“活着”吗?查看文档。你得到的崩溃是因为你已经完成了这个动画,需要用动画块重新启动它(你用来在效果视图上设置模糊的代码)
  • 它现在已经修复并且运行良好。谢谢!我已经创建了一个方法来检查应用程序是否恢复活动状态,并且我将在效果视图上设置模糊的 viewdidload 代码移动到了该新方法。
猜你喜欢
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
相关资源
最近更新 更多