2011-02-07 3 views
5

일부 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에 포함 할 수 있기를 원합니다. 그것의 모두에 터치 이벤트를 전파 않습니다

  1. 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 클래스에 다음을 구현하는 시도 하위보기?

  2. bigUIView은 사용자 입력을 처리하기 때문에 userInteractionEnabled = YES이어야합니다.
  3. button/smallImageView이 주 게임 개체 (하위 레이어 bigUIView) 위에 표시되므로 앞에 올릴 수 없습니다.

미리 감사드립니다.

답변

11

bigUIView 클래스에서 pointInside:withEvent:을 재정의하면 포인트가 배경보기의 다른 하위보기 중 하나의 프레임 사각형 내에있는 경우 NO을 반환 해보십시오. 이러한 다른 뷰의 형제이기 때문에 히트 테스트 메커니즘은 다른 하위 뷰를 계속 테스트하고 사용자가 터치 한 지점에 해당하는 뷰를 찾습니다.

Alos bigUIView 클래스가 아닌 UIViewController 하위 클래스에서 이벤트 단계 메서드 (-touchesBegan:withEvent: 등)를 구현하는 것이 좋습니다. iOS는보기 컨트롤러를 응답기 체인 뒤에 삽입하므로 다른 하위보기 (예 : 단추) 중 하나가이를 가로 채지 않는 한 이벤트 메시지는보기 컨트롤러에 맞춰집니다. 그러면보기 컨트롤러는 원하는 메시지를 원하는보기로 보낼 수 있습니다.

+0

감사합니다. jlehr, 'pointInside : withEvent :'가 해결책입니다. 그 지점이 다른 서브 뷰 중 하나의 프레임 사각형 안에있을 때 NO를 반환하면'bigUIView'의'-touchesBegan : withEvent :'메소드가 호출되지 않고'button'의 액션이 트리거됩니다. 이것은 'bigUIView'와'button '사이의 결합을 일으키는 것에주의하십시오. 'bigUIView'가 전체 화면을 덮을 때'UIViewController'에서만 이벤트 단계 메소드를 인터셉트 할 수 있습니까? 'bigUIView' 클래스에 다른 메소드 시그니처를 생성하고 "catch all"UIViewController 클래스를 위임하도록 하시겠습니까? –

+1

아니요, 'bigUIView'에 이벤트 단계 메서드를 전혀 구현하지 마십시오.그렇게하면 메시지는 재정의 된 구현 (예 :'UIButton' 또는 사용자 정의'UIViewController' 하위 클래스)이있는 객체에 도달 할 때까지 응답 체인에 전달됩니다. – jlehr

+1

커플 링과 관련하여, 뷰 컨트롤러에서 'bigUIView' 인스턴스가 호출하여 실제 결정을 내릴 수있는 델리게이트 메소드를 구현하는 것을 고려하십시오. 그렇게하면 뷰 컨트롤러가 어떤 뷰가 메시지를 가져 오는지 계산할 책임이 있으며 커플 링이 전혀 없을 것입니다. – jlehr

0

일반적으로 리스폰 더 체인에서 이벤트는 서브 뷰가 아닌 슈퍼 뷰로 전달됩니다. 어쨌든, 이벤트의 점을 버튼의 로컬 좌표계로 변환하고, 히트하면 컨트롤러에 작업을 보냅니다.

+0

논평 해 주셔서 감사합니다. 흥미로운 해결책입니다. 그러나 나는 "bigUIView"(게임 패키지 (CALayers)에 속함)와 다른 UI 요소 (IB에서 생성 됨) 사이의 높은 결합을 피하려고합니다. 감사합니다 –

+1

문제는 없습니다. bigUIView는 여전히 다른 UI 요소로 작업 할 필요가 없습니다. 하지만 나는 jlehr의 해결책이 갈 길인 것 같아! – MHC