我创建了一个NSView子类,该子类绘制了一个红色实心圆,并且我想拦截仅出现在Red Circle中而不是透明像素中的鼠标单击。
我认为我必须使用hitTest:函数,但是我不确定这是正确的方法。

(我的视图具有AcceptFirstMouseMouseDown实现,isOpaque返回NO。)

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

最佳答案

在这种情况下,使用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;
}

关于objective-c - 以椭圆为内容的NSView上的鼠标事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6762548/

10-10 20:28