【问题标题】:Converting an NSPoint from window coordinates to view coordinates将 NSPoint 从窗口坐标转换为视图坐标
【发布时间】:2023-03-21 20:49:02
【问题描述】:

我的应用程序有一个显示事件时间线的自定义视图。此视图包含在 NSScrollView 中,以支持时间线的水平滚动。使用通知,我实现了一种机制,该机制应该显示另一个自定义视图,当用户在时间轴中单击该事件时,该视图会显示有关该事件的详细信息。以下是时间线收到事件时处理事件的代码:

NSEvent *anEvent = [aNotification object];
NSPoint aLocationInSelf = [self convertPoint: [anEvent locationInWindow] toView: self];

// Create callout view and display
NSRect aRect = NSMakeRect(aLocationInSelf.x, aLocationInSelf.y, 300, 200);
TimelineCallout *aCallout = [[TimelineCallout alloc] initWithFrame: aRect];
[self addSubview: aCallout];

在上面的代码中,我将事件注册的鼠标点击点从窗口坐标转换为视图(时间线)坐标。

但是,当我使用调试器单步执行此操作时,没有进行任何转换,locationInSelf 显示的坐标与我从[anEvent locationInWindow] 得到的点相同。结果,标注被绘制在错误的位置或根本不可见。

我一定是做错了什么,但我不知道是什么……

【问题讨论】:

标签: cocoa nsview nswindow


【解决方案1】:

为了从窗口坐标转换为视图坐标,你必须使用:

NSPoint aLocationInSelf = [self convertPoint: [anEvent locationInWindow] fromView: nil];

这将从窗口基础坐标转换为接收器坐标,因为事件并非源自特定视图。

有关详细信息,请参阅documentation

更详细的解释

转换方法有点难以理解。主要有两种一般情况(其他都是变种):

  1. 将位于同一窗口中的点从一个视图转换为另一个视图
  2. 将以窗口坐标表示的点转换为视图坐标

对于第一种情况,您有两个视图(view1 和 view2)位于同一个窗口中。如果要将 view2 中的点转换为 view1 的坐标系,代码如下:

NSPoint pointInView1 = [view1 convertPoint:pointInView2 fromView:view2];

对于第二种情况,您有一个以窗口坐标表示的点(来自事件)。由于该点以窗口坐标表示,因此您无需指定“从”视图,代码将为:

NSPoint pointInView1 = [view1 convertPoint:pointInWindow fromView:nil];

这是方法的后备行为。

【讨论】:

  • 它有效,但我不明白您所说的“源自特定视图”是什么意思。该事件源自时间线视图,我的推理/理解是所有鼠标事件位置都位于窗口坐标系中,该窗口内的所有视图都可以访问该坐标系。因此,任何感兴趣的视图都可以将该点转换为他们自己的坐标系,因此选择我的代码和混淆...... :-)
猜你喜欢
  • 2011-04-30
  • 1970-01-01
  • 2013-03-02
  • 2012-06-06
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多