我创建了一个NSView的子类,绘制了一个红色的圆圈,我想拦截仅进入红圈而不是透明像素的鼠标点击。
我认为我必须使用hitTest:
函数,但我不确定这是正确的方法。
(我的观点有AcceptFirstMouse
和MouseDown
实施,isOpaque
返回NO。)
我该怎么做才能获得这种行为?
答案 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
。