iOS 제스처 인식 상세 정보

4393 단어

하나.터치 처리에서 UIEvent, UITOuch의 역할


iOS 시스템에서 사용자의 손가락이 화면에 닿기 시작하면 모든 손가락이 화면에서 떨어진다. 이 모든 과정을 multitouch sequence라고 한다.이 과정은 다소 건드릴 수 있다.
이 모든 과정에서 시스템은 관련 정보를 저장할 대상이 필요합니다. 이 대상이 바로 UIEvent입니다.새로운 터치 과정이 시작되면 새로운 UIEvent 대상이 구축되고 터치 상태의 변화에 따라 자신의 정보를 계속 업데이트하며 완전한 터치 과정은 UIEvent의 실례에 대응한다.
그럼 어터치는 또 뭐죠?앞에서 언급한 바와 같이 한 번의 터치 과정에서 여러 개의 손가락이 터치하고 있을 수 있다. 이른바 다중 터치 제어이고 한 개의 UITOuch의 실례는 한 손가락의 터치 과정에 대응한다. UITOuch의 실례에 대응하는 손가락의 터치 상태가 바뀌면 UITOuch의 상태가 업데이트된다.하나의 터치 과정은 여러 개의 터치일 수 있기 때문에 하나의 UIEvent 실례에 여러 개의 UItouch가 있을 수 있다
open var allTouches: Set? { get }

