주요 내용으로 건너뛰기

UIScrollView에서 Swipe Gesture 사용하기

당연히 UITableView, UICollectionView 포함

UITableView를 포함하는 ViewController를 만들다가 횡으로 스와이프해서 창을 닫게 만들려고 UIPanGestureRecognizer를 넣었는데 이상하게 동작을 안하는 경우가 있다. 이게 뭔가 싶어 조금 검색해보니 UITableView 내의 UIScrollView가 자체적으로 지니고 있는 UIPanGestureRecognizer 때문이라는 얘기가 있다. 그래서 UIScrollView 문서를 확인해보니 실제로 갖고 있었다. 하긴 이게 없으면 스크롤이라는 것을 할 수가 없겠지... 여튼 이것 때문에 스토리보드를 통해 제스쳐를 등록하면 아예 동작하지 않고, 코드 내에서 스크롤 뷰에 직접 제스쳐를 등록하면 직접 등록한 스와이프 제스쳐만 작동하고 스크롤은 작동하지 않는다. 이런 난감할데가...하지만 조금 찾아보니 생각보다 훨씬 쉬운 해결책이 있었다.

일단 자주 쓰이는 테이블 뷰 컨트롤러를 예시로 들도록 하겠다. 저렇게 스와이프 제스쳐를 등록할 뷰 콘트롤러에 UIGestureRecognizerDelegate를 추가한다. 그리고 스와이프 제스쳐를 생성해 delegate를 등록한 후, 뷰 콘트롤러의 메인 뷰(?)에 해당 제스쳐를 등록한다.

이제 하나만 더 하면 된다. UIGestureRecognizerDelegate의 메서드 하나만 구현하면 된다.

해당 메소드에 대한 설명을 보면 "Asks the delegate if two gesture recognizers should be allowed to recognize gestures simultaneously."라고 나온다. 간략하게 번역해보자면 델리게이트에게 두 개의 제스쳐가 있으면 둘 다 허용할 것인지 물어본다는 것이다. 가뿐하게 true를 리턴하면 스크롤도 따로 등록한 스와이프 제스쳐도 잘 동작한다. 이 간단한걸 몰라서 깜짝놀라다니...여튼 어쨌든 해결함.


안드로이드 애플리케이션 개발자

구본욱 님의 창작활동을 응원하고 싶으세요?

댓글 2

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
#15
안드로이드 탭 터치 이벤트 가로채기
#17
grouped 스타일 UITableView 기본 헤더 없애기