개발+IT

[iOS]스크롤 혹은 Pan 제스쳐에 간섭받지 않는 Custom UIControl 만들기

최소값과 최대값을 설정하는 슬라이더 컨트롤이 필요한 일이 있었는데, 유감스럽게도 iOS 기본 UISlider는 하나의 Thumb만 제공하고 있어 직접 구현해야 하는 상황. 구현 자체야 크게 어렵지 않아보여 적당히 뚝딱 해서 테스트를 하려니 Thumb을 잡고 움직이는데 조금 움직이다가 cancelTracking이 호출되는게 아닌가. 딱 보니 이 커스텀 컨트롤이 스크롤 뷰 안에 들어있어서 그런것 같았다. 그렇다면 사용자 컨트롤 추적이 시작될 때 해당 스크롤뷰의 isScrollEnabled 값을 false로 설정하면 되겠지? 싶어 해보았는데 여전히 마음먹은대로 작동하질 않는 것이 아닌가. 그래서 이걸 어떻게 하나 찾아보다가 괜찮아보이는 해결 방법을 찾았다. 

위 링크의 해결 방법은 내 경우와 달리 사용자의 커스텀 슬라이더가 iOS13 스타일의 모달 프레젠트 상황에서 사용자 컨트롤 추적이 방해받는 경우였는데, 사실 스크롤뷰의 그것과 모달 프레젠트 상황의 그것이 크게 다르지 않겠다 싶어 적용해보았다. 결과적으로는 의도한대로 아주 잘 작동한다.

위 코드를 설명해보자면, 일단 gestureRecognizerShouldBegin 함수는 해당 컨트롤이 사용자 터치가 시작될 때 해당 터치에 대한 인식을 할지 말지 알려주는 함수이다. true를 반환하면 인식하는 것이고, false를 반환하면 인식하지 않는다. 그래서 이 커스텀 슬라이더가 터치(제스쳐)를 인식할 때, 해당 제스쳐가 Pan Gesture면 무시하라고 알려주는 것이다. 모달 프레젠트도 스크롤뷰도 기본적으로 Pan Gesture이기 때문에 뷰컨트롤러나 스크롤뷰보다 먼저 터치를 인식하는 커스텀 슬라이더가 인식하지 마라! 라고 하면 중간에 cancelTracking이 호출되지 않는 것이다.

그렇다면 커스텀 슬라이드의 각 Thumb을 잡고 움직이는 것 역시 Pan Gesture가 아니냐 라고 할 수 있는데, 애시당처 슬라이더를 구현할때 각 Thumb을 뷰로 만들어서 움직이도록 한게 아니라 사용자 터치의 움직임을 인식하고 그에 따라 매번 새로 Thumb을 그려주도록 하였기 때문에 Pan Gesture와는 무관하게 동작한다.

GAE BAL JA

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

hell yeah, world
hell yeah, world
구독자 111
멤버십 가입

0개의 댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
새로운 알림이 없습니다.