본문 바로가기

iOS

[iOS] Gesture Recognizer

Gesture Recognizer

Gesture Recognizer는 여러 제스처 관련 이벤트를 인식할 수 있다.

특정 제스처 이벤트가 일어날 때마다 각 타깃에 맞는 액션 메시지를 보내서 제스처 관련 이벤트를 처리할 수 있다.

 

 

UIGestureRecognizer

The base class for concrete gesture recognizers.

class UIGestureRecognizer : NSObject

UIGestureRecognizer 클래스는 특정 Gesture Recognizer에 대한 동작을 정의한다.

또한 델리게이트 객체를 활용해 일부 동작을 더욱 세밀하게 customize 할 수 있다.

 

 

UIGestureRecognizer의 하위 클래스

1. UITapGestureRecognizer 

2. UIPinchGestureRecognizer

3. UIRotationGestureRecognizer

4. UISwipeGestureRecognizer

5. UIPanGestureRecognizer : 드래그 제스처

6. UIScreenEdgePanGestureRecognizer : 화면 가장자리 드래그 제스처

7. UILongPressGestureRecognizer 

Target-Action 연결을 설정한 후 UIView의 메소드인 addGestureRecognizer(_:) 메소드를 통해 뷰에 연결한다.

제스처가 인식되면 해당 제스처 이벤트에 연결된 타깃에 액션 메시지가 전달된다.

@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)

호출되는 액션 메소드는 이런 형식을 가진다. 

윈도우는 뷰에 터치 이벤트를 전달하기 전에, 뷰에 추가된 제스처 인식기에 터치 이벤트를 전달한다.

Gesture Recognizer 가 터치 이벤트를 인식했을 경우에 뷰는 터치 이벤트를 받지 못하고, 제스처 인식기가 터치 이벤트를 인식하지 못했을 경우 뷰가 터치 이벤트를 받게 된다.

일반적인 Gesture Recognizer 동작의 흐름은 cancelsTouchesInView, delaysTouchesBegan, delaysTouchesEnded 프로퍼티의 값에 영향을 받는다. 

 

 

주요 메소드

init(target: Any?, action: Selector?)
// Target-Action의 연결을 통해 Gesture Recognizer을 초기화한다.

func location(in: UIView?) -> CGPoint
// 제스처가 발생한 좌표 반환

func addTarget(Any, action: Selector)
// Gesture Recognizer 객체에 타깃과 액션을 추가

func removeTarget(Any?, action: Selector?)
// Gesture Recognizer 객체로부터 타깃과 액션을 제거

func require(toFail: UIGestureRecognizer)
//여러 개의 Gesture Recognizer 를 가지고 있을 때, 이들 사이의 의존성을 설정

 

 

주요 프로퍼티

var state: UIGestureRecognizerState
// 현재 Gesture Recognizer의 상태

var view: UIView?
// Gesture Recognizer가 연결된 뷰입니다.

var isEnabled: Bool
// Gesture Recognizer가 사용 가능한 상태인지를 나타낸다.

var cancelsTouchInView
// 제스처가 인식되었을 때 터치 이벤트가 뷰로 전달되는 여부에 영향을 미친다.
// 이 프로퍼티가 true(기본값)이고 Gesture Recognizer가 제스처를 인식했다면, 해당 제스처의 터치는 뷰로 전달되지 않음. 
// 이전에 전달된 터치들은 touchesCancelled(_:with:) 메시지를 통해 취소된다. 
// Gesture Recognizer가 제스처를 인식 못하거나 이 프로퍼티의 값이 false라면 뷰가 모든 터치를 전달받게 된다.

var delaysTouchesBegan
// began 단계에서 Gesture Recognizer가 추가된 뷰에 터치의 전달 지연 여부를 결정합니다.

var delaysTouchesEnded 
// end 단계에서 Gesture Recognizer가 추가된 뷰에 터치의 전달 지연 여부를 결정합니다.

 

 

UIGestureRecognizerDelegate

A set of methods implemented by the delegate of a gesture recognizer to fine-tune an app’s gesture-recognition behavior.

protocol UIGestureRecognizerDelegate

delegate를 사용하면 다양한 상황에 맞는 동작을 제어할 수 있다.

단순히 탭을 받아 단순한 처리를 하고자 하면 Target-Action으로도 충분히 가능


let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(viewTapped(tapGestureRecognizer:)))
self.addGestureRecognizer(tapGestureRecognizer)

@objc func viewTapped(tapGestureRecognizer: UITapGestureRecognizer) {
    print("view tapped")
}
override func viewDidLoad() {
	super.viewDidLoad()
	let tapGestureRecognizer = UITapGestureRecognizer()
	self.view.addGestureRecognizer(tapGestureRecognizer)
	tapGestureRecognizer.delegate = self
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
	print("view Tapped")
	return true
}

둘 다 뷰를 탭하면 View Tapped가 찍히지만, 위 예시는 Target-Action을 사용했고, 아래는 Delegate를 사용했다.

 

 

 

 

 

 

UIGestureRecognizer - UIKit | Apple Developer Documentation

The UIGestureRecognizerSubclass.h header file contains a class extension that declares methods intended to be called or overridden only by subclasses of UIGestureRecognizer. Clients that merely use concrete subclasses of UIGestureRecognizer must never call

developer.apple.com

 

[LECTURE] 1) Gesture Recognizer란? : edwith

제스처 인식기(Gesture Recognizer) 제스처 관련 이벤트를 다루기 위한 제스처 인식기(Gesture Recognizer)에 대해 알아봅니다. 학습 목표 1. 제스처 인... - 부스트코스

www.edwith.org

 

'iOS' 카테고리의 다른 글

[iOS] AVFoundation, AVPlayer, AVPlayerLayer  (0) 2020.06.13
[iOS] AVKit, AVPlayerViewController  (0) 2020.06.13
[iOS] 세그 (Segue)  (0) 2020.06.12
[iOS] UIRefreshControl  (0) 2020.06.12
[iOS] 뷰 회전 관련 작업 : viewWillTransition  (0) 2020.06.12