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

时间:2017-11-11 14:43:44

标签: ios swift animation uigesturerecognizer

我制作了一个简单的项目,使用滑动手势识别器和动画。我让我的标签移动,每增加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)
}`

1 个答案:

答案 0 :(得分:3)

默认情况下,视图对象在动画播放时会阻止用户交互"。你需要使用"长形式之一"动画方法,并传递选项.allowUserInteraction。像这样:

UIView.animate(duration: 0.5,
  delay: 0.0,
  options: .allowUserInteraction,
  animations: {
    myView.alpha = 0.5
  })

但请注意,如果您要设置动画的位置是视图的位置,则用户在移动时无法点按视图对象。这是因为位置动画并没有真正使对象随时间从一个地方动画到另一个地方。它只是创造了这种外观。在幕后,当动画开始时,对象实际上会跳到它的最终位置。

如果你需要能够在物体移动时轻击/拖动/滑动物体,则必须自己动手。你做的是在父视图上放置一个手势识别器,它包含整个运动范围(可能是整个屏幕)。然后你需要使用动画视图层的表示层,翻译点的坐标从手势识别器的坐标空间到图层的坐标空间,并使用图层的hitTest方法判断该点是否在图层上。

我在Github上有一个名为iOS-CAAnimation-group-demo的项目,它做了类似的事情(它沿着复杂的路径动画图像视图,你可以点击图像视图暂停动画,而不是#' s&# 34;在飞行中"。

几年前,它是用Objective-C编写的,但它应该有助于至少说明这种技术。