2015-05-28 3 views
2

У меня есть пользовательский подкласс NSView в моем приложении. Хотелось бы узнать точную точку зрения относительно ее происхождения, щелкнув мышью. (т. е. не относительно начала окна, но относительно происхождения пользовательского вида).Каков правильный способ расчета точки зрения, что мышь была нажата

Я всегда использовал это, который работал отлично:

-(void)mouseDown:(NSEvent *)theEvent 
{ 
    NSPoint screenPoint = [NSEvent mouseLocation]; 
    NSPoint windowPoint = [[self window] convertScreenToBase:screenPoint]; 
    NSPoint point = [self convertPoint:windowPoint fromView:nil]; 

    _pointInView = point; 

    [self setNeedsDisplay:YES]; 
} 

Но теперь я получаю предупреждение, что convertScreenToBase устарела и использовать convertRectFromScreen вместо. Однако я не могу получить те же результаты от convertRectFromScreen, и во всяком случае, меня интересует точка, а не прямой!

Что следует использовать в качестве правильной замены устаревшего кода выше? Спасибо заранее!

ответ

1

Я нашел решение:

NSPoint screenPoint = [NSEvent mouseLocation]; 
NSRect screenRect = CGRectMake(screenPoint.x, screenPoint.y, 1.0, 1.0); 
NSRect baseRect = [self.window convertRectFromScreen:screenRect]; 
_pointInView = [self convertPoint:baseRect.origin fromView:nil]; 
+0

Единственное реальное отличие от ответа Макса, по-видимому, заключается в использовании 1.0 вместо 0 для прямого размера. – Kenny

2

Я сделал образец проекта с окном и протестировал «старый» и новый сценарий. В обоих случаях результат тот же.

Вы должны сделать еще один шаг: создать простой прямоугольник с экраном в качестве источника. Затем используйте начало нового, возвращенного прямоугольника.

Вот новый код:

-(void)mouseDown:(NSEvent *)theEvent 
{ 
    NSPoint screenPoint = [NSEvent mouseLocation]; 
    NSRect rect = [[self window] convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 0, 0)]; 

    NSPoint windowPoint = rect.origin; 
    NSPoint point = [self convertPoint:windowPoint fromView:nil]; 

    _pointInView = point; 

    [self setNeedsDisplay:YES]; 
} 

Я надеюсь, что я был в состоянии помочь вам!

+0

Хммм. Ваш код и мой код дают совершенно разные результаты! Также [rect origin] должно быть rect.origin, поскольку NSRect не является классом. – Kenny

+0

Вы правы с rect.origin, это была моя ошибка. Я еще раз посмотрю на это! – mangerlahn

+0

Где находится вид? Это может быть в перевернутой системе координат – mangerlahn

4

Эта строка из кода:

NSPoint screenPoint = [NSEvent mouseLocation]; 

получает местоположение курсора мыши из синхронизации с потоком событий. Это не позиция события, которое вы сейчас обрабатываете, что было непродолжительным в прошлом; это позиция курсора прямо сейчас, что означает, что вы потенциально пропускаете некоторые важные вещи. Вы должны почти всегда использовать позицию в синхронизации с потоком событий.

Для этого используйте параметр theEvent, который получает ваш метод. NSEvent имеет свойство locationInWindow, которое уже переведено в координаты окна, которое его получает. Это избавляет вас от необходимости конвертировать его.

NSPoint windowPoint = [theEvent locationInWindow];  

Ваш код для преобразования местоположения окна в систему координат вида в порядке.