Преобразование NSPoint из оконных координат для просмотра координат - PullRequest
14 голосов
/ 06 ноября 2011

Мое приложение имеет настраиваемое представление, которое отображает временную шкалу событий. Это представление обернуто в 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]. В результате выноска выводится не в том месте или вообще не видна.

Должно быть, я что-то делаю не так, но не могу понять, что ...

1 Ответ

25 голосов
/ 06 ноября 2011

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

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

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

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

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

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

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

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

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

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

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

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

...