본문 바로가기
🍎 Swift/iOS 학습 노트

[Swift🍎] RxGesture로 간편하게 View에 클릭이벤트 넣기

by 솔비님 2024. 10. 17.

 

 

종종 StackView와 같이 터치 인터페이스와 관련없는 View 속성에 버튼을 넣고 싶은(넣어야 하는) 경우가 생긴다

 

보통 UITapGestureRecognizer를 사용해서 탭 제스처를 추가하는데,

마침 이번 프로젝트에서는 RxSwift를 활용하고 있어서 더 간편하게 사용 가능한 RxGesture를 사용해 보았다

 

 

사용 방법

1.  Xcode의 File > Add Package Dependency 메뉴를 선택하고 아래의 URL을 입력

  →  https://github.com/RxSwiftCommunity/RxGesture

 

GitHub - RxSwiftCommunity/RxGesture: RxSwift reactive wrapper for view gestures

RxSwift reactive wrapper for view gestures. Contribute to RxSwiftCommunity/RxGesture development by creating an account on GitHub.

github.com

 

 

2.  import RxGesture

 

 

3.  적용할 View에다가 rx.tapGesture() 넣어준다

 

 

 

RxGesture의 네가지 활용 예시

1.  tapGesture

  • 탭 제스처가 성공적으로 인식 되었을 때 호출
view.rx.tapGesture()
    .when(.recognized)  // 탭이 인식되었을 때
    .subscribe(onNext: { gesture in
        print("Tap gesture recognized!")
    })
    .disposed(by: disposeBag)

 

 

2.  PanGesture

  • 팬 제스처*가 감지되고 그 중간 상태에서 호출      *드래그, 스크롤 등
view.rx.panGesture()
    .when(.changed)  // 팬 동작이 계속되는 동안
    .subscribe(onNext: { gesture in
        let translation = gesture.translation(in: view)
        print("Pan gesture moving with translation: \(translation)")
    })
    .disposed(by: disposeBag)

 

 

3.  LongPressGesture

  • 사용자가 화면을 누르고 있는 상태가 감지될 때 호출
view.rx.longPressGesture()
    .when(.began)  // 롱 프레스가 시작될 때
    .subscribe(onNext: { gesture in
        print("Long press gesture began!")
    })
    .disposed(by: disposeBag)

 

 

4.  SwipeGesture

  • 특정 방향으로 스와이프 할 때 호출 가능하도록 설정
view.rx.swipeGesture(.right)  // 오른쪽 스와이프 인식
    .when(.recognized)  // 스와이프가 성공적으로 인식되었을 때
    .subscribe(onNext: { gesture in
        print("Swipe gesture recognized!")
    })
    .disposed(by: disposeBag)

 

 

 

💡 When() 메서드는 아래의 제스처 상태에서 반응할 수 있다 
(제스처별 적용 안되는 상태가 있을 수 있음)

  • .began: 제스처가 시작될 때
  • .changed: 제스처가 진행되는 동안 (특히 팬이나 핀치 제스처**에서 유용)   **손가락으로 벌리거나 모으는 동작
  • .ended: 제스처가 끝날 때
  • .recognized: 제스처가 성공적으로 인식되었을 때 (일반적으로 탭, 스와이프에서 사용)
  • .cancelled: 제스처가 취소되었을 때