2011-03-21 3 views
4

경계선이없는 NSWindow가 원 모양입니다. 이렇게하려면 채워진 원을 그려주는 사용자 지정 NSView를 사용합니다.CALayer를 사용하여 NSView에서 마우스 클릭 연결을 수행하는 방법은 무엇입니까?

마우스를 투명도 픽셀 에 넣으면 윈도우의 콘텐트 rect 안에 들어가서 어떤 응용 프로그램이든 뒤에있는 응용 프로그램으로 바로갑니다. 채워진 원 안의 클릭은 내 애플리케이션에 의해 차단됩니다. 여태까지는 그런대로 잘됐다.

문제는 다음 줄과 창문의 콘텐츠 RECT 내부의 위의 동작 변경 및 모든 클릭이 차단되어 있다는 것입니다, 투명 픽셀 여부 :

[circleView setWantsLayer:YES]; 

는 투명 픽셀의 클릭을하는 방법이 있나요 CALayer 인스턴스가 에서의 창 /보기/레이어로 이동합니다.

그것은 기본적으로 (이 애니메이션을 지원하지 않기 때문에,이 솔루션은 모든 경우에 작동하지 않는 경우에만 있음) 아래에 설명 된대로 동일한 문제입니다 :

http://www.cocoabuilder.com/archive/cocoa/235281-clicking-through-nsview-with-calayers.html

+0

circle은 창의 콘텐츠보기입니까, 아니면 콘텐츠보기의 하위보기입니까? –

답변

0

나는 완전히 확실하지 않다 레이어가 지원하는보기에서 작동하는지 여부는 확인할 수 있지만 가능한 해결 방법은 원보기 하위 클래스에서 - (NSView *)hitTest:(NSPoint)aPoint을 재정의하고 aPoint이 원의 경로 안에 있는지 확인하는 것입니다. 서클 외부에있는 경우 해당 메소드에서 nil을 반환하면 클릭이 전달됩니다.

+0

신속하게 테스트했지만 불행히도 작동하지 않습니다. hitTest가 nil을 반환하는 경우에도 클릭 수는 계속 창으로 전달됩니다. – Raffael

+0

[1] 말미에 암시 되었 듯이, 컨텐트 뷰의 일부인 항상 듣는 NSTrackingArea를 사용하여 조건부 [NSWindow setIgnoresMouseEvents : NO] 트릭으로 작동하는 것으로 보입니다. [1] - http://www.cocoabuilder.com/archive/cocoa/303697-handling-mouse-events-on-transparent-window-conditionally.html – Raffael

0

CGPath가있는 CAShapeLayer가 작동하거나 CAShapeLayer를 콘텐츠 레이어의 마스크로 만들 수 있습니다.

관련 문제