호댕의 iOS 개발

[iOS] 터치와 제스쳐 둘다 받고 싶다면? cancelsTouchesInView 본문

Software Engineering/iOS

[iOS] 터치와 제스쳐 둘다 받고 싶다면? cancelsTouchesInView

호르댕댕댕 2022. 3. 1. 10:53

😱 문제 상황

TextView나 셀이 아닌 부분을 터치하면 키보드가 내려가도록 구현하려고 TapGestureRecognizer를 등록하여 키보드가 내려가도록 했다. 하지만 이렇게 하니 다른 터치 이벤트가 전달이 안되어 터치가 필요한 곳도 터치를 인식하지 못하고 키보드만 꺼지는 문제가 있었다. 

 

그래서 발견한 해결책!!을 말하기 전에 Gesture Recognizer에 대해 좀 더 알아보자. 

아무리 셀을 터치해도 인식을 하지 못한다...

🔭 UIGestureRecognizer

Gesture Recognizer를 사용하게 되면 터치 이벤트를 전달하기 전에 Gesture Recognizer에 터치 이벤트를 전달하게 된다. 

또한 Gesture Recognizer가 제스처를 인식하게 되면 나머지 터치는 모두 취소되게 된다. 

 

즉 위 문제 상황에서도 다른 터치들이 모두 탭으로 인식되어 Gesture Recognizer가 키보드를 내려가도록 하고 터치는 전부 취소해버리는 것이었다. 

 

그러니... 아무리 셀을 터치해도 동작을 안한 것이었다. 

 

이때 사용할 수 있는 것이 바로 .cancelsTouchesInView이다. 

 

 

🧹 .cancelsTouchesInView

이는 UIGestureRecognizer의 인스턴스 프로퍼티로 기본이 true이다. 따라서 Gesture Recognizer에 제스처를 전달하고 다른 터치들은 전부 취소를 하게 된다. 

따라서 제스처이외에도 터치를 전부 수신하고 싶다면 해당 프로퍼티를 false로 해주면 된다. 

 

따라서 이를 false로 해주었더니 터치를 했을 때 키보드가 내려가면서 셀도 잘 눌렸다.

 

해결책은 엄청나게 간단했지만 해당 프로퍼티의 존재를 모르고 있다면 충분히 해맬 수 있다.. 나 또한 엄청 헤매다가 찾았고 말이다.. 

Comments