我有一个NSView的子类,它重新实现了许多鼠标事件功能。例如在mouseDown中从NSEvent获取点我使用:
NSEvent *theEvent; // <- argument to function
NSPoint p = [theEvent locationInWindow];
p = [self convertPoint:p fromView:nil];
然而,坐标似乎被翻转,(0,0)位于窗口的左下角?
编辑:我已经重写了isFlipped方法以返回TRUE,但它只影响了绘图。对不起,我不敢相信我忘了把它直接放了。
答案 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:
但是,我不确定你的问题是什么。你在寻找一种获得“翻转”坐标的方法吗?如果是这样,您可以继承NSView,重写用户空间中的点由坐标对(x,y)表示,其中x表示沿水平轴(左和右)的位置,y表示垂直轴(向上和向下)。用户坐标空间的原点是点(0,0)。原点位于页面的左下角,如图1-4所示。在Quartz的默认坐标系中,x轴从页面的左侧向右侧移动时增加。当y轴从页面的底部向顶部移动时,y轴的值会增加。
-(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;