Gestures
Tap Gesture

tap gesture action 메서드가 호출되지 않을 때.
- userInteractionEnabled가 YES인지 확인
- numberOfTapsRequired 프로퍼티가 제대로 설정되었는지 확인.
- numberOfTouchesRequired 프로퍼티가 제대로 설정되었는지 확인

Long Press Gesture
long press gesture action 메서드가 호출되자 않을 때.
- userInteractionEnabled가 YES인지 확인.
- mininumPressDuration 프로퍼티에 설정된 시간보다 길게 press 하고 있었는지 체크.
- numberOfTapsRequired 프로퍼티가 제대로 설정되었는지 확인.
- numberOfTouchesRequired 프로퍼티가 제대로 설정되었는지 확인.

Pan Gesture
- UIPanGestureRecognizer 이외에 UIScreenEdgePanGestureRecognizer가 있다. UIScreenEdgePanGestureRecognizer는 스크린 Edge에서 panGesture가 발생할 경우 핸들링 하기 위한 것이다.

pan gesture action 메서드가 호출되지 않을 때.
- userInteractionEnabled가 YES인지 확인.
- mininumNumberOfTouches와 maximumNumberOfTouches사이 갯수의 손가락으로 터치해야 한다.
- UIScreenEdgePanGestureRecognizer의 경우 edges 프로퍼티가 설정되어 있어야 하고, 해당 edges에서 event가 시작되야 한다.

Swipe Gesture
swipe gesture action 메서드가 호출되지 않을 때.
- userInteractionEnabled가 YES인지 확인.
- touch한 손가락 갯수가 numberOfTouchesRequired와 같아야 한다. 
- direction 프로퍼티와 swipe한 방향이 맞아야 한다. 

*Pinch Gesture, Rotation Gesture는 생략.


Custom Gesture Recognizer
: Custom Gesture Recognizer를 구현하기 위해서는 UIGetstureRecognizerSubclass.h 파일을 import하고 touchesBegan:withEvent, touchesMoved:withEvent:, touchesEnded:withEvent, touchesCancelled:withEvent: 등의 메서드를 오버라이드 해서 custom recognizer를 구현해 줘야 한다. 
올바르게 구현하려면 discrete gesture recognizer, continuous gesture recognizer가 각각 가질수 있는 state등 여러가지 사전 지식이 필요하다. 자세한 구현방법은 설명하지 않겠다.

참조
https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/ImplementingaCustomGestureRecognizer.html#//apple_ref/doc/uid/TP40009541-CH8-SW1


Coordinating Multiple Gesture Recognizers
: 동시에 두개 이상의 Gesture Recognizer를 다룰때, 별 다른 처리를 하지 않으면 충돌하기 마련이다. 예를 들어, 하나의 뷰에 Pen gesture Recognizer와 Swipe gesture Recognizer를 동시에 설정하면 항상 Pen gesture만 인식이 될 것이다. Pen gesture는 continuous gesture이기 때문에 Swipe gesture 보다 우선순위가 높다. 이런 경우에 우선순위를 어떻게 처리해야할 지 알아보겠다.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool
{
    if gestureRecognizer = self.penGesture && otherGestureRecognizer == self.swipeGesture
    {
        return true
    }
    
    return false
}
위 메서드는 UIGestureRecognizer의 delegate인데 panGesture에 해당 delegate를 설정해 주고 swipeGesture의 state가 fail이 아닌 경우에만 panGesture를 인식하도록 했다.

또 다른 delegate가 있는데 주체만 바뀌었을 뿐 동작 방식은 같다. 

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool
{
    if gestureRecognizer = self. swipeGesture && otherGestureRecognizer == self.panGesture
    {
        return true
    }
    
    return false    
}

또한, 동시에 2개이상의 gesture recognition을 허용할 수 있다.
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: delegate를 설정하여 처리하면 된다. 이 delegate에서 YES를 return 하면 Simultaneous Recognition을 허용하겠다는 것이다.


Attaching Gesture Recognizers to UIKit Controls
: 일반적으로 내가 설정한 gesture recognizer는 UIKit Control들이 자체적으로 가지고 있는 event handling 동작에 영향을 미치지 않는다. 예를 들어 view에 버튼을 올리고 view에  tapGesture를 등록해도 버튼 event에 대한 동작은 손상되지 않는다는 것이다. 다만 버튼 evnet에 대한 동작에 우선하는 gesture recognizer를 등록하고 싶다면 button 자체에 gesture recognizer를 등록해야 한다. 다만, 추천하지는 않는다. 


출처
- https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/index.html#//apple_ref/doc/uid/TP40009541-CH3-SW1

'IOS > 공통' 카테고리의 다른 글

Bundle Programming Guide  (0) 2017.06.11
Event Handling Guide - Responders  (0) 2017.05.03
Objective-C, Swift 기초  (0) 2017.03.26
Cocoa Pods  (0) 2017.02.19
About Bundle  (0) 2017.02.14
Posted by 홍성곤
,