https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures
"Use gesture recognizers to simplify touch handling and create a consistent user experience."
터치 처리를 단순화하고 일관적인 사용자 경험을 생성하기 위해 제스쳐 리코그나이저를 사용합니다.
제스쳐 리코그나이저는 뷰에서 터치 혹은 누르기 이벤트를 처리하기 위한 가장 단순한 방법입니다. 어떠한 뷰라고 하더라도 하나 혹은 하나 이상의 제스처 리코그나이저를 갖도록 할 수 있습니다. 제스처 리코그나이저는 해당 뷰에 들어오는 이벤트를 처리 및 해석하는 데 필요한 모든 로직과, 알려진 패턴에 일치시킬 수 있도록 필요한 모든 로직을 캡슐화합니다. 만약 일치되는 무엇인가가 감지되면 제스처 리코그나이저는 뷰 컨트롤러, 뷰 자체, 앱에 있는 모든 객체가 될 수 있는 할당된 목표에게 감지된 내용을 알려줍니다.
제스처 리코그나이저는 노티피케이션을 전달하기 위해 타깃-액션 디자인 패턴을 사용합니다. UITapGestureRecognizer
객체가 뷰에서 한 손가락의 탭을 감지하게 되면, 응답을 제공하기 위해 사용하는, 뷰의 뷰 컨트롤러가 갖는 액션 메소드를 호출합니다.
Figure 1 Gesture recognizer notifying its target
제스처 리코그나이저는 이산적인 것과 연속적인 것 두 가지로 타입으로 나눠집니다. 이산적 제스처 리코그나이저는 제스처가 인식된 후 정확히 한 번 액션 메소드를 호출합니다. 초기 인식 기준에 부합하는 것이 발생하면, 연속적 제스처 리코그나이저는 제스처의 이벤트에 있는 정보가 변경될 때마다 알려주면서 액션 메소드를 여러번 호출합니다. 예를 들어 UIPanGestureRecognizer
객체는 터치 위치가 바뀔 때마다 액션 메소드를 호출합니다.
인터페이스 빌더는 표준 UIKit
제스처 리코그나이저 객체 각각을 포함합니다. 커스텀 UIGestireRecognizer
서브클래스를 나타내기 위해 사용할 수 있는 커스텀 제스처 리코그나이저 객체 또한 포함하고 있습니다.
제스처 리코그나이저를 설정하려면 아래 내용을 수행해야 합니다.
제스처 리코그나이저를 우클릭하고 Sent Action 셀렉터를 인터페이스에 있는 적합한 객체에 연결함으로써 위에서 설명한 연결을 생성할 수 있습니다. 제스처 리코그나이저의 addTarget(_:action:)
메소드를 사용해 코드 작성으로 액션 메소드를 설정할 수도 있습니다.
Listing 1은 제스처 리코그나이저의 액션 메소드에 대한 제너릭 형식을 나타냅니다. 선호하는 것에 따라 특정 제스처 리코그나이저 서브클래스에 일치시킬 수 있도록 파라미터 타입을 변경할 수도 있습니다.
Listing 1 Gesture recognizer action methods
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)
제스처 리코그나이저에 관련이 있는 액션 메소드는 해당 제스처에 대한 앱의 응답을 제공합니다. 이산적 제스처의 경우 액션 메소드는 버튼의 액션 메소드와 유사합니다. 액션 메소드가 한 번 호출될 때 해당 제스처에 적합한 작업 무엇이든 이를 수행하도록 합니다. 연속적 제스처의 경우 액션 메소드는 제스처의 인식에 응답할 수 있습니다. 동시에 제스처가 인식되기 전에도 이벤트를 추적할 수 있습니다. 이벤트 추적은 더 상호작용성이 높은 경험을 생성할 수 있도록 해줍니다. 예를 들어 UIPanGestureRecognizer
에서 앱에 있는 컨텐트의 위치 조정을 위한 업데이트를 사용할 수 있습니다.
제스처 리코그나이저의 상태 속성은 객체의 현재 인식 상태를 전달합니다. 연속적 제스처의 경우 제스처 리코그나이저는 이속성의 값을 UIGestureRecognizer.State.began
에서 UIGestureRecognizer.State.changed
로, 다시 UIGestureRecognizer.State.ended
로 업데이트하거나 UIGestureRecognizer.State.cancelled
로 업데이트합니다. 액션 메소드는 액션의 적합한 코스를 결정하기 위해 이 속성을 사용합니다. 예를 들어 began과 changed 상태를 컨텐트의 일시적 변화에 대해 사용할 수 있습니다. 또한, 변경이 영구적인 상태로 만들기 위해 ended 상태를 사용할 수 있으며, 변경사항을 포기하기 위해 cancelled 상태를 사용할 수도 있습니다. 항상 액션을 수행하기 전에 제스처 리코그나이저의 상태 속성 값을 확인하시기 바랍니다.
제스처의 특정 타입을 처리하기 위한 방법의 예시는 아래 정보를 살펴보시기 바랍니다.
Handling Tap Gestures
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_tap_gestures
https://velog.io/@panther222128/Handling-Tap-Gestures
Handling Long-Press Gestures
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_long-press_gestures
https://velog.io/@panther222128/Handling-Long-Press-Gestures
Handling Pan Gestures
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_pan_gestures
https://velog.io/@panther222128/Handling-Pan-Gestures
Handling Swipe Gestures
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_swipe_gestures
https://velog.io/@panther222128/Handling-Swipe-Gestures
Handling Pinch Gestures
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_pinch_gestures
https://velog.io/@panther222128/Handling-Pinch-Gestures
Handling Rotation Gestures
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_uikit_gestures/handling_rotation_gestures
https://velog.io/@panther222128/Handling-Rotation-Gestures
제스처 리코그나이저 상태 및 어떻게 코드에 영향을 미치는지를 알고 싶다면, Implementing a Custom Guesture Recognizer를 살펴보시기 바랍니다.
Implementing a Custom Guesture Recognizer
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/implementing_a_custom_gesture_recognizer
https://velog.io/@panther222128/Implementing-a-Custom-Gesture-Recognizer
같은 뷰에서 다중 제스쳐 리코그나이저를 사용하는 방법을 알아봅니다.
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/coordinating_multiple_gesture_recognizers
https://velog.io/@panther222128/Coordinating-Multiple-Gesture-Recognizers
뷰에 대한 포인터 움직임을 해석하는 이산적 제스쳐 리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uihovergesturerecognizer
https://velog.io/@panther222128/UIHoverGestureRecognizer
long-press 제스쳐를 해석하는 이산적 제스쳐 리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uilongpressgesturerecognizer
https://velog.io/@panther222128/UILongPressGestureRecognizer
팬 제스쳐를 해석하는 이산적 제스쳐 리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uipangesturerecognizer
https://velog.io/@panther222128/UIPanGestureRecognizer
두 터치로 이뤄지는 핀치 제스쳐를 해석하는 이산적 제스쳐 리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uipinchgesturerecognizer
https://velog.io/@panther222128/UIPinchGestureRecognizer
두 손가락으로 하는 회전 제스쳐를 해석하는 이산적 제스쳐 리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uirotationgesturerecognizer
https://velog.io/@panther222128/UIRotationGestureRecognizer
스크린의 모서리 근처에서 시작한 팬 제스쳐를 해석하는 이산적 제스쳐 리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uiscreenedgepangesturerecognizer
https://velog.io/@panther222128/UIScreenEdgePanGestureRecognizer
하나 혹은 하나 이상의 방향에서 스와이프 제스쳐를 해석하는 이산적 제스쳐리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uiswipegesturerecognizer
https://velog.io/@panther222128/UISwipeGestureRecognizer
단일 혹은 다중 탭을 해석하는 이산적 제스쳐 리코그나이저입니다.
https://developer.apple.com/documentation/uikit/uitapgesturerecognizer
https://velog.io/@panther222128/UITapGestureRecognizer