컴퓨터 지식 네트워크 - 컴퓨터 프로그래밍 - 이벤트 전달 및 응답 메커니즘

이벤트 전달 및 응답 메커니즘

응답자 객체

iOS 의 모든 객체가 이벤트를 처리할 수 있는 것은 아닙니다. UIResponder 를 상속하는 객체만 이벤트를 수락하고 처리할 수 있습니다. 이를' 응답자 객체' 라고 합니다. 예: UIApplication? UIViewController? UIView

UIResponder 는 터치 이벤트, 누름 이벤트, 원격 제어 이벤트, 하드웨어 모션 이벤트를 처리할 수 있습니다.

이벤트 전달

1. 터치 이벤트가 발생하면 UIApplication 에서 관리하는 이벤트 대기열에 추가됩니다. 큐는 FIFO, 즉 선입선출, 먼저 생성된 이벤트 먼저 처리 (먼저 이벤트를 받은 것은 UI 애플리케이션) 를 특징으로 하기 때문이다.

2. ui application 은 이벤트 대기열에서 맨 앞의 이벤트를 가져와 처리할 이벤트를 배포합니다. 일반적으로 이벤트는 애플리케이션의 주 창 (keyWindow) 으로 먼저 전송됩니다.

3. 주 창은 터치 이벤트를 처리하는 뷰 계층에서 가장 적합한 뷰를 찾습니다. 적절한 뷰 컨트롤을 찾으면 뷰 컨트롤의 touches 메서드가 호출되어 특정 이벤트 처리를 수행합니다.

터치 이벤트는 상위 컨트롤에서 하위 컨트롤로 전달됩니다.? UIApplication-gt;; 윈도-gt; 이벤트를 처리하는 데 가장 적합한 view 찾기

ui view 터치 이벤트를 수신할 수 없는 4 가지 경우

1. 상호 작용이 허용되지 않는 경우: userInteractionEnabled = NO, 현재 뷰가 상호 작용할 수 없는 경우 사용자가 트리거한 이벤트는 해당 뷰에 의해 무시되며 (다른 뷰는 평소와 같이 응답됨), 보기 객체도 이벤트 응답 대기열에서 제거됩니다.

2. 숨기기: 상위 컨트롤을 숨기면 하위 컨트롤도 숨겨지고 숨겨진 컨트롤은 이벤트

3. 투명도를 받을 수 없습니다. 컨트롤의 투명도 lt 를 설정하면 0.01, 하위 컨트롤의 투명도에 직접적인 영향을 줍니다. 알파: 0.0 ~ 0.01 은 투명합니다.

4. 하위 뷰의 일부 영역이 상위 뷰를 초과하고 상위 뷰가 호출되기 때문에 터치 이벤트도 받지 않습니다. PointInside 메서드는 NO 를 반환합니다. 설명 터치포인트가 자체 범위 내에 있지 않으면 현재 view 의 hitTest: withEvent: 메서드는 nil 을 반환하고 현재 view 의 모든 subview 는 판단하지 않습니다.

참고: Touch 위치가 뷰 경계를 초과하면 hitTest:withEvent 메서드는 이 뷰와 이 뷰의 모든 하위 뷰를 무시합니다. 그 결과, 뷰의 ciipsToBounds 속성이 NO 인 경우 하위 뷰가 뷰 경계를 초과하면 터치 포인트가 그 위에 있더라도 이벤트가 수신되지 않습니다.

뷰에서 이벤트를 처리할 수 있는지 여부에 관계없이 뷰를 클릭하기만 하면 이벤트가 생성됩니다. 핵심은 결국 누가 이벤트를 처리하느냐입니다. 시스템은 hittest: (CG point) point with event: (ui event *) even 을 통해 이벤트를 처리하는 데 가장 적합한 view 를 찾습니다. -응?

이벤트를 처리하는 가장 적합한 컨트롤을 찾는 방법 적용

