Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何找到鼠标是否在视图上_Objective C_Cocoa_Macos_Nsview - Fatal编程技术网

Objective c 如何找到鼠标是否在视图上

Objective c 如何找到鼠标是否在视图上,objective-c,cocoa,macos,nsview,Objective C,Cocoa,Macos,Nsview,我需要确定鼠标位置是否在NSView的矩形内 我会使用NSPointInRect(point,rect),但我需要将rect坐标转换为屏幕坐标,我不知道如何转换。任何帮助都将不胜感激 像这样的东西应该适合你: NSView* myView; // The view you are converting coordinates to NSPoint globalLocation = [ NSEvent mouseLocation ]; NSPoint windowLocation = [ [ my

我需要确定鼠标位置是否在NSView的矩形内


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

像这样的东西应该适合你:

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
}
我个人不使用这么多的局部变量,但希望这能让这个例子更清楚。

使用NSView的convertPoint:fromView:method,fromView为nil,将窗口坐标中的点转换为视图的坐标系

将鼠标点转换为视图的坐标系后,我将使用NSView的mouse:inRect:方法而不是NSPointInRect,因为前者也用于翻转坐标系


或者,您可以使用一个。

一些使用鼠标的代码:inRect:(推荐的方法;该方法用于翻转坐标)


这些答案都没有考虑到视图可能不是矩形。

这里有一个通用的方法,也适用于非矩形视图。考虑观察面或复杂的路径形状

这个代码片段将从globalPoint(也称为globalToLocal)中提供一个localPoint。(0,0窗口空间中的GlobalPoint)如果将参数更改为“toView”,则会得到一个“localToGlobal”点

如果该点是否在路径内,下面的代码将返回true或false

CGPathContainsPoint(someCGPath,nil,localPoint,true)

注意: aPoint是从hitTest中的参数派生的全局点,也可以从以下参数派生:

(self.window?.mouseLocationOutsideOfEventStream)!
注意: 也许有一种更正确的方法可以做到这一点。但是这是可行的,而且不关心翻转的视图。

NSView功能对我来说是可行的,无需担心任何问题

func isMouseInView(view: NSView) -> Bool? {
    if let window = view.window {
        return view.isMousePoint(window.mouseLocationOutsideOfEventStream, in: view.frame)
    }
    return nil
}

你能给我们一个原因吗?一般来说,这种技术不是一个好主意,但是如果不知道你在写什么,很难说。NSTrackingArea正是我想要的!非常感谢。我正在绑这个。。。但是convertPoint函数实际上要求NSPoint对象作为其第一个参数。我该给什么。请说明。我想补充一点,您应该为
NSView的鼠标:inRect:
中的
NSRect
参数传递
self.bounds
,发送
self.frame
将偏移坐标。NSEvent已经有一个[event locationInWindow]所以前3行是冗余的LocationInWindow可能大部分时间都能正常工作。但这是来自苹果的文档:“对于NSMouseMoved和其他可能的事件,接收器可以有一个nil窗口(即窗口返回nil)。在这种情况下,locationInWindow以屏幕坐标返回事件位置。”因此,似乎不依赖locationInWindow可能更稳健。如果您已经有一个事件,那么locationInWindow肯定是您要使用的调用。即使您还没有事件对象,我的答案中的方法也会起作用。即使使用上述方法,仍然存在陷阱。例如,我很难找到一个干净的解决方案来测试NSViews层次结构中的TextField。由于苹果在测试文本字段时改变了策略,所以你也必须采用。我已经找到了一种方法让它工作,而且它相当干净。然而,我可能会开始翻转和抵消层次结构中每个视图中的每个hitTestPoint,因为这似乎是苹果对其组件所做的。只需将它添加到我使用的每个视图类中包含的方法中即可。这是一篇非常“杂乱无章”的文章,但它可能会让您了解哪些内容不值得尝试。(这基本上都是我在hitTesting研究中的笔记)我已经开始了,在hitTesting方面有了一个干净的工作流程。
(self.window?.mouseLocationOutsideOfEventStream)!
func isMouseInView(view: NSView) -> Bool? {
    if let window = view.window {
        return view.isMousePoint(window.mouseLocationOutsideOfEventStream, in: view.frame)
    }
    return nil
}