swift – 为UIViewPropertyAnimator的fractionComplete设置动画
发布时间:2020-12-14 04:51:58 所属栏目:百科 来源:网络整理
导读:因此,当您在主屏幕上向下滚动时,我正在使用新的UIViewPropertyAnimator和UIVisualEffectView来实现与Spotlight搜索相同的功能,并使背景模糊. 我正在使用fractionComplete属性来设置平移UIView时要模糊多少的过程. animator = UIViewPropertyAnimator(duratio
因此,当您在主屏幕上向下滚动时,我正在使用新的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.相反,我想要动画它. 有任何想法吗? 解决方法
似乎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() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |