Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Macos 正确的方法是什么来计算鼠标被点击的角度_Macos_Nsview_Nspoint - Fatal编程技术网

Macos 正确的方法是什么来计算鼠标被点击的角度

Macos 正确的方法是什么来计算鼠标被点击的角度,macos,nsview,nspoint,Macos,Nsview,Nspoint,我的应用程序中有一个自定义的NSView子类。 我想知道视图中的确切点,相对于它的原点,那是用鼠标点击的。(即,不是相对于窗原点,而是相对于自定义视图原点) 我一直在使用这个,它非常有效: -(void)mouseDown:(NSEvent *)theEvent { NSPoint screenPoint = [NSEvent mouseLocation]; NSPoint windowPoint = [[self window] convertScreenToBase:scre

我的应用程序中有一个自定义的NSView子类。 我想知道视图中的确切点,相对于它的原点,那是用鼠标点击的。(即,不是相对于窗原点,而是相对于自定义视图原点)

我一直在使用这个,它非常有效:

-(void)mouseDown:(NSEvent *)theEvent
{
    NSPoint screenPoint = [NSEvent mouseLocation];
    NSPoint windowPoint = [[self window] convertScreenToBase:screenPoint];
    NSPoint point = [self convertPoint:windowPoint fromView:nil];

    _pointInView = point;

    [self setNeedsDisplay:YES];
}
但现在我得到一个警告,convertScreenToBase已被弃用,请改用convertRectFromScreen。然而,我不能从convertRectFromScreen得到相同的结果,而且无论如何,我感兴趣的是一个点,而不是一个rect

我应该用什么来正确替换上面不推荐使用的代码?
提前谢谢

我制作了一个带有窗口的示例项目,并测试了“旧”和“新”场景。两种情况下的结果是相同的

您还需要做一个额外的步骤:创建一个以screenPoint为原点的简单rect。然后使用新返回的rect的原点

以下是新代码:

-(void)mouseDown:(NSEvent *)theEvent
{
    NSPoint screenPoint = [NSEvent mouseLocation];
    NSRect rect = [[self window] convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 0, 0)];

    NSPoint windowPoint = rect.origin;
    NSPoint point = [self convertPoint:windowPoint fromView:nil];

    _pointInView = point;

    [self setNeedsDisplay:YES];
}

我希望我能帮助你

代码中的这一行:

    NSPoint screenPoint = [NSEvent mouseLocation];
获取与事件流不同步的鼠标光标位置。这不是你目前正在处理的事件的位置,这在过去是很短的时间;这是光标现在的位置,这意味着你可能跳过了一些重要的东西。您几乎应该始终使用与事件流同步的位置

为此,请使用方法接收的
theEvent
参数
NSEvent
有一个
locationInWindow
属性,该属性已转换为接收它的窗口的坐标。这样就无需对其进行转换

    NSPoint windowPoint = [theEvent locationInWindow];    
将窗口位置转换为视图坐标系的代码很好。

我找到了解决方案:

NSPoint screenPoint = [NSEvent mouseLocation];
NSRect screenRect = CGRectMake(screenPoint.x, screenPoint.y, 1.0, 1.0);
NSRect baseRect = [self.window convertRectFromScreen:screenRect];
_pointInView = [self convertPoint:baseRect.origin fromView:nil];

嗯,你的代码和我的代码给出了完全不同的结果!另外,[rect origin]应该是rect.origin,因为NSRect不是一个类。你使用rect.origin是对的,这是我的错。。我再看看!风景在哪里?它可能在翻转的坐标系中谢谢!视图位于父窗口底部上方一段距离处,左侧一段距离处。它因自动布局和约束而变化。它没有翻转。(原点=左下角)与Max的答案唯一的实际区别似乎是使用1.0而不是0表示矩形大小。