요약:
  • 손가락을 만지기 시작해서 화면을 떠나는 모든 과정을 멀티터치 sequence라고 한다.
  • UIEvent 객체에 대한 multitouch sequence
  • 손가락 하나에 UITOuch 개체
  • 를 연결하는 터치 프로세스
  • 하나의 UIEvent 객체에 여러 개의 UITOuch 객체가 포함될 수 있음
  • 둘.뷰에서 UITOuch를 이용한 터치 처리


    그렇다면 iOS는 어떻게 터치에 맞게 진행될까요?먼저 UItouch의 네 가지 상태를 간단히 소개합니다(UItouchPhase).
    public enum UITouchPhase : Int {
    
        
        case began // finger 
    
        case moved // finger 
    
        case stationary // finger 
    
        case ended // finger 
    
        case cancelled //  ( home )
    }
    

    iOS에서 터치에 대한 처리는 UIresponder라는 클래스를 통해 이루어진다. 이것은 추상적인 클래스이고 UIView는 이 클래스를 계승하기 때문에 실제로 우리의 모든 터치 이벤트 처리는view를 통해 이루어진다.view는 터치 처리의 기본 단위입니다
    따라서 실제 모든 UITOuch 실례에는view 속성이 있는데 이것은 그view를 가지고 있음을 나타낸다.view는 다음 네 가지 방법으로 터치 이벤트를 처리합니다.
        // touch )
        open func touchesBegan(_ touches: Set, with event: UIEvent?)
        // touch 
        open func touchesMoved(_ touches: Set, with event: UIEvent?)
        // touch 
        open func touchesEnded(_ touches: Set, with event: UIEvent?)
        // touch 
        open func touchesCancelled(_ touches: Set, with event: UIEvent?)
    

    위의 네 가지 메서드 매개변수에서 다음을 수행합니다.
  • 터치스는 이view의 모든 터치를 표시한다
  • 이벤트는 전체적인 터치 과정을 대표한다(이view를 제외하고 다른 뷰에서도 터치즈가 발생할 수 있고 이벤트는 전체 터치 사건을 대표한다)
  • 따라서view에서 이 네 가지 방법을 실현할 수 있어 터치 처리 효과를 얻을 수 있다.예를 들어 사용자의 긴 제스처를 식별하려면 터치 베건이라는 방법에 터치의 시작 시간을 기록한 다음에 터치 Moved 방법에 시작 시간과 간격을 기록해야 한다. 만약에 이 시간의 간격이 어떤 값보다 크다면 이것은 긴 과정이라고 생각하고 해당하는 처리를 할 수 있다.
    요약:
  • UITOuch에는 begin, moved 등 5가지 상태
  • 가 있음
  • UIVIew는 터치 처리의 기본 단위
  • 시스템은 UIVIew에 터치 상태의 변화를 알리기 위해 터치 메시지를 보낸다
  • UIView에서touchesBegin 등 네 가지 방법으로 사용자 정의 처리를 실현할 수 있음
  • 셋.UIGestureRecognizer의 유래와 UItouch 및 UIEvent와의 관계


    위에서 언급한 것은 모두 iOS의 비교적 밑바닥 처리 과정이다. 실제 개발에서 우리는 이 물건을 전혀 접하지 못할 수도 있다. 우리는 우리가 실제적으로 UIGestureRecognizer를 이용하여 사용자의 터치 사건을 처리한 것을 알고 있다. 그러면 UIGestureRecognizer와 위에서 언급한 UITOuch와 UIEvent, UIResponder 사이에는 어떤 관계가 있는가?

    왜 UIGestureRecognizer가 있는지


    앞에서 논의한 바와 같이 만약에 우리가 사용자의 긴 제스처를 식별하고자 한다면 이것은 우리가 새로운 종류의 계승 UIView를 정의한 다음에 이 새로운 종류에서 터치스 Begen 등 방법을 실현하여 제스처 식별을 하고 해당하는 처리를 해야 한다는 것을 의미한다. 이 과정은 사실상 매우 번거롭다. 편리한 방법이 없을까?
    이를 위해 iOS는 UIGestureRecognizer를 도입하여 자주 사용하는 제스처를 봉인(예를 들어 UITApGestureRecognizer)한 다음에 우리는 더욱 높은 차원에서 처리할 수 있다.

    UIGestureRecognizer의 작동 방식


    UIGestureRecognizer를 사용할 때, 이것은 보통view에 직접 추가됩니다. 예를 들어 다음과 같습니다.
    let tap = UITapGestureRecognizer(target: self, action: "handleTap:")
    self.view.addGestureRecognizer(tap)
    

    실제로 UIGestureRecognizer의 작업 원리는 매우 간단하다. UIView와 마찬가지로 TouchesBegin 등 네 가지 방법을 실현했다. 이로써 자신의 제스처 식별 과정을 실현했고 식별이 성공할 때 target에 해당하는 처리를 하도록 알렸다.Gesture Recognizer의 지위는 실제로view의 지위와 대등하며 UItouch와 UIEvent가 같은 처리 방식을 가지고 있다

    터치의 전달 과정

  • 터치가 시작되면 해당하는view와view의GestureRecognizer
  • 에 동시 전달됩니다
  • Gesture Recognizer가 Gesture를 식별했다면
  • touchesCancelled:forEvent:해당하는view에 발송되고,touch는 이view에 전달되지 않습니다
  • 이view에 다른 제스처가 있다면 이 제스처들은forced to fail.(이것은 한 번에 하나의 제스처만 있을 수 있고 제스처 충돌을 피하기 위한 것이다)
  • 만약에 a gesture recognizer 식별에 실패하면 터치가 더 이상 그에게 전달되지 않지만 해당하는view
  • 에 전달된다
  • view가 상응하는 터치스 방법을 실현하지 못하면 이 이벤트는 응답자 체인을 따라 다음 상응하는 자에게 계속 전달된다(예를 들어subview가 상응하는 터치스 방법을 실현하지 못하면 슈퍼뷰의 상응하는 터치스 방법을 사용한다)
  • 요약:
  • GestureRecognizer는view와마찬가지로touchesBegin 등 네 가지 방법을 실현하여 제스처 식별 과정
  • 을 실현하였다.
  • 터치가 시작될 때view와view에 있는 GestureRecognizer에게 동시에 전달되며 자기touches 방법으로 처리됩니다
  • GestureRecognizer 식별에 성공하면 터치는view에 전달되지 않으며view의 다른 GestureRecognizers도forced to fail
  • 만약에 a gesture recognizer 식별에 실패하면 터치가 더 이상 그에게 전달되지 않지만 해당하는view
  • 에 전달된다
  • view가touches 방법을 실현하지 않으면 이 이벤트는 응답자 체인을 따라 전달됩니다
  • 좋은 웹페이지 즐겨찾기