使用 UIViewPropertyAnimator 通过触摸中断动画
Posted
技术标签:
【中文标题】使用 UIViewPropertyAnimator 通过触摸中断动画【英文标题】:interrupt animation by touch using UIViewPropertyAnimator 【发布时间】:2018-05-11 07:41:15 【问题描述】:我正在尝试通过屏幕触摸来控制动画
当我触摸屏幕时,视图的 alpha 变为 0
但如果在 alpha 变为 0 时再次触摸
然后 alpha 再次变为 1(使 alpha 值为 0 的中断动画)
所以我写了
class MainViewController: UIViewController
var showAnimation:UIViewPropertyAnimator!
var hideAnimation:UIViewPropertyAnimator!
var isHiding:Bool = false
override func viewDidLoad()
super.viewDidLoad()
self.view.backgroundColor = .blue
showAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations:
self.view.alpha = 1
)
hideAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations:
self.view.alpha = 0
)
showAnimation.isUserInteractionEnabled = true
showAnimation.isInterruptible = true
hideAnimation.isUserInteractionEnabled = true
hideAnimation.isInterruptible = true
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
isHiding = !isHiding
if self.isHiding
self.hideAnimation.startAnimation()
self.showAnimation.stopAnimation(true)
else
self.hideAnimation.stopAnimation(true)
self.showAnimation.startAnimation()
但 touchesBegan 仅在动画块完成后调用
我该如何解决这个问题
【问题讨论】:
你试过用UITapGestureRecognizer
代替touchesBegan吗?
一样!但如果不将 alpha 设置为 0,我认为我将 alpha 设置为 0.1 是可行的
【参考方案1】:
这里有两件事你需要知道:
你不需要在初始化UIViewPropertyAnimator
之后将isUserInteractionEnabled
和isInterruptible
设置为true,因为它们的默认值是true。
调用stopAnimation
后,UIViewPropertyAnimator
将失效,不能再调用startAnimation
使其工作。所以你需要在停止showAnimation
和hideAnimation
之后重新初始化它们。
要解决问题,请尝试下面的代码。
class MainViewController: UIViewController
var showAnimation:UIViewPropertyAnimator!
var hideAnimation:UIViewPropertyAnimator!
var isHiding:Bool = false
override func viewDidLoad()
super.viewDidLoad()
self.view.backgroundColor = .blue
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
isHiding = !isHiding
if self.isHiding
self.showAnimation?.stopAnimation(true)
self.hideAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations:
self.view.alpha = 0.1
)
self.hideAnimation.startAnimation()
else
self.hideAnimation?.stopAnimation(true)
self.showAnimation = UIViewPropertyAnimator(duration: 2, curve: .easeInOut, animations:
self.view.alpha = 1
)
self.showAnimation.startAnimation()
【讨论】:
完美运行!!非常感谢!!我没有注意到我应该初始化动画对象以上是关于使用 UIViewPropertyAnimator 通过触摸中断动画的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 UIViewPropertyAnimator.fractionComplete 驱动 UIView.transition
使用 UIViewPropertyAnimator 同步动画 CALayer 属性和 UIView
UIViewPropertyAnimator 自动布局完成问题
使用 UIViewPropertyAnimator 为 UILabel textColor 属性设置动画