스와이프 제스처에 대해 알아보자!
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를 사용하는 것이 더 적합한 듯 하다.
스와이프 제스처 기능만 사용하는 경우가 많이 있을려나,, 모르겠넹
'Swift iOS 앱 개발 > Swift' 카테고리의 다른 글
[Swift iOS] 화면 스와이프 swipe to pop / swipe back (+ RxGesture) (0) | 2023.07.17 |
---|---|
[Swift iOS] Lottie Animation 적용하기 (+ multiple animation) (0) | 2023.07.13 |
enum case 예외 처리 (default 값 설정) (0) | 2023.07.04 |
[Swift] Why double is preferred over float? (+ Int / Int32 / Int64) (0) | 2023.04.13 |
Swift 언어에 대하여 (0) | 2023.04.13 |