我创建了一个NSView子类,该子类绘制了一个红色实心圆,并且我想拦截仅出现在Red Circle中而不是透明像素中的鼠标单击。
我认为我必须使用hitTest:
函数,但是我不确定这是正确的方法。
(我的视图具有AcceptFirstMouse
和MouseDown
实现,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/