检测动画UIImageView上的TAPS



我正在使用uiimageview项目上的自定义路径动画进行Swift 3项目。代码大纲如下:

// parentView and other parameters are configured externally
let imageView = UIImageView(image: image)
imageView.isUserInteractionEnabled = true
let gr = UITapGestureRecognizer(target: self, action: #selector(onTap(gesture:)))
parentView.addGestureRecognizer(gr)
parentView.addSubview(imageView)
// Then I set up animation, including:
let animation = CAKeyframeAnimation(keyPath: "position")
// .... eventually ....
imageView.layer.add(animation, forKey: nil)

以标准方式声明ONTAP方法:

func onTap(gesture:UITapGestureRecognizer) {
    print("ImageView frame is (self.imageView.layer.visibleRect)")
    print("Gesture occurred at (gesture.location(in: FloatingImageHandler.parentView))")
}

问题是,每次我调用add gestureRecognizer时,先前的手势识别器都会被覆盖,因此任何检测到的点击都会始终指向最后添加的图像,并且未准确检测到位置(因此,如果某人在ParentView上敲击任何地方,则仍然会触发ontap方法(。

如何以每图像视图的基础准确检测到TAP?由于自定义路径动画要求,我无法使用Uiview.Ainimate或其他方法,而且我也无法创建覆盖透明的Uiview来覆盖父视图,因为我需要这些" floaters"来不吞咽事件。

您要实现的目标不清楚,但我认为您应该将手势识别器添加到ImageView,而不是在ParentView中添加。

所以:

parentView.addGestureRecognizer(gr)

应由以下方式替换:

imageView.addGestureRecognizer(gr)

在您的ONTAP功能中,您可能应该做类似的事情:

print("ImageView frame is (gesture.view.layer.visibleRect)")
print("Gesture occurred at (gesture.location(in: gesture.view))")

我认为您可以在onTap函数上检查属于imageView的TAP位置。这样:

    func ontap(gesture:UITapGestureRecognizer) {
        let point = gesture.location(in: parentView)
        if imageView.layer.frame.contains(point) {
            print("ImageView frame is (self.imageView.layer.visibleRect)")
            print("Gesture occurred at (point)")
        }
    }

由于图层没有更新其帧/位置等,我需要在我写的图像视图子类中添加以下内容(FloatingImageView(:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let pres = self.layer.presentation()!
    let suppt = self.convert(point, to: self.superview!)
    let prespt = self.superview!.layer.convert(suppt, to: pres)
    return super.hitTest(prespt, with: event)
}

我还将手势识别器移至父视图中,因此随时只有一个GR,并为所添加的每个子视图创建了一个唯一的标签。处理程序看起来如下:

func onTap(gesture:UITapGestureRecognizer) {
    let p = gesture.location(in: gesture.view)
    let v = gesture.view?.hitTest(p, with: nil)
    if let v = v as? FloatingImageView {
        print("The tapped view was (v.tag)")
    }
}

其中FloatingImageViewUIImageView子类。

这种方法在iOS 10书(以及WWDC(中进行了描述,并为iOS 9工作。我仍在评估基于UIViewPropertyAnimator的TAP检测,因此,如果您可以给我一个使用UIViewPropertyAnimator执行上述操作的示例,我会将您的答案标记为正确的答案。

最新更新