使用 UIViewPropertyAnimator 通过触摸中断动画
interrupt animation by touch using UIViewPropertyAnimator
我正在尝试通过屏幕触摸来控制动画
当我触摸屏幕时,视图的 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 仅在动画块完成后调用
我该如何解决这个问题
这里有两件事你需要知道:
- 初始化
UIViewPropertyAnimator
后不需要将isUserInteractionEnabled
和isInterruptible
设置为真,因为它们的默认值为真。
- 调用
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()
}
}
}
我正在尝试通过屏幕触摸来控制动画
当我触摸屏幕时,视图的 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 仅在动画块完成后调用
我该如何解决这个问题
这里有两件事你需要知道:
- 初始化
UIViewPropertyAnimator
后不需要将isUserInteractionEnabled
和isInterruptible
设置为真,因为它们的默认值为真。 - 调用
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()
}
}
}