2011-03-21 78 views
4

我有一個圓形的自定義無邊界NSWindow。爲此,我使用繪製實心圓的自定義NSView。如何使用CALayer在NSView上實現鼠標點擊?

鼠標點擊窗口內容矩形中的透明像素直接穿過窗口,看看它發生在它後面的任何應用程序。填充的圓圈內的點擊被我的應用攔截。到現在爲止還挺好。

的問題是,下面的行上述行爲的變化和所有點擊該窗口的內容矩形內被截獲,透明像素或不:

[circleView setWantsLayer:YES]; 

有沒有一種方法來對透明像素點擊CALayer實例去通過窗口/視圖/圖層到它後面的應用程序?

它本質上是如下所示(僅該解決方案並不適用於所有情況,因爲它不支持動畫)完全相同的問題:

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

+0

是circle查看窗口的內容視圖,還是它是內容視圖的子視圖? – 2012-09-04 14:33:30

回答

0

我不能完全肯定無論這是否適用於支持圖層的視圖,但可能的解決方案是在您的圓圈視圖子類上覆蓋- (NSView *)hitTest:(NSPoint)aPoint,並檢查aPoint是否位於圓圈的路徑內。如果它位於圓圈之外,則從該方法返回nil應導致點擊被傳遞。

+0

很快測試過,不幸的是無法正常工作。點擊仍然傳遞到窗口,即使hitTest返回nil。 – Raffael 2014-03-13 21:14:27

+0

正如在[1]結尾處暗示的那樣,通過使用始終監聽的NSTrackingArea(它是內容視圖的一部分),似乎可以使用條件[NSWindow setIgnoresMouseEvents:NO]技巧。 [1] - http://www.cocoabuilder.com/archive/cocoa/303697-handling-mouse-events-on-transparent-window-conditionally.html – Raffael 2014-03-13 21:35:48

0

帶有CGPath的CAShapeLayer將可用,或者您可以創建CAShapeLayer作爲內容層的掩碼。