잘못 알고 있었던 panGestureRecognizer 의 개념

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 뚭니
      참가자
      • 글작성 : 9
      • 답글작성 : 17

      ISSUE

      • scrollView 에서 스크롤이 발생했을 때 위쪽으로 pan 했는지, 아래쪽으로 pan 했는 지에 따라서 인터랙션 효과를 주고 싶었다.

      기본 코드

      • velocity 는 속력이 아니라 속도이기 때문에, 방향 값을 가지고 있다는 판단으로 velocity 의 y 값만 추출하면 pan 의 방향을 알 수 있을 것이라 생각하고 다음과 같이 사용하였었다.
      extension ViewController : UIScrollViewDelegate {
          func scrollViewDidScroll(_ scrollView: UIScrollView) {
              let yVelocity = scrollView.panGestureRecognizer .velocity(in: scrollView).y
              if yVelocity > 0 {
                  actionWhenDown()
              } else if yVelocity < 0 {
                  actionWhenUp()
              }
              print(scrollView.contentOffset)
          }
      }
      

      문제 인식

      • 그러나 곧 이상한 부분이 보였다. 화면에 손이 닿은채로 (pan 한 상태로) tableview를 이동했을 때는 contentOffset 이 알맞게 출력되고 actionWhenUp() 메소드도 잘 작동하는 듯 보였다.
      • 하지만 짧게 pan 한 상태로 튕기듯이 드래그를 하면 contentOffset.y 값은 쭉쭉 올라가는데도 불구하고 위로 올렸을 때 actionWhenUp() 가 적절히 동작하지 않았다.

      문제 원인

      • yVelocity 값을 출력해보니 스크린에 손이 닿은 상태로 panning 하였을 때는 yVelocity 값이 잘 출력되었으나, 손을 떼는 순간 0.0 값이 찍히는 것을 확인할 수 있었다.
      • 따라서 짧게 panning 하면 (튕기듯이) tableView 가 위로 이동하여 contentOffset.y 값은 올라가는데도 불구하고 yVelocity 값은 계속 0 이었다.
      extension ViewController : UIScrollViewDelegate {
          func scrollViewDidScroll(_ scrollView: UIScrollView) {
              let yVelocity = scrollView.panGestureRecognizer .velocity(in: scrollView).y
              print(yVelocity)
          }
      }
      
      • 공식 문서를 다시 읽어보니 panGesture 는 화면에서 하나 이상의 ‘손가락의 움직임을 추적’ 하는 것이라는 점을 확인했다.
      • 화면에서 손을 떼는 순간 추적할 방법이 없어지는 것이다.
        ~~오늘의 배운 점: 역시 공식 문서를 잘 읽어야한다…~~

      스크린샷 2020-03-20 오후 8 48 29
      출처 | Handling Pan Gestures

      해결 방안

      • 아직 해결하진 못했지만 방법을 생각 중에 있는데 고려하고 있는 대안은 다음과 같다.
      • contentOffset 의 y 값을 추적하여 현재 값보다 증가하면 actionWhenUp() 메소드를, 현재 값보다 감소하면 actionWhenDown() 메소드를 실행한다.
      • 위 방법으로 시도를 해보고, 또 다른 이슈가 있다면 정리하여 해결하고자 한다.
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      굉장히 유의미한 삽질입니다!
      Pan Gesture Recognizer 대신에 UIResponder의 터치 처리 메서드(touchesBegan 및 touchesEnd 등)와 UIScrollViewDelegate를 함께 활용해 보면 어떨까요? 🙂

      • 뚭니
        참가자
        • 글작성 : 9
        • 답글작성 : 17

        유의미하다고 말씀해주셔서 감사합니다!
        오, touchesBegan 메서드를 미처 생각치 못했는데 키워드를 제시해주셔서 도움이 많이 될 것 같습니다.
        해결하면 정리하여 답글에 달아놓도록 하겠습니다!

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom