我做了一个简单的项目,带有滑动手势识别器和动画。我让标签移动并且每 3 秒增加一次数字。每次滑动我都需要减少数量。我的手势识别器对象与标签绑定在一起,即它仅在标签范围内工作。当 prog 在没有动画的情况下工作时,一切正常,但是当它有动画时,我的手势识别器什么也不做。如何使手势识别器与动画同时工作,即以动画方式响应我的滑动。需要帮忙。
`
@IBOutlet weak var label1: UILabel!
var number : Int = 0
var timer = Timer()
@IBAction func label1SwipeRight(_ sender: UISwipeGestureRecognizer) {
number += 1
label1.text = String(number)
}
func animate1() {
UIView.animate(withDuration: 4.0, delay: 0.0, options: .allowUserInteraction, animations: {
let num1 : CGFloat = CGFloat(arc4random_uniform(667))
let num2 : CGFloat = CGFloat(arc4random_uniform(375))
self.label1.frame.origin.y = num1
self.label1.frame.origin.x = num2
}, completion: {(bool) in
self.animate1()
print("Animation1 completed")
})
}
func timerExample() {
Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
}
@objc func updateTimer() {
label1.text = String(Int(label1.text!)! + 1)
}`
默认情况下,当动画“运行”时,视图对象会阻止用户交互。您需要使用“长格式”动画方法之一,并传入选项.allowUserInteraction
。像这样的东西:
UIView.animate(duration: 0.5,
delay: 0.0,
options: .allowUserInteraction,
animations: {
myView.alpha = 0.5
})
但请注意,如果您要设置动画的是视图的位置,则用户将无法在视图对象移动时点击它。这是因为位置动画并没有真正将对象随着时间的推移从一个地方移动到另一个地方。它只是创造了那种外观。在幕后,对象实际上在动画开始时跳到其最终位置。
如果您需要能够在对象移动时点击/拖动/滑动对象,则必须自己执行此操作。您所做的是将手势识别器放在包含整个运动范围(可能是整个屏幕)的父视图上。然后您需要使用动画视图层的表示层,将手势识别器的点的坐标转换为坐标空间到图层的坐标空间,并使用图层的 hitTest 方法来判断该点是否在图层上。
我在 Github 上有一个项目叫iOS-CAAnimation-group-demo它做了类似的事情(它沿着复杂的路径对图像视图进行动画处理,您可以点击图像视图以在动画“飞行中”时暂停动画。
这是几年前的内容,所以它是用 Objective-C 编写的,但它至少应该有助于说明该技术。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)