2010-01-30 27 views
2

我有一系列的嵌套視圖,我需要捕捉mouseDown事件螞蟻做同樣的事情時,任何這些意見被選中。有沒有辦法告訴superview處理子視圖的事件?處理這個問題的最佳方法是在所有其他視圖之上放置透明視圖,並讓該視圖處理事件?捕捉子視圖的mouseDown事件。 (Cocoa osx)

+0

默認'鼠標按下:'在NSResponder類已經將事件轉發到下一個響應者。你的子視圖是什麼類?你可以編輯它們,還是預定義的(UI控件等)? –

+0

我的子視圖是自定義的NSViews。 – Mike2012

回答

2

你的子視圖是否定義了自己的mouseDown:

如果他們還沒有定義他們自己的-[… mouseDown:(id)event],那麼他們應該已經將他們的事件傳遞給響應者鏈,這應該到達你的超級視圖。

否則,(除了他們需要做的任何其他處理之外),他們需要決定超級視圖應該接收哪些事件,併爲這些事件調用[super mouseDown:event]

1

在超級視圖中,如果該點位於超級視圖的矩形中,則可以重寫hitTest以返回超級視圖。這將阻止鼠標事件進入任何子視圖。

- (NSView *)hitTest:(NSPoint)aPoint 
{ 
    return NSPointInRect(aPoint, self.frame) ? self : nil; 
} 

請注意,aPoint是在超級視圖的「框架」座標系中,而不是它的邊界。

+0

不幸的是,這似乎從10.8開始停止工作 – George

0

該版本適用於將在屏幕上表達了點的座標:

NSPointInRect([view convertPoint:[[view window] convertScreenToBase:point] fromView:nil], [view bounds]);