点击事件不会在动画imageview上触发

时间:2019-05-02 09:29:34

标签: swift uiimageview uigesturerecognizer uitapgesturerecognizer

我想要单击带有UIBezierPath(从上到下滑动)的动画imageView。但是我发现的每个Google帮助都无法解决。但是它不会打印“单击”。

动画效果很好。也许有人知道吗?

非常感谢您的帮助。

override func viewDidLoad() {
    super.viewDidLoad()

    let imageView = UIImageView(image: UIImage(named: "advent_button"))
    let dimension = 25 + drand48() * 30
    imageView.frame = CGRect(x: 0, y: 0, width: dimension, height: dimension)

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleImageTap))
    imageView.addGestureRecognizer(tapGestureRecognizer)
    imageView.isUserInteractionEnabled = true

    let animation = CAKeyframeAnimation(keyPath: "position")
    animation.path = customPath().cgPath
    animation.duration = 20
    animation.fillMode = .forwards
    animation.isRemovedOnCompletion = false
    animation.repeatCount = 0.5
    animation.timingFunction = CAMediaTimingFunction(name: .easeOut)

    imageView.layer.add(animation, forKey: nil)
    view.addSubview(imageView)        
}

@objc func handleImageTap() {
    print ("clicked")
}

func customPath() -> UIBezierPath {
    let path = UIBezierPath()

    path.move(to: CGPoint(x: 200, y: 0))
    let endpoint = CGPoint(x: 20 , y: 700)
    let cp1 = CGPoint(x: 90, y: 250)
    let cp2 = CGPoint(x: 180, y: 400)
    path.addCurve(to: endpoint, controlPoint1: cp1, controlPoint2: cp2)
    return path
}

2 个答案:

答案 0 :(得分:0)

我收到您的问题。我确定您触摸的不是UIImageView图层,并且已将uitapgesturerecognizer添加到UIImageview而不是图层。做一件事

animation.isRemovedOnCompletion = true

并设置imageView.frame相似的坐标,动画将在其中停止

完整代码:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let imageView = UIImageView(image: UIImage(named: "Icon123"))
        imageView.backgroundColor = .red
      //  let dimension = 25 + drand48() * 30

        imageView.isUserInteractionEnabled = true

        imageView.frame = CGRect(x: 10, y: 200, width: 50, height: 50)

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleImageTap))
        imageView.addGestureRecognizer(tapGestureRecognizer)

        let animation = CAKeyframeAnimation(keyPath: "position")
        animation.path = customPath().cgPath
        animation.duration = 5
        animation.fillMode = .forwards
        animation.isRemovedOnCompletion = true
        animation.repeatCount = 0.5
        animation.timingFunction = CAMediaTimingFunction(name: .easeOut)

        imageView.layer.add(animation, forKey: nil)
        view.addSubview(imageView)


        // Do any additional setup after loading the view, typically from a nib.
    }


    @objc func handleImageTap() {
        print ("clicked")
    }

    func customPath() -> UIBezierPath {
        let path = UIBezierPath()

        path.move(to: CGPoint(x: 200, y: 0))
        let endpoint = CGPoint(x: 20 , y: 700)
        let cp1 = CGPoint(x: 90, y: 250)
        let cp2 = CGPoint(x: 180, y: 400)
        path.addCurve(to: endpoint, controlPoint1: cp1, controlPoint2: cp2)
        return path
    }

}

答案 1 :(得分:0)

我尝试了以下操作:

UIView.animate(withDuration: 30, delay: delay, options: [.allowUserInteraction], animations: {
        self.button.frame = CGRect(
            x: randomXEndShift,
            y: 700,
            width: dimension,
            height: dimension)
    }, completion: nil)

显示相同的行为。即使使用.allowUserInteraction也完全没有帮助。