我需要找到鼠标位置是否在NSView的矩形内。
我使用NSPointInRect(point, rect)
,但我需要将rect坐标转换为屏幕坐标,我不知道如何。任何帮助将不胜感激!
答案 0 :(得分:33)
这样的事情对你有用:
NSView* myView; // The view you are converting coordinates to
NSPoint globalLocation = [ NSEvent mouseLocation ];
NSPoint windowLocation = [ [ myView window ] convertScreenToBase: globalLocation ];
NSPoint viewLocation = [ myView convertPoint: windowLocation fromView: nil ];
if( NSPointInRect( viewLocation, [ myView bounds ] ) ) {
// Do your thing here
}
我个人并不使用这么多局部变量,但希望这会使这个例子更加清晰。
答案 1 :(得分:22)
使用NSView的 convertPoint:fromView:方法,将 fromView 作为 nil ,将窗口坐标中的点转换为视图的坐标系。
将鼠标点转换为视图坐标系后,我会使用NSView的鼠标:inRect:方法而不是NSPointInRect,因为前者也会考虑翻转坐标系。
或者,您可以使用Tracking Area Object。
答案 2 :(得分:5)
一些使用鼠标的代码:inRect :(推荐方式;说明翻转坐标)
CGPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
CGRect rect = [self bounds];
if ([self mouse:point inRect:rect]) {
}
答案 3 :(得分:2)
NSView isMousePoint函数对我有用,而不必担心任何CG。
func isMouseInView(view: NSView) -> Bool? {
if let window = view.window {
return view.isMousePoint(window.mouseLocationOutsideOfEventStream, in: view.frame)
}
return nil
}
答案 4 :(得分:1)
这些答案都没有考虑到视图可能不是矩形。
这是一种适用于非矩形视图的通用方法。想想表面或复杂的路径形状。
此代码段将为您提供来自globalPoint(aka globalToLocal)的localPoint。 (0,0窗口空间中的GlobalPoint)如果将参数更改为" toView"然后你会得到一个" localToGlobal"点。
let localPoint = convertPoint(aPoint, fromView: self.window?.contentView)
如果该点位于路径内,则波纹管代码将返回true或false。
CGPathContainsPoint(someCGPath,nil,localPoint,true)
注意:强> aPoint是从hitTest中的参数派生的globalPoint,它也可以从以下派生:
(self.window?.mouseLocationOutsideOfEventStream)!
注意强>: 可能有更正确的方法来做到这一点。但这很有效,并不关心翻转视图。