我的应用程序有一个自定义视图,显示事件的时间线。该视图包含在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]
。结果,标注绘制在错误的位置或根本不可见。
我一定做错了什么,但我不知道是什么......
为了从窗口坐标转换为视图坐标,您必须使用:
NSPoint aLocationInSelf = [self convertPoint: [anEvent locationInWindow] fromView: nil];
由于事件不是源自特定视图,因此这将从窗口基坐标转换为接收器坐标。
欲了解更多信息,请参阅文档 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html.
更详细的解释:
转换方法有点难以理解。一般情况主要有两种(其他都是变种):
- 当点位于同一窗口中时,将点从一个视图转换为另一个视图
- 将窗口坐标表示的点转换为视图坐标
对于第一种情况,同一窗口中有两个视图(view1 和 view2)。如果要将 view2 中的点转换为 view1 的坐标系,代码将是:
NSPoint pointInView1 = [view1 convertPoint:pointInView2 fromView:view2];
对于第二种情况,您有一个以窗口坐标表示的点(来自事件)。由于该点以窗口坐标表示,因此您无需指定“来自”视图,代码将是:
NSPoint pointInView1 = [view1 convertPoint:pointInWindow fromView:nil];
这是该方法的后备行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)