2016-10-13 5 views
0

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

Я реализую функцию multi-touch для моего приложения osx.
Моя проблема:
мне нужно разрешить местоположение на экране, описываемую NSPoint в координатах экрана, на самом верху NSView объекта из моего приложения, который находится под это место (если таковые имеются).

Это немного похоже на HWND WindowFromPoint(Point) под Windows OS.Найти самый верхний объект NSView, расположенный под позицией NSPoint

несколько моментов, чтобы рассмотреть следующие вопросы:

  • Мое приложение управлять несколькими NSWindow с, где каждое окно содержит иерархию из нескольких NSView с,
  • NSView, что я заинтересован в это не обязательно приложение Key Window или Main Window, так как это может быть любой из моих других в настоящее время неактивных объектов NSView, которые находятся под этим расположением экрана,
  • Это возможно, что под конкретным NSPoint у меня будет больше одного NSWindow с и/или NSView с. В этом случае я WLL быть заинтересован только в самом верхнем наиболее NSView,
  • Вполне возможно, что NSView А на вершине NSView B, частично скрывая его, но NSPoint место присутствует только на B, который не является самое верхнее окно приложения (но только самое верхнее для этого местоположения). И здесь я буду заинтересован в B.

вещей, которые мне удалось TODO:

  • Enumerate NSApp для всех окон (NSApp.windows),
  • Перечислите NSWindow для своих взглядов (NSWindow.contentView.subviews) ,
  • Перечень NSView для подсетей (NSView.subviews)

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

Вещи, которые не работа для меня:

  • NSView.hitTest вернулся nil для действительных местах,
  • NSView.layer.zPosition alwyas равен нулю (0),
  • Порядок NSView.subviews списка также не reflacts текущий макет графического интерфейса пользователя,
  • Тестирование, если NSView Видимость также di d не помогает, поскольку возвращает true, если это окно скрыто другим окном.

Моя среда:
Mac, OSX El-Capitan, XCode-7, Cocoa, Objective-C

Спасибо за любую помощь!
Пазо

+0

К какому виду вы отправляете 'hitTest'? – Willeke

+0

Для каждого перечисляемого NSView. т. е. - все объекты NSView в моем приложении afaik. Все вернут 'nil' ... – PazO

+1

Вызов' hitTest: '' window.contentView' должен быть достаточным. Вы преобразуете координаты точки в окно? – Willeke

ответ

1

Нашел:

// 1. Get the Window-Number of the NSWindow object owning this point: 
NSInteger wndNumber = [NSWindow windowNumberAtPoint:(point) belowWindowWithWindowNumber:(0)]; 
// 2. Get the NSWindow object associated with this particular Window-Number: 
NSWindow* window  = [NSApp windowWithWindowNumber:(wndNumber)]; 
// 3. Convert NSPoint values from System-coordinates to NSWindow-coordinates (Thanks @Willeke for his comment) 
NSRect  rctScreen; 
    rctScreen.origin  = point; 
    rctScreen.size.height = rctScreen.size.width = 0; 
NSRect  rctWindow = [window convertRectFromScreen:rctScreen]; 
// 4. Now do the hitTest: 
NSView*  viewFound = [[window contentView] hitTest:rctWindow.origin]; 

Очевидно каждая строка должна быть проверена на nil, но я оставляю это для кода краткости.

Смежные вопросы