나중에 또 같은 삽질을 하지 않기 위해 내가 시도해봤던 여러가지 방법을 다 기록해두기로 했다.


문제 상황


- 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 지연은 해결되었지만, 스크롤을 하려 해도 스크롤을 시작할 때 터치한 셀이 선택되는 문제가 생긴다.

더 좋은 방법은 없을지 더 알아봐야 할 것 같다.



+ Recent posts