Swift 3プロジェクトのUIImageView項目でカスタムパスアニメーションを使用しています。次のようにコードの概要は次のとおりです。アニメーション化されたUIImageViewのタップの検出
// 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))")
}
問題は、私はaddGestureRecognizerを呼び出すたびに、前のジェスチャ認識が上書きされることをですので、任意の検出されたタップは常に最後に追加されたイメージを指し、その場所は正確には検出されません(したがって、誰かがparentViewをタップするとonTapメソッドがトリガーされます)。
イメージビューごとに正確にタップを検出するにはどうすればよいですか?カスタムパスのアニメーション要件のためにUIView.animateやその他のメソッドを使用することはできません。また、イベントを飲み込まないようにこれらの「浮動小数点」が必要なため、親ビューをカバーするための透明なUIViewを作成することもできません。
私はあなたのサブクラスを実装しましたが、時にはうまくいきません。ボタンはクリックされたことに気付かず、ときどきそれを見ます。これは私の質問です:https://stackoverflow.com/questions/46391003/retrieve-tapped-uibutton-in-a-moving-uibezierpath –