2017-04-27 5 views
1

Swift 3 프로젝트의 UIImageView 항목에 대한 사용자 지정 경로 애니메이션을 사용하고 있습니다. 다음과 같이 코드의 개요는 다음과 같습니다애니메이션 UIImageView의 탭 감지

ONTAP 방법은 표준 방법으로 선언
// 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) 

:

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를 만들 수도 없습니다.

+0

하위 클래스를 구현했지만 때때로 작동하지 않습니다. 버튼이 클릭되었음을 알지 못하지만 때로는 보이지 않습니다. 이것은 내 질문입니다 : https://stackoverflow.com/questions/46391003/retrieve-tapped-uibutton-in-a-moving-uibezierpath –

답변

0

, 나는 내가 쓴 이미지보기 서브 클래스 (FloatingImageView)에 다음을 추가하는 데 필요한 제스처 인식기를 부모보기로 이동하여 언제든지 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 기반의 탭 탐지를 평가 중이므로 UIViewPropertyAnimator을 사용하는 방법에 대한 예제를 제공 할 수 있다면 올바른 답으로 표시해 드리겠습니다.

1

달성하고자하는 것은 분명하지 않지만, 제스처 인식기를 parentView가 아닌 ​​imageView에 추가해야한다고 생각합니다.

은 그래서 :

parentView.addGestureRecognizer(gr) 

이 교체해야합니다 :

imageView.addGestureRecognizer(gr) 

그리고 당신은 아마 같은 것을해야 당신 ONTAP 기능에

:

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

나는 행운이없는 원래 그것을했습니다. 또한 실험으로 UIImageView를 서브 클래 싱하고 거기에 제스처 인식기를 추가하려고 시도했지만 이미지에서 탭을 감지하지 못했습니다. 이것은 isUserInteractionEnabled를 true로 설정 했음에도 불구하고 발생합니다. – LNI

+0

애니메이션을 완전히 제거하면 도청 장치가 작동합니까? 그냥 정적 UIImageViews에. –

+0

그렇습니다. 문제는 레이어에 애니메이션이 적용될 때 "위치"가 업데이트되지 않는다는 것입니다. – LNI

0

을 당신을 생각 func에있는 imageView에 속한 탭 위치를 확인할 수 있습니다. . 이처럼 : 또한

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) 
} 

내가 : 레이어는 등 자신의 프레임/위치를 업데이트하지 않기 때문에

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)") 
     } 
    } 
+0

작동하지 않습니다. 내가 게시 할 답변을보십시오. – LNI