1. 먼저 주 창 (keyWindow) 이 터치 이벤트 hitTest 메서드를 받아들일 수 있는지 여부를 결정합니다.

2. 터치포인트가 자신에게 있는지 판단하고 pointInside 방법을 통해 판단한다.

3. 위 2 단계가 모두 조건을 충족하면 이 이벤트가 view 에 전달되고 더 적합한 view 가 없을 때까지 view 의 subviews 하위 컨트롤 데이터가 트래버스됩니다.

참고: 배열 끝에서 하위 컨트롤을 앞으로 이동하는 방식으로, 다음에 추가된 view 가 맨 위에 있고, 맨 위 응답자가 먼저 응답을 받아들이고, 이벤트가 계속 전달되지 않도록 차단하여 반복 횟수를 줄일 수 있습니다.

5. 적합한 하위 컨트롤이 없는 경우 이 이벤트를 처리하는 것이 가장 적합하다고 생각합니다. return self.

가장 적합한 view 기본 구문 분석을 찾으십니까? 두 가지 중요한 방법:

piontinside 메서드 사용 장면: IOS 버튼 클릭 영역 추가-버튼 클릭 반응 영역 확대-(ui view *) hittest: (CG point) pointwint 언제 호출해요?

? 이벤트가 누구에게 전달되면 누구의 hitTest:withEvent: 메서드가 호출됩니다.

활성

이벤트에 응답할 수 있는 검색 및 반환,? 가장 적합한 view, 어디를 클릭하든 가장 적합한 view 는 hitTest 메서드에서 반환된 view 입니다.

참고: 이 컨트롤이 이벤트를 처리할 수 있는지 여부 또는 터치 포인트가 이 컨트롤에 없는지 여부에 관계없이 이벤트가 먼저 이 컨트롤로 전달되며 hitTest 메서드를 호출하여 이벤트를 처리할 수 있는지 여부를 결정합니다.

차단 이벤트 처리

hitTest 를 다시 작성함으로써? 메서드, 지정된 뷰를 반환합니다. 사건의 전달 과정을 가로막고, 사건을 처리하고자 하는 사람은 사건을 처리할 수 있다.

참고: hitTest? 메서드에서 nil 을 반환하면 메서드를 호출하는 컨트롤 자체와 하위 컨트롤이 모두 가장 적합한 뷰가 아닙니다. 즉, 자신에게 더 적합한 뷰를 찾을 수 없습니다. 같은 수준의 다른 컨트롤에도 적절한 뷰가 없는 경우 가장 적합한 뷰가 상위 컨트롤입니다.

하위 컨트롤이 가장 적합한 뷰인지 여부에 관계없이 시스템은 기본적으로 먼저 이벤트를 하위 컨트롤로 전달하고, 하위 컨트롤은 자체 hittest: view event: 메서드를 호출해야 더 적합한 뷰가 있는지 알 수 있습니다. 상위 컨트롤이 가장 적합한 뷰인 경우에도 하위 컨트롤의 hittest: view event: 메서드가 호출됩니다. -응?

팁: 가장 적합한 뷰를 원하는 사람은 상위 컨트롤의 hittest: with event: 메서드가 지정된 하위 컨트롤을 반환하거나 자신의 hittest: with event: 메서드 return self 를 다시 작성합니다. 그러나 상위 컨트롤의 hitTest:withEvent: 에서 하위 컨트롤을 가장 적합한 view 로 반환하는 것이 좋습니다.

이유: 하위 컨트롤을 트래버스할 때 터치포인트가 하위 컨트롤 A 자체가 아니라 하위 컨트롤 B 에 있는 경우 하위 컨트롤 A 를 가장 적합한 뷰로 반환하려면 반환 방법을 사용하면 A 자체를 통과할 시간이 없을 수 있습니다. 점이 실제로 있는 뷰 B 를 이미 통과했을 수 있습니다. 이로 인해 자신이 아니라 터치포인트가 실제로 있는 view 가 반환됩니다. 따라서 상위 컨트롤의 hitTest:viewEvent: 에서 하위 컨트롤을 가장 적합한 뷰로 반환하는 것이 좋습니다.

