2011-07-20 9 views
0

NSViewのサブクラスを作成して、赤い塗りつぶし円を描いています。透明なピクセルではなく赤い円に入ったマウスクリックをインターセプトしたいと思います。 私はhitTest:の機能を使用しなければならないと思いますが、これは正しい方法ではないかと思います。NSViewのマウスイベントでコンテンツとして楕円が表示される

(マイビューはAcceptFirstMouseMouseDown実装、isOpaqueリターンNOを持っています。)

私は、この動作を得るために何ができますか?

答えて

2

hitTest:withEvent:を使用すると、ビューのフレーム内にの場合はの場合、このテストに合格するため、この場合は役に立ちません。
サークルの中心位置(ビュー1と同じかもしれない)とサークルの半径を少なくとも知っていると仮定すると、(かなり)簡単な計算が必要になるでしょう。問題は、円の中心とあなたのポイントとの間の距離が半径よりも小さいかどうかを判断することです。

その後、あなたは簡単に、たとえば、関数を書くことができます。

+(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

各ビューにrectを知らなければならない独自の円があるので、これをインスタンスメソッドにしてみませんか? –

+0

@Josh Caswell - そうです、私はあなたに同意します。私はクラスメソッドを持つことは、インスタンス化せずに利用できるので、興味深いと思う。 –

+0

@Vinceあなたがオブジェクトの状態に興味がないならば、それはちょうど関数かもしれません。 –

2

hitTest:のように聞こえます。円を描くためにNSBezierPathを使用していると仮定すると、hitTest:[path containsPoint:[self convertPoint:testPoint fromView:[self superview]]] ? self : nilとして実装するだけです。

関連する問題