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
'iOS > 스탠포드 iOS 강의' 카테고리의 다른 글
[스탠포드iOS] 메모리 관리 (0) | 2024.03.25 |
---|---|
[스탠포드iOS] ViewController 생명주기 (0) | 2024.03.25 |
[스탠포드iOS] Text & Image (0) | 2024.03.20 |
[스탠포드iOS] View (0) | 2024.03.19 |
[스탠포드iOS] Swift 기초문법 정리(AnyObject, Plist, NSUserDefault) (1) | 2024.03.17 |