ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swipe Gesture 와 Pan Gesture 함께 쓰기, Gesture Recognizer simultaneously
    iOS 2020. 4. 10. 15:01

    안녕하세요 :) 
    날이 많이 좋아졌는데 자유롭게 돌아다니기는 쉽지 않은 시국이네요.
    세상도 저도 쉽지 시간을 살아가고 있는 것 같아요 😭 빨리 좋은 날이 오길... 🙏

     


     

    본론으로 들어가서 오늘은 Swipe Gesture와 Pan Gesture 를 함께 사용하는 법을 알아보겠습니다.

    Swipe Gesture 는 Pan Gesture 를 포함하고 있는 부분이기 때문에 이 둘을 함께 사용하면 정상적으로 작동하지가 않습니다.

    검색을 해보면 UIGestureRecognizerDelegate 의 

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool

    이 메소드를 사용하면 같이 사용할 수 있다는 것을 찾을 수 있는데요,

    하지만 이걸 사용하면 스와이프를 할 때 pan gesture 도 함께 실행되기 때문에,

    원하는 대로 제대로 동작하지 않을 수도 있습니다. 

     

     

    따라서 동시에 발생하길 원치 않으신다면,

    다른 방법으로 pan gesture에 내가 구현한 swipe 의 형태는 동작시키지 말라고 명령해줘야 합니다.

    UIGesture 의 require(toFail: otherGestureRecognizer) 메소드를 사용하면

    otherGestureRecognizer 와 동시에 실행되지 않게 해줄 수 있습니다.

    해당 문서를 보면,

    - If otherGestureRecognizer transitions to UIGestureRecognizer.State.failed, the receiver transitions to its normal next state.

    - if otherGestureRecognizer transitions to recognized or UIGestureRecognizer.State.began, the receiver transitions to UIGestureRecognizer.State.failed.

    다른 제스쳐가 fail 상태가 되면 현재 제스쳐가 정상적으로 동작하고 

    다른 제스쳐가 동작할 때는 현재 제스쳐가 실패합니다.

    라고 되어 있네요!!

     

    이제 panGesture가 위 설명의 receiver,

    swipeGesture를 otherGesture 로 해서 사용 방법을 한번 알아볼게요.

    panGesture는 위, 아래로 동작하길 원하고 swipe는 좌, 우 로 동작하길 원하는 상황입니다.

    override func viewDidLoad() {
      super.viewDidLoad()
    
      let swipeGestures = setupSwipeGestures()
      setupPanGesture(without: swipeGestures)
    }
    
    private func setupSwipeGestures() -> [UISwipeGestureRecognizer] {
    
      let swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeGesture(gesture:)))
      swipeRightGesture.direction = .right
    
      let swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeGesture(gesture:)))
      swipeLeftGesture.direction = .left
    
      view.addGestureRecognizer(swipeRightGesture)
      view.addGestureRecognizer(swipeLeftGesture)
    
      return [swipeRightGesture, swipeLeftGesture]
    }
    
    private func setupPanGesture(without swipeGestures: [UISwipeGestureRecognizer]) {
            
      let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture))
      for swipeGesture in swipeGestures {
          panGesture.require(toFail: swipeGesture)
      }
    
      self.view.addGestureRecognizer(panGesture)
    }

     

    먼저 좌, 우의 swipeGesture 를 만들고 panGesture 를 만들 때 require(toFail:) 를 해주면 됩니다. 

    간단하지만 모르며 한참을 헤맬 수도 있는 내용인 것 같아요 ;)

    조금이라도 도움이 되셨으면 좋겠습니다. 

    감사합니다.

    'iOS' 카테고리의 다른 글

    collectionView, tableView reloadData 완료 시점  (3) 2020.04.22
    AppDelegate ?  (0) 2020.04.22
    info.plist 파일 옮기기  (0) 2020.04.04
    TextView 라인 수 구하기  (0) 2020.03.16
    Bundle  (0) 2020.03.13

    댓글

Designed by Tistory.