如何让动画和手势识别器协同工作? (迅速)

我做了一个简单的项目,使用滑动手势识别器和动画。 我让我的标签移动,每增加3秒钟。 每次滑动我都需要减少数量。 我的手势识别器对象与标签绑定,即它仅在标签边界中起作用。 当编程没有动画时,一切都很好,但是当它;动画时,正在移动我的手势识别器什么都不做。 如何使手势识别器与动画同时工作,即在动画时响应我的滑动。 需要帮忙。

`

@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编写的,但它应该有助于至少说明这种技术。