开发者

Flipped NSView mouse coordinates

I have a subclass of NSView that re-implements a number of the mouse event functions. For instance in mouseDown to get the point from the NSEvent I use:

NSEvent *theEvent; // <- argument to function

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

However the coordinates seem to be f开发者_开发知识库lipped, (0, 0) is in the bottom left of the window?

EDIT: I have already overridden the isFlipped method to return TRUE, but it has only affected drawing. Sorry, can't believe I forgot to put that straight away.


What do you mean by flipped? Mac uses a LLO (lower-left-origin) coordinate system for everything.

EDIT I can't reproduce this with a simple project. I created a single NSView implemented like this:

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

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

I received the coordinates I would expect. Removing the isFlipped switched the orientation as expected. Do you have a simple project that demonstrates your problmem?


I found this so obnoxious - until one day I just sat down and refused to get up until I had something that worked perfectly . Here it is.. called via...

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

invokes a Category on 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

Hope this can prevent just one minor freakout.. somewhere, someday. For the children, damnit. I beg of you.. for the children.


This code worked for me:

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


This isn't "flipped", necessarily, that's just how Quartz does coordinates. An excerpt from the documentation on Quartz 2D:

A point in user space is represented by a coordinate pair (x,y), where x represents the location along the horizontal axis (left and right) and y represents the vertical axis (up and down). The origin of the user coordinate space is the point (0,0). The origin is located at the lower-left corner of the page, as shown in Figure 1-4. In the default coordinate system for Quartz, the x-axis increases as it moves from the left toward the right of the page. The y-axis increases in value as it moves from the bottom toward the top of the page.

I'm not sure what your question is, though. Are you looking for a way to get the "flipped" coordinates? If so, you can subclass your NSView, overriding the -(BOOL)isFlipped method to return YES.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