找到位于NSPoint位置

时间:2016-10-13 17:43:42

标签: objective-c macos cocoa xcode7 osx-elcapitan

我知道这个问题已经在这里以几种形式提出,但不幸的是,没有建议的解决方案适用于我。

我正在实施多点触控我的osx应用的功能。
我的问题:
我需要在屏幕上解析一个位置,屏幕坐标中的NSPoint,以及位于此位置(如果有)的应用程序的最顶层NSView对象

这是有点像HWND WindowFromPoint( Point)操作系统下的Windows

几点需要考虑:

  • 我的应用程序管理多个NSWindow,其中每个窗口包含多个NSView s的层次结构,
  • 我感兴趣的NSView不一定是应用Key WindowMain Window,因为它可以是我当前其他任何非活跃的NSView对象碰巧在这个屏幕位置下,
  • 在特定NSPoint下,我可能会有多个NSWindow和/或NSView s。在这种情况下,我只会对最顶级的NSView
  • 感兴趣
  • NSView A可能位于NSView B的顶部,部分隐藏它,但NSPoint位置仅出现在B上,这不是最顶级的应用程序的窗口(但只有这个位置的最顶层)。我再次对B感兴趣。

我管理过的东西:

  • 枚举NSApp所有窗口(NSApp.windows),
  • 枚举NSWindow查看其视图(NSWindow.contentView.subviews),
  • 枚举NSView的子视图(NSView.subviews

这样做我设法枚举了我的应用程序的所有NSView,但我仍然需要过滤掉不可见的不相关的NSView

没有为我工作的事情:

  • NSView.hitTest返回nil表示有效位置
  • NSView.layer.zPosition alwyas为零(0),
  • NSView.subviews列表的顺序也不会反映当前的GUI布局,
  • 测试NSView是否可见也没有帮助,因为如果此窗口被其他窗口隐藏,它也会返回true。

我的环境:
MacOSX El-CapitanXCode-7CocoaObjective-C

感谢您的帮助!
PazO

1 个答案:

答案 0 :(得分:2)

找到它:

// 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进行测试,但为了简洁起见,我将其留下来。