현상
- UICollectionView에서 Delegate 메소드인 didSelectItemAt 메소드를 구현했는데 이벤트가 들어오지 않았다.
- Breakpoint를 걸어도 걸리지 않았다.
- UICollectionView 객체의 delegate와 ViewController도 잘 연결되어 있었다
- Storyboard에서 collectionView의 'User Interaction Enabled'도 잘 체크되어 있다.
원인
- CollectionView가 속한 부모 view에 Tap Gesture Recognizer가 추가되어있었다.
- 발생한 터치 이벤트가 Tab Gesture Recognizer로 인해 view로 터치 이벤트가 전달되지 않았기 때문에 didSelectAt 메소드가 수행되지 않았다.
- UIGestureRecognizer가 지정된 객체는 터치 이벤트 등 제스처 이벤트가 발생하면 해당 이벤트를 view로 보내기 전에 Gesture Recognizer로 전달한다
- 제스처가 Gesture Recognizer에 등록된 것이라면 지정된 Action 메소드를 수행한다. 그리고 해당 이벤트를 view로 전달하지 않고 'Cancel' 시킨다
- 제스처가 Gesture Recognizer에 등록되지 않은 것이라면 수행할 Action 메소드가 없다. 따라서 해당 이벤트를 view로 다시 전달한다.

- 결론적으로, UIGestureRecognizer가 gesture를 인식하고 Action메소드를 수행한 후 해당 이벤트를 view로 다시 전달하지 않았기 때문에 didSelectAt 메소드가 수행되지 않았다. (UIGestureRecognizer에 대한 자세한 설명: https://baked-corn.tistory.com/130)
해결
UIGestureRecognizer의 cancelsTouchesInView 속성의 값을 false로 설정한다. 이값이 false이면 Gesture Recognizer가 gesture를 인식해도 터치 이벤트들을 취소 시키지 않고 view에 터치 이벤트들을 전달하기 때문에 didSelectAt 메소드가 호출될 수 있다.
- CancelsTouchesInView
- Gesture Recognizer가 gesture를 인식하면, 나머지 터치 정보들은 뷰로 전달되지 않고 이전에 전달된 터치 이벤트들은 취소된다. (CancelsTouchesInView == true)
- 만약 CancelsTouchesInView == false 이면, Gesture Recognizer가 gesture를 인식해도 터치 이벤트들을 취소 시키지 않고 view에 터치 이벤트들을 전달한다.
- https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview
'iOS > Swift' 카테고리의 다른 글
[iOS] Dark mode 사용하지 않기 (Light mode 강제 설정하기 ) (0) | 2021.12.12 |
---|---|
[iOS] Codable - JSON Encoding 과 Decoding 하기 (0) | 2021.12.11 |
[iOS] Swift - enum (2) (0) | 2021.11.20 |
[iOS] Swift - enum (1) (0) | 2021.11.17 |
[iOS] CGAffineTransform - 뷰 객체의 이동, 회전, 크기 조절 (0) | 2021.11.01 |
현상
- UICollectionView에서 Delegate 메소드인 didSelectItemAt 메소드를 구현했는데 이벤트가 들어오지 않았다.
- Breakpoint를 걸어도 걸리지 않았다.
- UICollectionView 객체의 delegate와 ViewController도 잘 연결되어 있었다
- Storyboard에서 collectionView의 'User Interaction Enabled'도 잘 체크되어 있다.
원인
- CollectionView가 속한 부모 view에 Tap Gesture Recognizer가 추가되어있었다.
- 발생한 터치 이벤트가 Tab Gesture Recognizer로 인해 view로 터치 이벤트가 전달되지 않았기 때문에 didSelectAt 메소드가 수행되지 않았다.
- UIGestureRecognizer가 지정된 객체는 터치 이벤트 등 제스처 이벤트가 발생하면 해당 이벤트를 view로 보내기 전에 Gesture Recognizer로 전달한다
- 제스처가 Gesture Recognizer에 등록된 것이라면 지정된 Action 메소드를 수행한다. 그리고 해당 이벤트를 view로 전달하지 않고 'Cancel' 시킨다
- 제스처가 Gesture Recognizer에 등록되지 않은 것이라면 수행할 Action 메소드가 없다. 따라서 해당 이벤트를 view로 다시 전달한다.

- 결론적으로, UIGestureRecognizer가 gesture를 인식하고 Action메소드를 수행한 후 해당 이벤트를 view로 다시 전달하지 않았기 때문에 didSelectAt 메소드가 수행되지 않았다. (UIGestureRecognizer에 대한 자세한 설명: https://baked-corn.tistory.com/130)
해결
UIGestureRecognizer의 cancelsTouchesInView 속성의 값을 false로 설정한다. 이값이 false이면 Gesture Recognizer가 gesture를 인식해도 터치 이벤트들을 취소 시키지 않고 view에 터치 이벤트들을 전달하기 때문에 didSelectAt 메소드가 호출될 수 있다.
- CancelsTouchesInView
- Gesture Recognizer가 gesture를 인식하면, 나머지 터치 정보들은 뷰로 전달되지 않고 이전에 전달된 터치 이벤트들은 취소된다. (CancelsTouchesInView == true)
- 만약 CancelsTouchesInView == false 이면, Gesture Recognizer가 gesture를 인식해도 터치 이벤트들을 취소 시키지 않고 view에 터치 이벤트들을 전달한다.
- https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview
'iOS > Swift' 카테고리의 다른 글
[iOS] Dark mode 사용하지 않기 (Light mode 강제 설정하기 ) (0) | 2021.12.12 |
---|---|
[iOS] Codable - JSON Encoding 과 Decoding 하기 (0) | 2021.12.11 |
[iOS] Swift - enum (2) (0) | 2021.11.20 |
[iOS] Swift - enum (1) (0) | 2021.11.17 |
[iOS] CGAffineTransform - 뷰 객체의 이동, 회전, 크기 조절 (0) | 2021.11.01 |