class UIGestureRecognizer : NSObject
Gesture Recognizer Object 또는 Gesture Recognizer라는 것은 일련의 터치를 인식하고, 그 인식에 대한 어떠한 동작을 하는 객체입니다.
이 객체가 일련된 Gesture나, Gesture의 변경을 인식하면, 지정된 Target Object로 action message를 보내줍니다.
UIGestureRecognizer의 Subclass는 다음과 같은 class가 존재합니다.
- UITapGestureRecognizer
- UIPinchGestureRecognizer
- UIRotationGestureRecognizer
- UISwipeGestureRecognizer
- UIPanGestureRecognizer
- UIScreenEdgePanGestureRecognizer
- UILongPressGestureRecognizer
UIGestureRecognizer는 위의 Gesture Recognizer에 대한 공통적인 부분을 정의하고 있습니다. 또한 UIGestureRecognizerDelegate 프로토콜을 통한 Delegate패턴으로 일부 동작의 customization이 가능합니다.
UIGestureRecognizer의 state는 아래의 그림과 같이 다양한 state가 존재하며 이를 활용하여 상태에 따라 다양한 코드를 구현할 수도 있습니다.
UITapGestureRecognizer
class UITapGestureRecognizer : UIGestureRecognizer
UITapGestureRecognizer는 한번 혹은 여러번의 Tap을 인식하는 Gesture Recognizer입니다.
UITapGestureRecognizer의 기본적인 구현 방법을 코드로 작성해 보았습니다.
@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let taps = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
self.myView.addGestureRecognizer(taps)
}
@objc func handleTapGesture(recognizer: UITapGestureRecognizer) {
print("Touch MyView")
}
UIPinchGestureRecognizer
class UIPinchGestureRecognizer : UIGestureRecognizer
UIPinchGestureRecognizer는 두번의 터치를 포함하여 손가락으로 Pinching을 하는 Gesture를 인식하는 Gesture Recognizer입니다.
@IBOutlet var pinchView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchGesture(sender:)))
self.pinchView.addGestureRecognizer(pinch)
}
@objc func handlePinchGesture(sender: UIPinchGestureRecognizer) {
if let view = sender.view {
view.transform = view.transform.scaledBy(x: sender.scale, y: sender.scale)
sender.scale = 1
}
}
UIRotationGestureRecognizer
class UIRotationGestureRecognizer : UIGestureRecognizer
UIRotationGestureRecognizer는 사용자가 두 손가락으로 View를 누르고 돌리는 동작을 인식하는 Gesture Recognizer입니다.
@IBOutlet var rotationView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let rotation = UIRotationGestureRecognizer(target: self, action: #selector(handleRotationGesture(_:)))
self.rotationView.addGestureRecognizer(rotation)
}
@objc func handleRotationGesture(_ sender: UIRotationGestureRecognizer) {
if let view = sender.view {
view.transform = view.transform.rotated(by: sender.rotation)
sender.rotation = 0
}
}
Rotation이라는 동작은 계속적인 동작이다. 유저가 두 손가락으로 Rotation을 할 수 있는 위치로 가져갔을 때에 동작이 시작된다. 두 손가락이 Rotation하는 동안 두 손가락을 떼지 않으면 gesture changed 상태이다. 마지막으로 두 손가락을 떼면 ends상태이다. 각각의 상태에서 Gesture Recognizer는 상태에 따른 action 메시지를 보내게 됩니다.
Swipe, Pan, ScreenEdgePan, Long Press는 다음 게시물에서 포스팅 하겠습니다.😸
'iOS' 카테고리의 다른 글
ScrollView AutoLayout(with Code) (0) | 2020.12.22 |
---|---|
Unit Test (XCTest) (0) | 2020.12.16 |
Auto Layout (Constraints) (0) | 2020.12.08 |
AutoLayout Storyboard (Stack View를 활용한 간단한 오토레이아웃!) (0) | 2020.12.07 |
UIGestureRecognizer (Swipe, Pan, ScreenEdgePan, Long Press) (0) | 2020.12.05 |