2017-04-19 2 views
4

현재보기 외부의 탭을 감지하는 방법이 있습니까? hitTest 메서드로 무언가를 구현하려했지만 실패했지만 잘 이해할 수는 없습니다.현재보기 외부의 탭을 감지하십시오.

+0

시도했습니다 touchesBegan : 방법 – ankit

+0

현재보기가 포함 된보기에 tapGesture를 추가 할 수 있습니다. – Larme

+0

다음과 같이 처리하고 있습니다. https://stackoverflow.com/a/48790850/7132300 – algrid

답변

0

당신은 당신의보기 안에 있다면 터치가 배경 뷰했지만 "거짓"경우에만 "true"를 반환합니다 UIGestureRecognizerDelegate 프로토콜을

extension YourViewController: UIGestureRecognizerDelegate { 

     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
          shouldReceive touch: UITouch) -> Bool { 
     return (touch.view === self.view) 
     } 
    } 

를 사용할 수 있습니다.

참고 : ID 연산자 ===는 touch.view와 self.view를 비교합니다. 두 변수가 동일한 객체를 참조하는지 여부를 알고 싶습니다.

그리고 viewDidLoad()에서 gestureRecognizer를 만들고 대리자를 설정합니다.

let gestureRecognizer = UITapGestureRecognizer(target: self,action: #selector(yourActionMethod)) 
gestureRecognizer.cancelsTouchesInView = false 
gestureRecognizer.delegate = self 
view.addGestureRecognizer(gestureRecognizer) 
5

당신이해야 할 일은 어떤 안에 당신이 원하는 (당신이 터치 세트에서 첫 번째 터치 객체를 얻을 수 있고 당신이보기에 그 터치의 위치를 ​​확인해야 에서 touchesBegan입니다 터치 감지).

보기에서 터치 위치를 얻은 후 현재보기 (탭이 안쪽인지 바깥 쪽인지 확인해야하는보기) 여부를 확인해야합니다.

currentView의 프레임에 터치 위치가 포함되어 있으면 외부에서 뷰 내부에서 터치가 발생했음을 의미합니다.

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let touch = touches.first 
     guard let location = touch?.location(in: self.view) else { return } 
     if !currentView.frame.contains(location) { 
      print("Tapped outside the view") 
     }else { 
      print("Tapped inside the view") 
     } 
    } 

희망 하시겠습니까!

관련 문제