2011-03-18 1 views
8

나는 여러 개의 하위 뷰가 포함 된 NSView이 있습니다. 하위 뷰 중 하나가 투명하고 레이어가 맨 위에 표시됩니다.NSView를 통해 클릭

아래 뷰를 통해 아래 뷰를 클릭 할 수 있어야 (아래보기가 첫 번째 응답자 상태가 됨) 모든 마우스 이벤트가 상위 뷰에 고정됩니다 (알파는 1입니다. 물건이 포함되어 있으므로 투명 영역을 클릭해야합니다.)

실제로 정상적으로 작동하므로이 기능이 실제로 작동 할 것으로 예상됩니다. 뭐가 문제 야?

+0

보기가 불투명으로 설정되어 있습니까? – Macmade

+0

'-isOpaque' 뷰가'NO'입니다 –

답변

10

다른 접근 방법이 있습니다. 새 윈도우 객체를 만들 필요가 없으며 위의 findNextSiblingBelowEventLocation : 메소드보다 간단하고 (아마도 조금 더 효율적입니다.)

- (NSView *)hitTest:(NSPoint)aPoint 
{ 
    // pass-through events that don't hit one of the visible subviews 
    for (NSView *subView in [self subviews]) { 
     if (![subView isHidden] && [subView hitTest:aPoint]) 
      return subView; 
    } 

    return nil; 
} 
1

고유 한 하위 창에 투명한보기를 배치하십시오.

+0

왜 그렇게해야합니까? –

+1

윈도우의 투명한 부분을 통한 히트를 해결하는 것이 윈도우 관리자의 본질이기 때문에. 위에서 한 작업은 필요하지 않습니다. – NSResponder

+0

오우 저는 방금 실제로 창 동기화를 수행하는'-addChildWindow :'메소드가 있음을 깨달았습니다! 죄송합니다. 수동으로 동기화해야한다고 생각했습니다. –

1

이 코드 스 니펫의 문제를 피했습니다.

- (NSView *)findNextSiblingBelowEventLocation:(NSEvent *)theEvent { 
    // Translate the event location to view coordinates 
    NSPoint location = [theEvent locationInWindow]; 
    NSPoint convertedLocation = [self convertPointFromBase:location]; 

    // Find next view below self 
    NSArray *siblings = [[self superview] subviews]; 
    NSView *viewBelow = nil; 
    for (NSView *view in siblings) { 
    if (view != self) { 
     NSView *hitView = [view hitTest:convertedLocation]; 
     if (hitView != nil) { 
     viewBelow = hitView; 
     } 
    } 
    } 
    return viewBelow; 
} 

- (void)mouseDown:(NSEvent *)theEvent { 
    NSView *viewBelow = [self findNextSiblingBelowEventLocation:theEvent]; 
    if (viewBelow) { 
    [[self window] makeFirstResponder:viewBelow]; 
    } 
    [super mouseDown:theEvent]; 
} 
관련 문제