티스토리 뷰

Gestures

화면을 통해 전달된 사용자 입력

iOS에는 사용자 입력을 제스처로 인식하는 추상 레이어 존재

제스처는 UIGuestureRecognizer라는 클래스의 인스턴스에 의해 인식됨

UIGuestureRecognizer자체는 추상적. 생성할 일 없음. 구체화된 서브클래스 사용

원하는 제스처 종류를 쓸 때 그 서브클래스들을 생성함(PanGestureRecaognizer, PinchRecognizer 등..)

 

Recognizer 클래스 사용의 두 가지 스탭(GestureRecognizer, GestureHandler)

1. 원하는 GestureRecognizer 생성 및 UIView 객체가 Recognizer를 받아서 해당 제스처를 인식할 수 있도록 설정

   (Controller가 담당)

2. Recognizer가 그 제스처를 인식했을 때 처리 (GestureHandler가 담당)

 

어떤 View들은 제스처 인식 기능이 핵심적이라 View자체적으로 GestureRecognizer 추가

ex) scrollView 는 자체적으로 PanGestureRecognizer, PinchGestureRecognizer 를 생성자에 넣어둠

 

Handler는 Controller 또는 View에서 처리 가능

제스처가 하는 일이 View만 바꾸는 일 - View가 자체적으로 제스처 처리

제스처가 모델을 직접적으로 변경 - Controller에서 제스처 처리

 

UIView에 GestureRecognizer 추가

어떤 Outlet에 didSet을 하면 오직 한번만 호출(iOS가 처음 View 연결 시)

UIPenGestureRecognizer

- 첫번째 인자 : 제스처 인식 시 누가 처리 할 것인지(self. 즉 Controller)

- 두번째 인자 : 제스처가 인식되면 self 안에 어떤 메소드 호출할 것인지

                     : Objective-C 런타임 호환 selector가 사용

                     : pan메소드는 인자가 한개. GestureRecognizer를 인자로 받음

@IBOutlet weak var pannableView : UIView {
	didSet {
    	let recognizer = UIPanGestureRecognizer(
        	target: self, action: #selector(ViewController.pan(_:))
        )
        pannableView.addGestureRecognizer(recognizer)
    }
}

panHandler는 gesture에 대한 구체적인 정보가 필요

다음은 UIPanGestureRecognizer(드래그 할 때 사용) 의 3개의 메소드

func translationInView(UIView) -> CGPoint //뷰의 좌표에서 팬이 얼마나 움직였는지
func velocityInView(UIView) -> CGPoint //팬이 얼마나 빨리 진행되는지
func setTranslation(CGPoint, inView: UIView) //마지막 값에서 얼마나 변했는지.

UIPanGesture의 추상화된 슈퍼클래스는 "state"를 가지고 있음

GestureRecognizer은 상태기계를 거치는데 핸들러에서 제스처가 어떤 상태에 있는지 확인 가능

var state: UIGestureRecognizerState { get }
.Possible //.Possible에서 시작
.Recognized //스와이프 감지 시
.Began //팬이 눌리는 순간부터
.Changed //팬이 움직이는 순간부터
.Ended //손가락이 화면에서 떼어지면
.Failed
.Cancelled

panHandler

func pan(gesture: UIPanGestureRecognizer) {
	switch gesture.state {
    	case .Changed: fallthrough //다음 케이스로 넘어감
        case .Ended:
            let translation = gesture.translationInView(pannableView)
            gesture.setTranslation(CGPointZero, inView: pannableView)
        default: break
    }
}

UIPinchGestureRecognizer

손가락 두개로 오므렸다 폈다 하는 제스처

var scale: CGFloat //비율
var velocity: CGFloat { get }

UIRotationGestureRecognizer

두 손가락으로 돌리는 제스처. 몇 라디안만큼 회전했는지 나타냄

var rotation: CGFloat 
var velocity: CGFloat { get }

UISwipeGestureRecognizer

쓸어내는 방향 및 손가락 개수 설정 필요

미리 설정해둔 형태의 제스처만 인식

var direction: UISwipeGestureRecognizerDirection 
var numberOfTouchesRequired: Int

UITapGestureRecognizer

끊어지는 불연속적 제스처 아님

탭이 언제 발생하는지 알려면 .Ended 상태를 찾아야함

var numberOfTapsRequired: Int
var numberOfTouchesRequired: Int
최근에 올라온 글
Total
Today
Yesterday