2011-07-20 44 views
0

我創建了NSView的一個子類,繪製了一個紅色的實心圓,我想攔截只進入紅圈而不是透明像素的鼠標點擊。 我認爲我必須使用hitTest:函數,但我不確定這是否正確。在NSView上用橢圓作爲內容的鼠標事件

(我的觀點有AcceptFirstMouseMouseDown實施,isOpaque返回NO。)

我能做些什麼來得到這個行爲?

回答

2

在這種情況下使用hitTest:withEvent:不會對您有所幫助,因爲如果在視圖框架內部的任何地方都將通過此測試。
假設你至少知道圓的中心位置(也許和視圖一樣)和圓的半徑,也許(相當)簡單的計算就可以做你想做的事情。問題是現在確定圓的中心和你的點之間的距離是否小於半徑。

然後你就可以很容易地編寫一個函數,例如:

+(BOOL)ispoint:(CGPoint)aPoint inCircleWithCenter:(CGPoint)aCenterPoint 
     radius:(CGFloat)aRadius { 
    CGFloat squareDistance = (aCenter.x - aPoint.x) * (aCenter.x - aPoint.x) + 
          (aCenter.y - aPoint.y) * (aCenter.y - aPoint.y); 
    return squareDistance <= aRadius * aRadius; 
} 

事實上,我們可以討論<=,這可能只是< ...這是一個類方法你可以裝備你的自定義子類。或寫一個功能:

BOOL CGPointInCircle(CGPoint aPoint, CGPoint aCenter, CGFloat aRadius) { 
    CGFloat squareDistance = (aCenter.x - aPoint.x) * (aCenter.x - aPoint.x) + 
          (aCenter.y - aPoint.y) * (aCenter.y - aPoint.y); 
    return squareDistance <= aRadius * aRadius; 
} 
+0

由於每個視圖都有自己的圓圈,其矩形必須已知,爲什麼不將它作爲實例方法呢? –

+0

@Josh Caswell - 是的,我同意你的看法。我認爲有一個類方法也很有趣,因爲它可能沒有實例化。 – 2011-07-20 19:12:15

+0

@Vince它可能只是一個函數,如果你不對對象的狀態感興趣。 –

2

這聽起來像hitTest:是你想要的。假設您使用NSBezierPath繪製圓,只需將hitTest:設置爲[path containsPoint:[self convertPoint:testPoint fromView:[self superview]]] ? self : nil即可。