기어가더라도 제대로

UIPanGestureDelegate 본문

UIKit 기초

UIPanGestureDelegate

Damagucci-juice 2022. 7. 30. 09:46

번역한 말투라 어려운데,
"사용법 - 1번" 항목 부터 보시면 이해가 수월할 것입니다.

정의

UIGestureRecognizer 의 구체적인 서브 클래스이다.

그들의 액션 메서드 중에서, 이것을 채택하고있는 클래스(고객)에서 UIPanGestureRecognizer에게 현재 제스처의 전환 상태와 변화의 속도를 쿼리한다. == > 기준 좌표계 안에서 어떤 뷰의 이동에 따른 변화와 속도 변화를 알려준다는 거 같네요.

  • translation(in:) → CGPoint
  • velocity(in:) - > CGPoint

그들은 변환 및 속도 값에 사용할 뷰의 좌표계를 지정할 수 있습니다.

고객(클래스, VC 혹은 커스텀 PanGestureClass)는 또한 원하는 값의 상태로 변환을 초기화 할 수 있습니다.

panning 제스처는 연속적입니다. 물체를 끌어당길 때, 유저는 하나 이상의 손가락으로 눌러야합니다. 손가락 개수도 친히 지정해줍니다.

  • state - began
    • 사용자가 패닝으로 인식하게 충분한 거리를 허용된 최소 손가락 개수로 움직일 때, 제스처는 UIGestureRecognizer.State.began 을 시작합니다.
  • state - changed
    • 최소 손가락 개수로 누르며 손가락을 움직일 때, panning recognizer의 상태가 chaged 로 변합니다.
  • state - ended
    • 손가락을 모두 때면, UIGestrueRecognizer.State.eneded로 변합니다.

주요 속성

  • var maximumNumberOfTouches : Int
    • 최대 손가락의 개수를 지정합니다.
    • 유효한 패닝에 손가락 개수가 이 수 이상을 넘을 수 없습니다.
  • var minimumNumberOfTouches: Int
    • 최소 손가락 개수를 지정합니다.
    • 이 속성에서 정의 한 수 이상으로 눌러야 패닝이 인식됩니다.
  • func translation(in: UIView?) → CGPoint
    • 특정 뷰의 좌표계에서 펜제스처를 번역합니다
    • 인자로 전달되는 뷰의 좌표계에 따라서 처음 제스처가 인식되었을 때부터 얼마나 좌표가 이동되었는지를 반환해줍니다.
  • func setTraslation(CGPoint, in: UIView?)
    • 특정 뷰의 좌표계 안에서 translation 값을 설정합니다.
    • 바로 위의 메서드와의 차이점을 이해해야합니다.
    • "UIPanGestureRecognizer는 뷰가 이동했다는 것을 알지 못한다"
      • 뷰를 이동 시킨 후에 드래그가 처음 시작된 위치는 더이상 뷰의 위치가 아니다.
      • 이 메서드를 호출해야 기준 좌표계에서 뷰의 현재 좌표를 드래그의 시작점으로 계속 업데이트 해야함.
      • 적용 뷰(적당히 움직인 느낌)
      • setTranslation 적용
      • 미적용 뷰(4프레임에 저정도 움직였다. 미끄러진 느낌)
      • 미적용
  • func velocity(in: UIView?) → CGPoint
    • 특정 좌표계 안에서 펜제스쳐의 속도를 번역합니다.
    • point per second
      • 초당 포인트를 속력으로 표현
    • horizontal, vertical 로 분리하여 세부적인 표현 가능

사용법

  1. VC에서 UIGestureRecognizerDelegate 프로토콜 채택 후 PanGestrue와 관련한 메서드 구현, 델리게이트를 채택할 뷰마다 적용을 해줘야함
  2. Gesture 에 관한 다양한 설정(시작, 이동중, 끝, 기타 등등)을 별도의 UIGestureRecognizer 로 등록하고 VC에서는 이것을 프로퍼티로 등록한다음 이것의 델리게이트를 VC로 지정하는 방법

1. VC에서 UIGestureRecognizerDelegate 채택

 

2. Custom UIGestureRecognizer 선언

  • 애플 공식 예제 코드를 보면 이해가 수월합니다.
  • 어려우니까 1번 방식으로 하다가 너무 쉬워지면 커스텀 객체 선언 방법 2번을 해보세요.
    • panGesture 뿐만 아니라 핀치, 회전, 초기화, 화면 전환(landscape, portrait)에 대한 힌트를 얻을 수 있음
  • Main.storyboard 에서 직접 UIPanGestrueDelegate 를 view 객체들한테 할당한 모습이 보이고,
  • 화면이 회전 할 때 마다, private func initializePieces() 가 실행됨

 

출처

Comments