일부 UIView를 처리하는 UIViewController 하위 클래스가 있다고 가정합니다.UIView, superview 및 touchesBegan :
이의 UIViewController : 다음 bigUIView
가 맨 앞보기이며, 화면 전체를 커버하기 때문에
- (void)viewDidLoad {
UIImageView *smallImageView...
[self.view addSubview:smallImageView];
UIButton *button..
[self.view addSubview:button];
UIView *bigUIView.. // covers the entire screen (frame = (0.0, 0.0, 1024.0, 768.0))
[self.view addSubview:bigUIView];
...
}
AFAIK, 그것은 touchesBegan:withEvent:
을 받게됩니다 다른 전망이 UIViews은의 UIViewController의 view
재산의 파단)로 추가됩니다 예 : button
은 터치 이벤트를 수신하지 않습니다.
내 응용 프로그램에서는 bigUIView
이 살아있을 때 다른 모든 보조 UI 요소 (UIButtons 등) 위에 있어야하는 기본 사용자 인터페이스 개체 (실제로는 CALayers, 주 게임 개체)를 보유하므로 최상위보기 여야합니다.). 그러나, 나는 여전히 UIButtons 및 기타 객체를 Responder Chain에 포함 할 수 있기를 원합니다. 그것의 모두에 터치 이벤트를 전파 않습니다
bigUIView
의 수퍼가있는 UIViewController의view
재산을 말한다 :- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.superview touchesBegan:touches withEvent:event]; ... hit test the touch for this specific uiview.. }
주 :
나는하여
bigUIView
클래스에 다음을 구현하는 시도 하위보기?bigUIView
은 사용자 입력을 처리하기 때문에userInteractionEnabled = YES
이어야합니다.button
/smallImageView
이 주 게임 개체 (하위 레이어bigUIView
) 위에 표시되므로 앞에 올릴 수 없습니다.
미리 감사드립니다.
감사합니다. jlehr, 'pointInside : withEvent :'가 해결책입니다. 그 지점이 다른 서브 뷰 중 하나의 프레임 사각형 안에있을 때 NO를 반환하면'bigUIView'의'-touchesBegan : withEvent :'메소드가 호출되지 않고'button'의 액션이 트리거됩니다. 이것은 'bigUIView'와'button '사이의 결합을 일으키는 것에주의하십시오. 'bigUIView'가 전체 화면을 덮을 때'UIViewController'에서만 이벤트 단계 메소드를 인터셉트 할 수 있습니까? 'bigUIView' 클래스에 다른 메소드 시그니처를 생성하고 "catch all"UIViewController 클래스를 위임하도록 하시겠습니까? –
아니요, 'bigUIView'에 이벤트 단계 메서드를 전혀 구현하지 마십시오.그렇게하면 메시지는 재정의 된 구현 (예 :'UIButton' 또는 사용자 정의'UIViewController' 하위 클래스)이있는 객체에 도달 할 때까지 응답 체인에 전달됩니다. – jlehr
커플 링과 관련하여, 뷰 컨트롤러에서 'bigUIView' 인스턴스가 호출하여 실제 결정을 내릴 수있는 델리게이트 메소드를 구현하는 것을 고려하십시오. 그렇게하면 뷰 컨트롤러가 어떤 뷰가 메시지를 가져 오는지 계산할 책임이 있으며 커플 링이 전혀 없을 것입니다. – jlehr