微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift – 为UIViewPropertyAnimator的fractionComplete设置动画以模糊背景

因此,当您在主屏幕上向下滚动时,我正在使用新的UIViewPropertyAnimator和UIVisualEffectView来实现与Spotlight搜索相同的功能,并使背景模糊.

我正在使用fractionComplete属性来设置平移UIView时要模糊多少的过程.

animator = UIViewPropertyAnimator(duration: 1,curve: .linear) {
        self.blurEffectView.effect = nil
    }

并且模糊度的变化值在0.0-1.0之间.

animator?.fractionComplete = blurValue

但是当我取消平移手势时,我希望模糊从其所处的位置动画回到无模糊(例如,〜> 1.0),持续时间为0.4毫秒.

现在我只是在取消平移手势时将fractionComplete设置为1.0.相反,我想要动画它.
我已经尝试了UIView.animate(withDuration ..但它不会影响UIViewPropertyAnimators fractionComplete,这是模糊UIVisualEffectView的唯一方法.

有任何想法吗?

解决方法

似乎fractionComplete有一个bug(我在Stackoverflow上的问题: UIViewPropertyAnimator does not update the view when expected),rdar://30856746.该属性只将状态从非活动状态设置为活动状态,但不更新视图,因为(我假设)还有另一个内部状态不会触发.

解决此问题,您可以执行以下操作:

animator.startAnimation() // This will change the `state` from inactive to active
animator.pauseAnimation() // This will change `isRunning` back to false,but the `state` will remain as active

// Now any call of `fractionComplete` should update your view correctly!
animator.fractionComplete = /* your value here */

这是一个可以玩的游乐场片段:

let liveView = UIView(frame: CGRect(x: 0,y: 0,width: 400,height: 50))
liveView.backgroundColor = .white

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = liveView

let square = UIView(frame: CGRect(x: 0,width: 50,height: 50))
square.backgroundColor = .red

liveView.addSubview(square)

let animator = UIViewPropertyAnimator.init(duration: 5,curve: .linear)

animator.addAnimations {

    square.frame.origin.x = 350
}

let blurView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
blurView.frame = liveView.bounds

liveView.addSubview(blurView)

animator.addAnimations {

    blurView.effect = nil
}

// If you want to restore the blur after it was animated,you have to 
// safe a reference to the effect which is manipulated
let effect = blurView.effect

animator.addCompletion {
    // In case you want to restore the blur effect
    if $0 == .start { blurView.effect = effect }
}

animator.startAnimation()
animator.pauseAnimation()

dispatchQueue.main.asyncAfter(deadline: .Now() + 2) {

    animator.fractionComplete = 0.5
}

dispatchQueue.main.asyncAfter(deadline: .Now() + 4) {

    // decide the direction you want your animation to go.
    // animator.isReversed = true
    animator.startAnimation()
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