예 를 들 어 iOS 응용 개발 에서 hitTest 터치 이벤트 의 작성 방법 을 설명 합 니 다.
예 를 들 어 현재 View A 라면 viewb 가 하나 더 있 습 니 다.
hitTest 방법 을 다시 쓰 지 않 으 면 시스템 은 기본적으로 view A 의 hitest 방법 을 호출 한 다음 view B 의 htest 방법 을 호출 합 니 다.
시스템 호출 과정 은 아래 의 hitest 를 다시 쓰 는 방법 과 똑같다.
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if ([self pointInside:point withEvent:event]) {
}
else {
return nil;
}
for (UIView *subView in self.subviews) {
if ([subView hitTest:point withEvent:event]!=nil) {
return subView;
}
}
return self;
}
한 번 설명 하 겠 습 니 다.hitest 방법 을 다시 쓰 지 않 으 면 모든 UIVIEew 의 기본 hitest 방법 은 위의 처리 절차 입 니 다.그래도 할 말 없어.
그러나 일부 특수 한 처리 과정 에 대해 서 는 안 된다.
그래서 hitTest 방법 을 다시 쓰 는 이 유 는 보통 상부 의 UIview 를 뚫 고 touch 사건 이 아래 의 uiview 에 도달 할 수 있 도록 하기 위해 서 입 니 다.
view A VIew B 와,
View b 는 view A 를 완전히 가 렸 지만 view B 를 클릭 할 때 view A 가 클릭 한 이벤트 에 응답 할 수 있 도록 하고 싶 습 니 다.아래 의 방법 을 사용 할 수 있다.
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if ([self pointInside:point withEvent:event]) {
NSLog(@"in view A");
return self;
}
else {
return nil;
}
}
깊이 파고들다우리 가 좀 더 깊이 들 어가 보 자.지금 실례 적 인 수요 인 터 페 이 스 는 다음 과 같다.
Window
-ViewA
-ButtonA
-ViewB
-ButtonB
계층 구조:ViewB 는 ButtonA 를 완전히 덮 었 고 ButtonB 는 ViewB 에 있 습 니 다.지금 실현 해 야 합 니 다.
(1)ButtonA 와 ButtonB 모두 메시지 에 응답 할 수 있 습 니 다(2)ViewA 도 ViewB 가 받 은 touches 메시지(3)ViewB(ButtonB)가 메 시 지 를 받 지 못 하 게 합 니 다.
(우선 분석 해 보면 기본적으로 ButtonB 의 영역,iOS 메시지 처리 과정 을 클릭 합 니 다.
-ViewA
-ButtonA
-ViewB
-ButtonB
ButtonB 영역 을 클릭 하면 처리 과정:ViewA 부터 hitTest 를 순서대로 호출 합 니 다.
pointInside 의 값 은 다음 과 같 습 니 다.
ViewA:NO;
ViewB:YES;
ButtonB:YES;
ButtonB 의 subViews:NO;
그래서 ButtonB 의 subViews 의 hitTest 는 모두 nil 로 돌아 가기 때문에 돌아 오 는 처리 대상 은 ButtonB 자신 입 니 다.이어서 touches 시 리 즈 를 처리 하 는 방법 입 니 다.여 기 는 ButtonB 바 인 딩 을 호출 하 는 방법 입 니 다.처리 가 끝나 면 메시지 가 멈 추고 전체 과정 이 끝 납 니 다.)
분석:
실현 하 는 방식 은 다양 하 다.여기 서 두 가지 수 요 를 분해 하여 실현 한다.2 를 실현 하면 1 을 만족 시 킬 수 있 기 때문이다.
수요 1 의 실현,ViewB 가 ButtonA 를 덮 었 기 때문에 기본 적 인 상황 에서 ButtonA 는 메 시 지 를 받 지 못 하지만 메시지 체제 에서 메시지 응답 을 찾 는 것 은 부모 View 에서 시작 되 기 때문에 우 리 는 ViewA 의 hitTest 방법 에서 판단 할 수 있 습 니 다.touch point 가 ButtonA 에 있 으 면 ButtonA 를 메시지 처리 대상 으로 되 돌려 줍 니 다.
코드 는 다음 과 같 습 니 다:
#pragma mark - hitTest
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// touch point _btn , hitTest _btn
CGPoint btnPointInA = [_btn convertPoint:point fromView:self];
if ([_btn pointInside:btnPointInA withEvent:event]) {
return _btn;
}
// ,
return [super hitTest:point withEvent:event];
}
이렇게 터치 포인트 가 ButtonA 에 있 을 때 touch 메 시 지 는 ViewA 에 차단 되 고 ViewB 는 받 을 수 없습니다.그리고 ButtonA 는 touch 메 시 지 를 받 으 면 onClick 방법 을 촉발 합 니 다.수요 2 의 실현,위 에서 말 한 응답 체인,ViewB 는 override 에서 touches 시 리 즈 를 떨 어 뜨리 는 방법 을 말 한 다음 에 자신 이 처리 한 후에 다음 응답 자(즉,부모 View 즉 ViewA)에 게 메 시 지 를 전달 합 니 다.
코드 는 다음 과 같 습 니 다:ViewB 코드 에서
#pragma mark - touches
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"B - touchesBeagan..");
// View ViewController
[self.nextResponder touchesBegan:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"B - touchesCancelled..");
// View ViewController
[self.nextResponder touchesBegan:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"B - touchesEnded..");
// View ViewController
[self.nextResponder touchesBegan:touches withEvent:event];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"B - touchesMoved..");
// View ViewController
[self.nextResponder touchesBegan:touches withEvent:event];
}
그리고 ViewA 에서 touches 메 시 지 를 받 을 수 있 습 니 다.ViewA 에 적 으 세 요.
#pragma mark - touches
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"A - touchesBeagan..");
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"A - touchesCancelled..");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"A - touchesEnded..");
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"A - touchesMoved..");
}
이렇게 해서 아버지 에 게 소식 을 알 리 는 것 이 이 루어 졌 다.ViewB 가 메 시 지 를 받 지 못 하 게 ViewB.UserInteractionEnable=NO 를 설정 할 수 있 습 니 다.이 외 에 도 뷰 비의 포 니 티 인사이드 를 오 버 라 이 드 할 수 있 으 며 원 리 는 위 를 참고 하 세 요.
ViewB 에 쓰기:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
// View
return NO;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.