iOS 개발 의 터치 이벤트

1.사건 배포 처리[외부 에서 내부 로]
iOS 에서 터치 가 발생 하면 이벤트 가 UIApplication 이벤트 대기 열 에 추 가 됩 니 다.UIApplication 은 이벤트 대기 열 에서 맨 앞 에 있 는 이 벤트 를 꺼 내 배포 합 니 다.보통 메 인 창 에 먼저 배포 되 고 메 인 창 은 hitTest:with Event 방법 을 사용 합 니 다.적당 한 이벤트 트리거 그림 을 찾 으 면 터치 되 는 보기 대상 을 찾 습 니 다.
찾기 프로 세 스 는 다음 과 같 습 니 다:
  • 최상 위 보기(keyWindow 보기)에서 pointInside:withEvent:방법 으로 터치 점 이 현재 보기 안에 있 는 지 판단 합 니 다.
  • NO 로 돌아 가면 keyWindow 의 hitTest:withEvent:nil 로 돌아 갑 니 다.
  • YES 로 돌아 가면 현재 보기 의 모든 하위 보기 에 hitTest:withEvent:메 시 지 를 보 냅 니 다.모든 하위 보 기 를 옮 겨 다 니 는 순 서 는 subviews 배열 의 끝 에서 앞으로 옮 겨 다 니 는 것 입 니 다(인터페이스 맨 위 에서 아래로 옮 겨 다 니 는 것).
  • subview 의 hitTest:withEvent:비 어 있 는 대상 으로 돌아 가면 keyWindow 의 hitTest:withEvent:이 대상 으로 돌아 가 처리 가 끝 납 니 다.
  • 모든 subview 가 끝 났 는데 도 비 어 있 는 대상 으로 돌아 오지 않 으 면 keyWindow 의 hitTest:with Event:최상 위 보기 로 돌아 갑 니 다.
  • 2.호응 자 체인[안에서 밖으로]
    만 져 진 보기 대상 을 찾 은 후 이 보기 대상 이 이 터치 사건 을 처리 할 수 있 는 지 판단 해 야 합 니 다.처리 할 수 없 으 면 누가 처리 해 야 하 는 지 판단 해 야 합 니 다.따라서 응답 자 체인 이 나타 나 는 역할 은 이벤트 응답 자 를 찾 는 것 입 니 다.

    응답 자 체인 원칙:
  • 터치 대상 initalView 가 이벤트 에 응답 할 수 없 을 때 상위 보기 슈퍼 뷰 에 응답 하기
  • 상부 보기 가 응답 하지 않 으 면 계속 위로 전달
  • 보기 컨트롤 러 에 전 달 될 때 까지 루트 보기 controllerView 를 위로 전달 합 니 다.루트 보기 가 응답 하지 않 으 면 보기 컨트롤 러 view Controller
  • 에 전달 합 니 다.
  • 보기 컨트롤 러 가 응답 하지 않 습 니 다.부모 보기 컨트롤 러 에 전 달 된 루트 보기 슈퍼 컨트롤 러 View 입 니 다.루트 보기 가 응답 하지 않 으 면 부모 보기 컨트롤 러 슈퍼 뷰 컨트롤 러
  • 에 전 달 됩 니 다.
  • 최상 위 보기 컨트롤 러 가 응답 하지 않 아 주 창 keyWindow
  • 에 전 달 됩 니 다.
  • keyWindow 가 응답 하지 않 고 UIApplication 처리
  • 에 전달 합 니 다.
  • UIApplication 이 응답 하지 않 으 면 이 사건 은 버 려 집 니 다
  • 3.UIResponder 계승
    상기 사건 의 배포 와 응답 자 체인 은 우리 가 관심 을 가 질 필요 가 없습니다.이런 조작 은 자동 으로 실 행 됩 니 다.우리 가 조작 할 필요 가 없습니다.우 리 는 그들의 원 리 를 이해 하기 만 하면 됩 니 다.
    iOS 에서 모든 클래스 가 이 벤트 를 처리 하고 받 아들 일 수 있 는 것 은 아 닙 니 다.UIResponsder 를 계승 하 는 대상 만 이 이 벤트 를 처리 할 수 있 습 니 다.
    UIResponder 의 대상 을 계승 하여 이 벤트 를 처리 할 수 없 는 경우:

    userInteractionEnabled = NO;
    hidden = YES;
    alpha = 0 ~ 0.01;
    touches Began:withEvent 방법 이 구현 되 지 않 았 습 니 다.
    UIResponsder 터치 응답 재 작성 방법:

    #pragma mark
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
    #pragma mark
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
    #pragma mark
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
    #pragma mark ,
    - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
    4.UITouch 대상
    UIResponsder 터치 응답 방법 에서 UITouch 대상 을 가 져 와 야 합 니 다:
    //        (             )
    UITouch *touch = [touches anyObject];
    //
    CGPoint current = [touch locationInView:self.view];
    //
    CGPoint previous = [touch previousLocationInView:self.view];
    기타 상용 속성:
    window:창 터치
    view:터치 가 있 는 보기
    tapCount:단시간 클릭 횟수
    이런 것들 을 알 게 되면 터치 사건 을 이용 하여 재 미 있 는 일 을 할 수 있 습 니 다.(^o^)/~여 기 는 구체 적 인 코드 를 열거 하지 않 습 니 다.

    좋은 웹페이지 즐겨찾기