iOS

UIGestureRecognizer (Tap, Pinch, Rotation)

JoonSwift 2020. 12. 3. 23:35
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는 다음 게시물에서 포스팅 하겠습니다.😸