Подтвердить что ты не робот

Преобразование NSPoint из оконных координат для просмотра координат

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

NSEvent *anEvent = [aNotification object];
NSPoint aLocationInSelf = [self convertPoint: [anEvent locationInWindow] toView: self];

// Create callout view and display
NSRect aRect = NSMakeRect(aLocationInSelf.x, aLocationInSelf.y, 300, 200);
TimelineCallout *aCallout = [[TimelineCallout alloc] initWithFrame: aRect];
[self addSubview: aCallout];

В приведенном выше коде я делаю преобразование точки щелчка мыши, зарегистрированного событием, из координат окна для просмотра (временной шкалы).

Однако, когда я делаю это с помощью отладчика, преобразование не происходит, а locationInSelf показывает те же координаты, что и точка, которую я получаю от [anEvent locationInWindow]. В результате выноска рисуется в неправильном месте или вообще не отображается.

Я должен делать что-то не так, но я не могу понять, что...

4b9b3361

Ответ 1

Чтобы преобразовать из координат окна для просмотра координат, вы должны использовать:

NSPoint aLocationInSelf = [self convertPoint: [anEvent locationInWindow] fromView: nil];

Это преобразует из координат базы окна в координаты приемника, поскольку событие не происходит из определенного вида.

Для получения дополнительной информации см. documentation.

Более подробное объяснение:

Методы преобразования немного сложны для понимания. В основном два общих случая (другие - варианты):

  • Преобразование точки из одного представления в другое, когда они находятся в одном окне
  • Преобразование точки, выраженной в координате окна, в координаты представления

В первом случае у вас есть два вида (view1 и view2), расположенных в одном окне. Если вы хотите преобразовать точку из view2 в систему координат view1, код будет:

NSPoint pointInView1 = [view1 convertPoint:pointInView2 fromView:view2];

Для второго случая у вас есть точка, выраженная в координатах окна (из события). Поскольку точка выражается в координатах окна, вы не указываете вид "от", а код будет:

NSPoint pointInView1 = [view1 convertPoint:pointInWindow fromView:nil];

Это резервное поведение метода.