Перевернутые координаты мыши NSView - PullRequest
4 голосов
/ 29 сентября 2011

У меня есть подкласс NSView, который повторно реализует ряд функций событий мыши. Например, в mouseDown, чтобы получить точку от NSEvent, который я использую:

NSEvent *theEvent; // <- argument to function

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

Однако координаты, кажется, перевернуты, (0, 0) в левом нижнем углу окна?

EDIT: я уже переопределил метод isFlipped для возврата TRUE, но он затронул только рисование. Извините, не могу поверить, что я забыл сразу это написать.

Ответы [ 4 ]

5 голосов
/ 29 сентября 2011

Что вы имеете в виду под щелчком? 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 переключило ориентацию, как и ожидалось. У вас есть простой проект, который демонстрирует вашу проблему?

2 голосов
/ 19 октября 2012

Этот код работал для меня:

NSPoint location =  [self convertPoint:theEvent.locationInWindow fromView:nil];
location.y = self.frame.size.height - location.y;
2 голосов
/ 17 сентября 2012

Я находил это настолько неприятным - пока однажды я просто не сел и не отказался вставать, пока у меня не было чего-то, что отлично работало. Вот это .. называется через ...

-(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 .. где-нибудь, когда-нибудь . Для детей, блин. Прошу тебя .. для детей.

2 голосов
/ 29 сентября 2011

Это не «перевернутый», обязательно, это просто, как Кварц делает координаты. Выдержка из документации по Quartz 2D:

Точка в пространстве пользователя представлена ​​парой координат (x, y), где x представляет местоположение вдоль горизонтальной оси(слева и справа), а y представляет вертикальную ось (вверх и вниз).Источником пользовательского координатного пространства является точка (0,0).Источник находится в нижнем левом углу страницы, как показано на рисунке 1-4.В системе координат по умолчанию для Кварца ось x увеличивается при перемещении слева направо на страницу.Значение оси Y увеличивается по мере того, как она перемещается снизу вверх, вверх страницы.

Я не уверен, однако, что у вас за вопрос.Вы ищете способ получить "перевернутые" координаты?Если это так, вы можете создать подкласс NSView, переопределив метод -(BOOL)isFlipped для возврата YES.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...