翻转NSView鼠标坐标

时间:2011-09-29 14:50:58

标签: macos cocoa

我有一个NSView的子类,它重新实现了许多鼠标事件功能。例如在mouseDown中从NSEvent获取点我使用:

NSEvent *theEvent; // <- argument to function

NSPoint p = [theEvent locationInWindow];
p = [self convertPoint:p fromView:nil];

然而,坐标似乎被翻转,(0,0)位于窗口的左下角?

编辑:我已经重写了isFlipped方法以返回TRUE,但它只影响了绘图。对不起,我不敢相信我忘了把它直接放了。

4 个答案:

答案 0 :(得分:5)

翻转是什么意思? Mac使用LLO(左下角)坐标系统。

编辑我无法通过简单的项目重现这一点。我创建了一个这样实现的NSView

@implementation FlipView
- (BOOL)isFlipped {
  return YES;
}

- (void)mouseDown:(NSEvent *)theEvent {
  NSPoint p = [theEvent locationInWindow];
  p = [self convertPoint:p fromView:nil];
  NSLog(@"%@", NSStringFromPoint(p));
}
@end

我收到了我期望的坐标。删除isFlipped按预期切换了方向。你有一个简单的项目来证明你的问题吗?

答案 1 :(得分:2)

这不是“翻转”,必然,这就是Quartz的坐标方式。 An excerpt from the documentation on Quartz 2D:

  

用户空间中的点由坐标对(x,y)表示,其中x表示沿水平轴(左和右)的位置,y表示垂直轴(向上和向下)。用户坐标空间的原点是点(0,0)。原点位于页面的左下角,如图1-4所示。在Quartz的默认坐标系中,x轴从页面的左侧向右侧移动时增加。当y轴从页面的底部向顶部移动时,y轴的值会增加。

但是,我不确定你的问题是什么。你在寻找一种获得“翻转”坐标的方法吗?如果是这样,您可以继承NSView,重写-(BOOL)isFlipped方法以返回YES。

答案 2 :(得分:2)

我发现这很令人讨厌 - 直到有一天我才坐下来拒绝起床,直到我有一些完美无缺的东西。在这里......通过...来呼叫。

-(void) mouseDown:(NSEvent *)click{
  NSPoint mD = [NSScreen wtfIsTheMouse:click
                        relativeToView:self];
}

在NSScreen上调用一个类别....

@implementation NSScreen (FlippingOut)
+ (NSPoint)wtfIsTheMouse:(NSEvent*)anyEevent 
          relativeToView:(NSView *)view {
   NSScreen *now = [NSScreen currentScreenForMouseLocation];
    return [now flipPoint:[now convertToScreenFromLocalPoint:event.locationInWindow relativeToView:view]];
}
- (NSPoint)flipPoint:(NSPoint)aPoint {
         return (NSPoint) { aPoint.x, 
   self.frame.size.height - aPoint.y  };
}
- (NSPoint)convertToScreenFromLocalPoint:(NSPoint)point 
      relativeToView:(NSView *)view {
    NSPoint winP, scrnP, flipScrnP; 
    if(self) {
       winP = [view convertPoint:point toView:nil];
       scrnP = [[view window] convertBaseToScreen:winP];
       flipScrnP = [self flipPoint:scrnP];
       flipScrnP.y += [self frame].origin.y;
       return flipScrnP;
       }    return NSZeroPoint;
}
@end

希望这可以防止只有一个小的 freakout .. 某天,某天。对于孩子们,该死的。我求求你......给孩子们。

答案 3 :(得分:2)

此代码对我有用:

NSPoint location =  [self convertPoint:theEvent.locationInWindow fromView:nil];
location.y = self.frame.size.height - location.y;