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

Posted

技术标签:

【中文标题】如何让动画和手势识别器协同工作? (迅速)【英文标题】:How to make animations and gesture recognisers work together? (Swift) 【发布时间】:2017-11-11 14:43:43 【问题描述】:

我做了一个简单的项目,带有滑动手势识别器和动画。我让我的标签移动,每 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)
`

【问题讨论】:

显示一些代码会更有帮助。 这里,添加代码(第一次在 viewDidLoad 中调用 animate1 函数) 使用 UIViewPropertyAnimator。它会自动为您执行此操作(使动画视图可点击,甚至允许您拖动动画视图并在需要时中断动画)。 【参考方案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 编写的,但它至少应该有助于说明这项技术。

【讨论】:

是的,我需要在移动的物体上滑动,至少这是目标。稍后应该有更多移动的物体,我需要将它们刷出来。如果可能,我需要能够在所有可能的时间与该对象进行交互。你的回答有点帮助,现在我可以在下一个开始之前在动画结束时进行交互,但这仍然不是我所需要的 然后查看我的答案的编辑。我添加了一个指向处理视图点击的项目的链接。

以上是关于如何让动画和手势识别器协同工作? (迅速)的主要内容,如果未能解决你的问题,请参考以下文章

如何在点击手势上为 UIImageView 设置动画?

iOS 动画块手势识别器

手势识别基于matlab GUI SIFT+SVM算法手势识别含Matlab源码 1789期

手势识别+机器学习,与美洲豹实时互动!

快速推迟手势识别器(UISwipeGestureRecognizer)

为 UITableview 的高度设置动画时,滚动手势识别器保持相同大小