가장 적합한 view 를 찾으면 해당 view 의 touches 메서드가 호출되어 특정 이벤트를 처리합니다.

터치 이벤트는 터치스크린에서 생성된 후 현재 어플리케이션으로 어떻게 전달됩니까?

시스템 응답 단계

사용자가 화면을 터치하면 시스템 하드웨어 프로세스에서 이 클릭 이벤트를 가져와서 이벤트를 캡슐화한 후 시스템에 저장합니다. 하드웨어 감지 프로세스와 현재 App 프로세스는 두 프로세스이므로 프로세스 간에 이벤트를 전달하는 데 포트 통신이 사용됩니다.

1. 화면을 터치하는 것을 가리키며, 화면이 터치를 감지한 후 이벤트를 IOKit 에 넘겨줍니다.

2. IOKit 는 터치 이벤트를 IOHIDEvent 객체로 캡슐화하고 mach port 를 통해 SpringBoad 프로세스에 전달합니다. 프로세스 간에 통신하는 mach port 프로세스 포트입니다.

3. SpringBoad 는 시스템에서 수신한 터치 이벤트를 통합 관리하고 배포하는 시스템 프로세스입니다. 터치 이벤트를 포그라운드 app 프로세스에 전달하여 처리합니다.

참조: RunLoop 원리 학습-

APP 응답 단계

1. APP 프로세스의 mach port 가 SpringBoard 프로세스에서 전달된 것을 받았습니다

2. source1 콜백은 수신된 IOHIDEvent 객체를 UIEvent 객체로 캡슐화하는 또 다른 source0 콜백을 트리거합니다.

3. source0 콜백 내부 UIApplication 객체의 이벤트 대기열에 터치 이벤트를 추가합니다. 이벤트가 대기열에서 빠진 후 UIApplication 은 hit-testing 이라고도 하는 최적의 응답자를 찾기 시작했습니다. -응?

3. 시스템은 이번 터치로 인해 새로운 이벤트가 발생했는지 여부를 판단합니다. 그렇다면 시스템은 먼저 응답 네트워크에서 응답 체인을 찾습니다. 그렇지 않은 경우 이 이벤트는 현재 진행 중인 이벤트에 의해 생성된 Touch message 입니다. 즉, 저장된 응답 체인

4. 최적 응답자를 찾으면 응답 체인에서 이벤트가 전달되고 응답합니다.

응답자 체인: 여러 응답자 객체로 연결된 체인

iOS 프로그램에서 맨 뒤 UIWindow 또는 맨 앞 버튼 중 하나에 컨텍스트가 있고 한 컨트롤을 다른 컨트롤 위 또는 아래에 놓을 수 있는 경우 사용자가 클릭

이벤트가 응답자 체인에 전달되어 이벤트가 처리되거나 폐기되었습니다. 응답자 체인은 각 응답자 간의 연결을 명확하게 볼 수 있으며 한 이벤트에 대해 여러 객체를 처리할 수 있습니다.

각 응답자 객체 (UIResponder 객체) 에는 응답 체인의 현재 객체에 대한 다음 응답자를 가져오는 nextResponder 메서드가 있습니다. 따라서 이벤트의 첫 번째 응답자가 확인되면 해당 이벤트의 응답 체인이 결정됩니다.

응답자 객체 기본 nextResponder 는 다음과 같습니다.

1. UIView 의 nextResponder 속성, 이 view 를 관리하는 UIViewController 객체가 있는 경우 그렇지 않으면 nextResponder 가 superview 가 됩니다.

3. UIViewController 의 nextResponder 속성이 view 를 관리하는 superview.

VC 가 window 의 루트 뷰 루트 VC 인 경우

VC 가 다른 컨트롤러 present 에서 나온 경우 nextResponder 는 presenting view controller 입니다.

