NSView上的鼠标事件,以椭圆为内容

时间:2011-07-20 13:13:44

标签: objective-c cocoa nsview

我创建了一个NSView的子类,绘制了一个红色的圆圈,我想拦截仅进入红圈而不是透明像素的鼠标点击。 我认为我必须使用hitTest:函数,但我不确定这是正确的方法。

(我的观点有AcceptFirstMouseMouseDown实施,isOpaque返回NO。)

我该怎么做才能获得这种行为?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

听起来hitTest:就是你想要的。假设您使用NSBezierPath绘制圆圈,只需将hitTest:实现为[path containsPoint:[self convertPoint:testPoint fromView:[self superview]]] ? self : nil