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



我在我的app中有一个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!

我应该用什么来代替上面不推荐的代码?提前感谢!

代码中的这一行:

    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];

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

你必须做一个额外的步骤:以screenPoint为原点创建一个简单的矩形。然后使用新返回的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];
}
我希望我能帮到你!

简单地使用convert(_:from:)可能是不准确的,这可能发生在事件的窗口和视图的窗口不相同的时候。请在另一个问题中检查我的答案,以获得更健壮的方法。

https://stackoverflow.com/a/69784415/3164091

相关内容

  • 没有找到相关文章

最新更新