4. UIWindow 의 nextResponder 등록 정보는 UIApplication 객체입니다.

5. UIApplication 의 nextResponder 속성은 nil 입니다.

현재 적용된 app delegate 가 UIView, UIViewController 또는 app 자체가 아닌 UIResponder 객체인 경우 UIApplication 의 nextResponder 는 app 입니다 -응?

응답자 체인의 이벤트 전달 프로세스:

1.? 현재 view 가 제어기의 view 인 경우 제어기가 마지막 응답자이고 이벤트가 제어기에 전달됩니다. 현재 view 가 제어기의 view 가 아닌 경우 상위 뷰는 현재 view 의 마지막 응답자이며 이벤트는 상위 뷰

2. 뷰 계층의 최상위 뷰로 전달되며, 수신된 이벤트나 메시지도 처리할 수 없는 경우 이벤트나 메시지를 window 오브젝트에 전달하여

4 에 전달합니다. UIApplication 도 이벤트나 메시지를 처리할 수 없는 경우

응답자를 폐기합니다.

이벤트는 기본 응답 체인을 따라 자동으로 위로 전달되고 (touch 메서드는 기본적으로 이벤트를 처리하지 않고 이벤트만 전달),.

UIResponder 의 기본 구현은 아무것도 처리하지 않지만 UIKit 의 UIResponder 의 직접 하위 클래스입니다 NextResponder 입니다.

2. 차단, 더 이상 이벤트 전달 중단, 다시 쓰기 touchesbegan: with event: 이벤트 처리, 상위 클래스의 touchesbegan: with event 호출 안 함, 이벤트 처리 종료

3. 차단, 이벤트 전달 계속, 자체 touchesBegan:withEvent: 이벤트 처리, [super? TouchesBegan:withEvent:]:] 이벤트를 아래로 전달하여 한 이벤트의 여러 오브젝트 처리 목적을 달성합니다. -응?

권장: [super touches began: touches with event: event]; -응?

super 의 touches 대응 메서드에서는 기본적으로 이벤트가 계속 위로 전달됩니까? Next responder. -응?

nextResponder 에 직접 메시지를 보내지 않는 것이 좋습니다. 이렇게 하면 상위 클래스에서 이 이벤트에 대한 다른 처리가 누락될 수 있습니다.

[self.nextResponder? Touches began: touches with event: event];

제스처 이벤트는 응답 체인의 전달을 방해합니다. 제스처는 응답 체인보다 우선 순위가 높기 때문에 제스처가 추가된 View 는 하위 View 응답 체인을 차단하고 제스처가 먼저 응답하고 이벤트를 처리합니다. 이 이벤트는 더 이상 체인의 상향 전달에 응답하지 않습니다.

_ uiapplicationhandleeventqueue () 가 제스처를 인식하면 먼저 Cancel 을 호출하여 현재 touchesBegin/Move/End 시리즈 콜백을 끊습니다. 그런 다음 해당 UIGestureRecognizer 가 보류 중으로 표시됩니다.

애플은 _ uigesturerecognizerupdateobserver ( UIGestureRecognizer 가 변경 (생성/제거/상태 변경) 되면 콜백이 처리됩니다.

이벤트의 전달과 응답의 차이점:

이벤트의 전달은 위에서 아래로 (상위 컨트롤에서 하위 컨트롤로), 이벤트의 응답은 아래에서 위로 (응답자 체인을 따라 위로 전달: 하위 컨트롤에서 상위 컨트롤로) 입니다.

해당 VC 제어는 view 를 기준으로 찾을 수 있습니다.?

참조 문장:

역사상 가장 자세한 iOS 이벤트 전달 및 응답 메커니즘-원리 기사-

iOS 응답자 및 응답자 체인-

<;

上篇: 헌납 내용에 관한 칠판신문 칠판신문 이미지 자료에 대하여 下篇: 호주에서 중국으로 휴대전화를 보낼 수 있나요?
관련 내용