나는 여러 개의 하위 뷰가 포함 된 NSView
이 있습니다. 하위 뷰 중 하나가 투명하고 레이어가 맨 위에 표시됩니다.NSView를 통해 클릭
아래 뷰를 통해 아래 뷰를 클릭 할 수 있어야 (아래보기가 첫 번째 응답자 상태가 됨) 모든 마우스 이벤트가 상위 뷰에 고정됩니다 (알파는 1
입니다. 물건이 포함되어 있으므로 투명 영역을 클릭해야합니다.)
실제로 정상적으로 작동하므로이 기능이 실제로 작동 할 것으로 예상됩니다. 뭐가 문제 야?
나는 여러 개의 하위 뷰가 포함 된 NSView
이 있습니다. 하위 뷰 중 하나가 투명하고 레이어가 맨 위에 표시됩니다.NSView를 통해 클릭
아래 뷰를 통해 아래 뷰를 클릭 할 수 있어야 (아래보기가 첫 번째 응답자 상태가 됨) 모든 마우스 이벤트가 상위 뷰에 고정됩니다 (알파는 1
입니다. 물건이 포함되어 있으므로 투명 영역을 클릭해야합니다.)
실제로 정상적으로 작동하므로이 기능이 실제로 작동 할 것으로 예상됩니다. 뭐가 문제 야?
다른 접근 방법이 있습니다. 새 윈도우 객체를 만들 필요가 없으며 위의 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;
}
고유 한 하위 창에 투명한보기를 배치하십시오.
왜 그렇게해야합니까? –
윈도우의 투명한 부분을 통한 히트를 해결하는 것이 윈도우 관리자의 본질이기 때문에. 위에서 한 작업은 필요하지 않습니다. – NSResponder
오우 저는 방금 실제로 창 동기화를 수행하는'-addChildWindow :'메소드가 있음을 깨달았습니다! 죄송합니다. 수동으로 동기화해야한다고 생각했습니다. –
이 코드 스 니펫의 문제를 피했습니다.
- (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];
}
보기가 불투명으로 설정되어 있습니까? – Macmade
'-isOpaque' 뷰가'NO'입니다 –