UItouch/UIresponder: iOS에서 터치 이벤트의 보기 탐지 및 이벤트 전달

아이폰에는 매우 유창한 사용자 터치 인터랙티브 체험이 있어 각종 제스처를 측정할 수 있다. 클릭, 슬라이딩, 확대, 축소, 회전이다.대부분의 경우 UI≥GestureRecognizer와 같은 제스처 대상으로 제스처 이벤트와 제스처 처리 함수를 연결한다.또한 다음과 같은 함수에서 타사 코드가 처리되는 경우도 있습니다.
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

그렇다면 문제는 손짓과 터치가 도대체 어떤 차이와 연관이 있는가?이 모든 것은 iOS 터치 이벤트 검출과 UIResponder(응답자)부터 시작해야 한다.
시작하기 전에 Apple의 공식 지침을 살펴보십시오.https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html#//apple_ref/doc/uid/TP40009541-CH4-SW2
다행히도 누군가가 그것을 중국어로 번역했다.http://blog.csdn.net/chun799/article/details/8223612
       ,            ,      ,       ,       。       2 :

   ,        ,iOS             。

   ,         ,            。

첫 번째 터치 보기 찾기
테스트의 목적은 터치가 발생한 뷰(UIView)를 찾기 위한 것입니다.이 검측의 순서는 밑에서 위로 검측하는 과정이다.먼저 UIApplication은 UIWindow에 전달된 다음에 UIWindow가 최고급 보기에 전달되며, 최고급 보기는 모든subviews를 두루 돌아다닐 것입니다.UIView에hitTest라는 함수가 있는데 터치 이벤트가 이 보기에서 발생하면 이 함수는 비공식 UIView로 되돌아옵니다.그리고 이 보기는subviews에 귀속되어 있으며, 마지막으로 최종subview를 발견합니다.
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
- UIApplication->UIWindow
-> 톱 레벨 보기 -> 하위 보기;
- 이것은 모든 subview를 옮겨다니고, 모든 subview를 옮겨다니며,subview의 subview를 호출합니다.
-hit-test 보기를 확인하는 과정입니다. 최종적으로 찾은 보기를 hit-test view로 만듭니다.
보기 하나가user-interaction = NO로 설정되면hitTest는 빈 바늘을 되돌려줍니다.uiview에서 상속된 일부 구성 요소의 기본값user-interaction = NO, 예를 들어 UIImageView.
한 가지 더 생각해 보자. 만약에 하나의 보기가 다른 보기 위에 덮여 있다면 터치가 그들의 경계 구역에서 발생한다면 최종 검측 결과는 무엇일까요?테스트를 통해 맨 윗부분 보기가 터치 이벤트에 응답한 것을 발견했다.이것은 uiview의 하위 보기에 속하지만, 부모 보기가 하위 보기를 순환하면 반드시 맨 윗부분의 하위 보기부터 시작할 것이다.따라서 덮어쓴 보기는hitTest를 호출할 기회가 없습니다.2단계 터치 이벤트 전달 및 처리: UIresponder(응답자)
UIResponder의 헤더 파일을 보면 터치 사건을 처리할 수 있을 뿐만 아니라 휴대전화 이동 사건(예를 들어 휴대전화를 흔드는 것)을 처리하고 원격 사건을 처리할 수 있다.여기서 우리는 터치 사건만 본다.
–touchesBegan:withEvent:

– touchesMoved:withEvent:

– touchesEnded:withEvent:

– touchesCancelled:withEvent:

UIView는 UIresponder에서 상속됩니다.UIWindow는 UIView에서 상속되기 때문에 UIResponder의 하위 클래스이기도 합니다.
첫 번째 단계가 끝나면hit-testview를 찾을 수 있고 UIresponder->touches* 함수를 호출하여 처리할 수 있습니다.만약 우리가 터치 함수를 다시 쓰지 않는다면, 기본적으로self->nextResponder->터치 이벤트를 아래로 전달합니다.모든 responder에는 nextResponder가 있는데, 이것은 응답자 체인(responder)을 구성한다
chain).주의해야 할 점:
1, 만약 우리가 터치*함수를 다시 쓸 때 [super 터치*]를 호출하지 않는다면 사건은 계속 아래로 전달되지 않을 것이다.
2, UIViewController도 UIresponder를 계승하기 때문에 응답 체인에는 보기 외에 보기 컨트롤러도 있다.그래서 보기 제어 구역에서도 터치*함수를 실현할 수 있다.
3, 응답 체인의 형성에 관하여: 응답 체인은 매우 복잡한 데이터 체인으로 보이지만 사실은 매우 간단하다.모든 responder는 넥스트 Responder에만 관심을 가지면 됩니다.한편, 넥스트 Responder의 값 부여 과정은 다음과 같다. uiview controller가 초기화되면 그와 관련된 보기의 넥스트 Responder를 자신으로 설정한다.하위 보기add일 때,nextResponder를 자동으로 부모 보기로 설정합니다.UI★GestureRecognizer, UIControl과 터치의 관계
UItouch는 밑바닥의 터치 조작으로 개발자가 이를 각종 제스처 조작으로 해석/식별하려면 작업량이 너무 많다.UI≥GestureRecognizer의 도움으로 우리는 터치*함수에 신경 쓸 필요가 없다.이 안에 또 디테일이 있으니 보십시오https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html#//apple_ref/doc/uid/TP40009541-CH2-SW2.
UIControl는 같은 이치이다. 이것은 사실 우리가 너무 밑바닥의 터치 조작에서 벗어날 수 있도록 도와주고, 단추를 누르고 들어올리는 등의 동작으로 직접 해석해 준다.그리고 UIControl은 터치 사건을 더 이상 아래로 전달하지 않을 것으로 보인다.UItouch/UIresponder를 사용하여 약간의 흑마법을 실현하다
1, uiview가 속하는 보기 컨트롤러를 찾습니다.
@implementation UIView (ParentController)

-(UIViewController*)parentController{

UIResponder *responder = [self nextResponder];

while (responder) {

if ([responder isKindOfClass:[UIViewController class]]) {

return (UIViewController*)responder;

}

responder = [responder nextResponder];

}

return nil;

}

@end

2, 응답 터치 이벤트를 조작하는 보기
- (UIView*)hitTest:(CGPoint)point

withEvent:(UIEvent*)event{

if(!CGRectContainsPoint(self.pageScrollView.frame, point)) {

returnself.pageScrollView;

}

return[superhitTest:pointwithEvent:event];

}

3, 조작 응답 체인
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {

if(!self.dragging) {

[self.nextRespondertouchesBegan:toucheswithEvent:event];

}else{

[supertouchesBegan:toucheswithEvent:event];

}

}

중요한 일을 다시 한 번 말씀드리겠습니다.
             

             :UIResponder(   )

누구도 당신의 생각을 대체할 수 없다는 것을 반복해서 체득하세요.
많이 배우면 할수록 빨리 한다.많이 배우면 할수록 잘한다.

좋은 웹페이지 즐겨찾기