我知道这个问题已经在这里以几种形式提出,但不幸的是,没有建议的解决方案适用于我。
我正在实施多点触控我的osx
应用的功能。
我的问题:
我需要在屏幕上解析一个位置,屏幕坐标中的NSPoint
,以及位于此位置(如果有)的应用程序的最顶层NSView
对象。
这是有点像HWND WindowFromPoint( Point)
操作系统下的Windows
。
几点需要考虑:
NSWindow
,其中每个窗口包含多个NSView
s的层次结构,NSView
不一定是应用Key Window
或Main 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。我的环境:
Mac
,OSX El-Capitan
,XCode-7
,Cocoa
,Objective-C
感谢您的帮助!
PazO
答案 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
进行测试,但为了简洁起见,我将其留下来。