적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Swift] UISwipeGestureRecognizer 를 이용한 스와이프 액션을 파헤쳐보자 !

hongssup_ 2023. 7. 28. 17:58
반응형

스와이프 제스처에 대해 알아보자!

Handling swipe gestures

Detect a horizontal or vertical swipe motion on the screen, and use it to trigger navigation through your content.

 

A swipe gesture occurs when a person moves one or more fingers across the screen in a specific horizontal or vertical direction. Use the UISwipeGestureRecognizer class to detect swipe gestures.

UISwipeGestureRecognizer 이용해 스와이프 제스처를 감지할 수 있으며, 스와이프 방향과 스와이프를 감지할 손가락 개수는 커스텀으로 구성이 가능하다. 

 

UISwipeGestureRecognizer 란?

Because a swipe is a discrete gesture, the system sends the associated action message just once per gesture.

하나 이상의 방향으로 스와이프 제스처를 개별적으로 인식하기 때문에 제스처 액션 당 한 번만 인식이 된다. 

 

UISwipeGestureRecognizer 관련 문서를 보다보면 'discrete' 이라는 단어가 많이 등장하는데, 이는 스와이프 액션이 개별적이고 불연속적으로 한 번만 인식된다는 것을 의미한다. 

UIPanGestureRecognizer 의 경우 continuous gesture recognizer 로 제스처의 연속적인 움직임을 감지하지만, UISwipeGestureRecognizer 의 경우 각 제스처를 불연속적으로 개별 감지하기 때문에, 사용 되어야 하는 경우가 다르다. 

 

** 스와이프 제스처를 사용할 때 주의할 점! 

이처럼 스와이프 제스처는 사람의 손가락 움직임을 계속해서 추적하는 것이 아니기 때문에, 스와이프가 감지되었다는 순간적인 '결과'에만 관심이 있을 때 사용하는 것이 적합하다.

따라서 스와이프는 제스처를 감지하고 빠르게 넘기는 경우에 사용하는 것이 좋다. 

* discrete : 별개의 (separate) | deviate : (일상, 예상 등을) 벗어나다

 

또한 UIGestureRecognizer 의 하위 클래스이기는 하지만, UIGestureRecognizer.State 에서 제공하는 .began 이나 .changed 상태 감지를 지원하지는 않는다고 한다. 

swipeGestureRecognizer.state == .ended 로 제스처가 끝났을 경우는 감지할 수는 있지만, 이 또한 순간적인 스와이프 움직임만 감지할 뿐이지 ended 라고 해서 스와이프 손가락이 화면에서 떨어지는 순간을 감지해주는 것은 아니더라.

 

코드로는 다음과 같이 사용 가능하다. 

그런데 기본적으로 direction의 default 값이 이미 .right 으로 설정이 되어 있고, gesture state 가 .ended 일 때도 순간적이기 때문에

굳이 둘 다 설정해주지 않고 생략해서 사용해도 괜찮을 것 같더라. 그냥 addGestureRecognizer 로 설정만 해주면 될듯. 

swipeRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(swipeHandler(_:)))
swipeRecognizer.direction = .right
self.view.addGestureRecognizer(swipeRecognizer)
@objc func swipeHandler(_ gestureRecognizer : UISwipeGestureRecognizer) {
    if sender.direction == .right {
        if gestureRecognizer.state == .ended {
            // Perform action.
        }
    }
}

 

스와이프 제스처에 대해 알아보았는데, 스와이프 너 생각보다 별로네..? ㅋㅋㅋㅋ

순간적인 액션만 감지해주기 때문에, 커스텀으로 스와이프 제스처의 움직임을 제어하고 싶을 때는 UIPanGestureRecognizer를 사용하는 것이 더 적합한 듯 하다. 

스와이프 제스처 기능만 사용하는 경우가 많이 있을려나,, 모르겠넹

 

 

 

 

 

728x90
반응형