왕논의 연구실

[Swift] Gesture Recogniger 짧게 요약 본문

iOS/Swift

[Swift] Gesture Recogniger 짧게 요약

ywangnon 2021. 9. 17. 03:32

Gesture Recognizer

터치와 관련된 제스처 이벤트를 인식하고, 액션 메세지를 보내 제스처 관련 이벤트를 처리

구현방법

  • 스토리보드
  • 코드(타겟 액션)
  • 델리게이트

 

Tap

한손가락 또는 여러 손가락 짧게 한번 누르기

 

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapGesture))
        outerView.addGestureRecognizer(tapGesture)

    @objc func tapGesture(_ sender: UIGestureRecognizer) {
        // 탭 액션
        print("tap")
        self.change = !self.change
        self.view.backgroundColor = change ? .white : .black
    }

 

Pinch

두 손가락 벌리기, 오므리기

scale은 변화값인 듯하다. 마지막에 1.0로 설정하지 않으면 누적되어 사용할수록 점점 빠르게 변한다.

        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchGesture(_:)))
        outerView.addGestureRecognizer(pinchGesture)
        
    @objc func pinchGesture(_ sender: UIGestureRecognizer) {
        if let pinch = sender as? UIPinchGestureRecognizer {
            outerView.transform = outerView.transform.scaledBy(x: pinch.scale, y: pinch.scale)
            
            pinch.scale = 1.0
        }
    }

 

Rotation

회전

rotation은 회전값인 듯하다. 마지막에 0으로 설정하지 않으면 누적되어 사용할수록 점점 빠르게 회전한다.

        let rotationGesture = UIRotationGestureRecognizer(target: self, action: #selector(self.rotationGesture(_:)))
        outerView.addGestureRecognizer(rotationGesture)
        
    @objc func rotationGesture(_ sender: UIGestureRecognizer) {
        if let rotation = sender as? UIRotationGestureRecognizer {
            outerView.transform = outerView.transform.rotated(by: rotation.rotation)
            
            rotation.rotation = 0
        }
    }

Swipe

선 긋기

direction으로 스와이프할 방향을 정해줘야한다.

        let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeGesture(_:)))
        swipeGesture.direction = .down
        view.addGestureRecognizer(swipeGesture)
        
    @objc func swipeGesture(_ sender: UIGestureRecognizer) {
        if let swipe = sender as? UISwipeGestureRecognizer {
            print("swipe")
        }
    }

Pan

잡아 끌기

minimumNumberOfTouches으로 필요한 손가락수를 정할 수 있다.

변화값을 구해서 setTranslation으로 설정하지 않으면 pan한 방향으로 계속 나아간다.

        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panGesture(_:)))
        panGesture.minimumNumberOfTouches = 3 // 손가락 3개 필요
        outerView.addGestureRecognizer(panGesture)

    @objc func panGesture(_ sender: UIGestureRecognizer) {
        if let pan = sender as? UIPanGestureRecognizer {
            let transition = pan.translation(in: outerView)
            let changedX = outerView.center.x + transition.x
            let changedY = outerView.center.y + transition.y
            outerView.center = CGPoint(x: changedX, y: changedY)

            pan.setTranslation(CGPoint.zero, in: outerView)
        }
    }

 

ScreenEdgePan

가장자리 잡아 끌기

edges로 적용할 가장자리를 정해준다.

        let edgeGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(self.screenEdgeGesture(_:)))
        edgeGesture.edges = .right // 오른쪽 가장자리
        view.addGestureRecognizer(edgeGesture)

    @objc func screenEdgeGesture(_ sender: UIGestureRecognizer) {
        if let edge = sender as? UIScreenEdgePanGestureRecognizer {
            print("edge.edges")
            
            self.change = !self.change
            outerView.backgroundColor = change ? .red : .blue
        }
    }

 

LongPress

길게 누르기

        let longPress = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressGesture(_:)))
        longPress.numberOfTouchesRequired = 2 // 터치 손가락 수
        longPress.numberOfTapsRequired = 2 // 터치 수. 추가적인 터치수라서 +1 해준 수를 터치해야한다.
        longPress.minimumPressDuration = 3 // 누르는 시간
        // 두 손가락으로 3번 터치해서 마지막에 3초간 눌러야한다.
        outerView.addGestureRecognizer(longPress)

    @objc func longPressGesture(_ sender: UIGestureRecognizer) {
        if let press = sender as? UILongPressGestureRecognizer {
            print("press")
            
            self.change = !self.change
            innerView.backgroundColor = change ? .yellow : .purple
        }
    }

 

코드로 하는 방법을 알아봤다.

델리게이트는 델리게이트를 연결하고 지정된 함수에 기능을 추가해주면 된다.

 

샘플인데 파일있는 위치 직접 들어가게 되어 있다.

https://github.com/ywangnon/Programming_Example/tree/master/GestureSample

'iOS > Swift' 카테고리의 다른 글

[Swift]동적 아이콘 변경  (0) 2021.09.22
[Swift]삼항연산자(?), 옵셔널 기본처리(??)  (0) 2021.09.22
[Swift]디버깅 식별자  (0) 2021.09.22
한글 입력 제한에 대해서  (0) 2021.01.27
배열 정렬에 대한 연구  (0) 2021.01.06