UIGestureRecognizer
1. 역할
Gesture Recognizer는 터치 이벤트를 감지하고 이를 특정 제스처(탭, 핀치, 드래그, 스와이프)로 인식한 후,
제스처가 인식되면 해당 동작에 연결된 액션을 호출하는 역할을한다.
2. 동작원리
일반적인 터치 이벤트는 이전에 배운 responder chian을 따라가지만 gesture recognizer는 UIKit에서 제공하는
별도의 처리 흐름을 이용한다.
- 터치가 발생하면 UIApplication객체에서 UIWindow 객체로 tocuh 객체가 전달된다.
- UIWindow는 뷰 계층 구조에서 가장 적합한 뷰에 터치 이벤트를 전달 시도
- 이 때 뷰에 연결된 모든 gesture recognizer들은 touch 이벤트를 인식할 수 있는 첫번 째 기회를 얻는다.
- Gesture Recognizer는 터치 이벤트를 받아 제스처로 인식할 수 있는지 여부를 평가한 후,
제스처가 완성되면 지정된 타겟에 액션을 전달한 후, 해당 이벤트는 responder chain에 가지 못하도록 제거한다. - 만약 이벤트를 처리할 수 없을 경우 responder chain 흐름대로 이벤트를 처리할 responder를 찾는다.
아래 그림을 참고하면 더 이해가 쉬울거다
그러면 왜 gesture recognizer는 일반적인 responder 체인을 따르지 않을까 ??
3. Gesture Recognizer가 Responder Chain을 사용하지 않는 이유
Gesture Recognizer는 제스처 인식을 독립적으로 처리한다. 터치 이벤트가 뷰와 상호작용하기 전에 제스처로 인식되는 것을 가능하게 하며 사용자의 터치 이벤트를 간편하게 제어하고 구현할 수 있도록 도와준다.
복잡한 터치 이벤트 처리를 직접 처리하지 않고
Gesture Recognizer를 통해 단지 제스처가 발생했을 때 어떤 동작을 해야하는지만 구현하면 된다.
결국 터치 기반 인터페이스를 보다 쉽게 만들 수 있게 도와준다.
4. Gesture Recognizer 종류
Gesture는 크게는 2개의 종류로 나뉜다.
첫번 째는 discrete(불연속적인) Gesture다.
말 그대로 한번만 발생하는 Event에 Gesture다.
discrete 제스쳐는 Recognized(인식) or Failed(실패) 로 굉장히 단순한 로직을 갖고 있다.
두번 째는 continuous(연속적인) Gesture다.
연속적인 Event가 발생하는 Gesture다.
연속적인 제스쳐는 실패 하거나 시작 이후 계속된 변화를 추적하는 제스쳐다.
각 Gesture를 담당하는 UIGestureRecognizer의 서브클래스를 살펴보자.
Recognizer 종류 | Gestrue 상세 이름 | 동작 | Gesture 종류 |
UITapGesture | Tap | 단일 탭 ~ 복수 탭 | discrete |
UISwipeGesture | Swipe | 스와이프 | discrete |
UILongPressGesture | LongPress | 롱프레스 | continuous |
UIPanGesture | Drag | 드래그 | continuous |
UIRotationGesture | Rotate | 회전 | continuous |
UIPinchGesture |
Pinch | 줌인, 줌아웃 동작 | continuous |
UIScreenEdgePanGesture | EdgePan | 가장자리 드래그 | continuous |
UIHoverGesture | Hover | 위에서 움직임 | continuous |
5. isUserInteractionEnabled
갑자기 이건 뭘까 ?? 공식문서 설명을 봐보자
유저 이벤트를 무시하거나 이벤트 큐에서 제거하는 Bool 값이다.
간단히 말하면 View가 이벤트를 전달 받을 것 인가를 판단하는 변수이다.
기본적으로는 true이며 false로 설정시 view를 위한 touch, press, keyboard 그리고 focus event는 event queue에서 무시되고 이벤트 큐에서 삭제된다.
UILabel, UIImageView는 기본값이 false이다.
대표적으로 false가 어느 때 쓰이는 지 살펴보자.
만약 다음과 같이 Button이 뒤에 있고 View가 앞에있을 때 , View를 눌러도 뒤에 버튼 액션을 동작시키고 싶다면
view.isUserInteractionEnabled = false
이렇게 설정해주면 event를 View가 수신하지 않고 뒤에있는Button이 받아 처리하게된다.
반대로 true를 주고 싶을 때는 해당 뷰가 이벤트를 받고싶을 때 설정해주면된다.
참고
https://xiaochaowei.com/download/EventHandlingGuideForIOS.pdf
'iOS > UIKit' 카테고리의 다른 글
NSObject (1) | 2024.09.10 |
---|---|
UIGraphics (0) | 2024.09.06 |
frame vs bounds (4) [ 사용 용도 ] (1) | 2024.09.02 |
frame vs bounds (3) [origin, viewport ] (3) | 2024.09.02 |
frame vs bounds (2) [ 정의, 기준점, 크기 계산 방식] (0) | 2024.09.02 |