如何查找鼠标是否在视图上方

时间:2011-01-07 21:33:00

标签: objective-c cocoa macos nsview

我需要找到鼠标位置是否在NSView的矩形内。

我使用NSPointInRect(point, rect),但我需要将rect坐标转换为屏幕坐标,我不知道如何。任何帮助将不胜感激!

5 个答案:

答案 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)!

注意: 可能有更正确的方法来做到这一点。但这很有效,并不关心翻转视图。