나중에 또 같은 삽질을 하지 않기 위해 내가 시도해봤던 여러가지 방법을 다 기록해두기로 했다.
문제 상황은
- UITableView 가 특정 상황에 multipleSelection 활성화가 된다.
- UITableView 의 각 셀 + UITableView 자체도 여러가지 GestureRecognizer 가 켜켜이 쌓여있다. (탭, 롱프레스 등등)
→ select 동작이 원활하지 않은 문제가 발생했다. touch 를 하면 셀렉트 되지 않고 꾸우욱 눌러야 didHighlight 로 겨우 들어가는.. 그런 상태
해결법 #1
gesture recognizer 들의 cancelsTouchesInView 옵션을 false 로 한다.
gestureRecognizer.cancelsTouchesInView = false
위 옵션은 제스처가 인식될 때 해당 터치 이벤트가 뷰에도 전달되는지와 관련 있는 옵션이다.
A Boolean value affecting whether touches are delivered to a view when a gesture is recognized.
출처: 애플 공식 가이드
근데 내 경우에는 이 옵션만으로는 해결되지 않았다.
해결법 #2
gesture recognizer 들에 아래 함수를 구현한 delegate 를 설정해준다.
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return /* true of false */
}
Gesture Recognizer 가 터치를 받아야 할지 말아야 할지를 반환하는 함수인데, false 를 반환하는 경우에는 gesture recognizer 가 터치 이벤트를 처리하지 않는다(?)
표현이 적합한지 모르겠어서 여기에도 문서를 첨부하자면
Ask the delegate if a gesture recognizer should receive an object representing a touch.
출처: 애플 공식 가이드
근데 이걸로도 해결되지 않았다 ㅎㅎ
해결법 #3
UITableView 의 delaysContentTouches 옵션을 false 로 한다
tableView.delaysContentTouches = false
이 옵션은 UIScrollView 하위의 옵션인데, 스크롤을 위해 터치 다운 액션에 대한 처리를 지연할 것인지 여부를 결정하는 옵션이다.
A Boolean value that determines whether the scroll view delays the handling of touch-down gestures.
출처: 애플 공식 가이드
결과적으로 이 설정을 통해 select 지연은 해결되었지만, 스크롤을 하려 해도 스크롤을 시작할 때 터치한 셀이 선택되는 문제가 생긴다.
더 좋은 방법은 없을지 더 알아봐야 할 것 같다.
'Programming > iOS / Swift' 카테고리의 다른 글
[iOS Archive] conflicting provisioning settings 어쩌구 (1) | 2017.10.18 |
---|---|
Swift 컨벤션 검사 - Swiftlint (0) | 2017.09.18 |