2013-05-12 49 views
2

给定屏幕位置(例如,在拖动操作期间)如何查找位于应用程序中该位置的视图?如何从指定位置获取NSView

将坐标转换为窗口或源视图坐标很简单,但我无法找到任何例程以从给定位置获取视图。除了递归地枚举所有子视图/窗口还有其他解决方案吗?

请将这一点比NSView的hitTest:消息(这是一个很好的答案)更进一步。是否有一个通用的消息,无论嵌套的窗口层次结构如何(无需手动迭代所有窗口)在给定的位置获得最深的视图?

回答

2

您可以使用NSViewhitTest:方法:

返回视图层次 (包括自身)接收器的最远的后裔,它包含一个指定的点,或者零如果 点在于完全不在收件人。

[[window contentView] hitTest:aPoint] 

的aPoint有可能成为上海华盈的坐标系中:

参数
的aPoint
一个点,是 的坐标系中接收者的超级观点,而不是接收者本身。

+0

谢谢你。这解决了我眼前的问题,但儿童窗户和他们的意见呢?在NSWindow或应用程序级别没有任何内容可以返回这些信息,而无需我手动迭代所有窗口? – 2013-05-12 16:30:55

2

你想打电话给-[NSView hitTest:],它会返回包含有问题点的视图(如果有的话)。接收视图应该是您的根视图(例如NSWindowcontentView),并且该点应转换为该视图的superview的坐标。

1

首先你应该很少需要它。 “为用户交互寻找视图”的概念是响应者链。因此,如果子视图应对拖动操作作出响应,只需将该拖放功能拖放到该视图即可。

如果您只需要在该坐标视图上最深的命中,则可以使用-hitTestNSView)。进入你的根视图,你会发现父视图。如果你有重叠的意见,它变得更加复杂。请将这些信息添加到您的问题中。

+0

在我的情况下,这只是为了解决另一个问题(确定原始视图之外的拖动操作)。但它仍然是一项有趣的任务,即使不是经常需要。 – 2013-05-12 16:33:52

+0

响应者链是在原始视图外查找拖动目标的正确概念。请进一步了解响应者链。 “子窗口”是什么意思? – 2013-05-12 18:11:13

+1

@ AminNegm-Awad:任何窗口都可以有子窗口,这些窗口绑定到用户窗口拖动。 http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference。html#// apple_ref/occ/instm/NSWindow/addChildWindow:ordered:(这与“子视图”和“子图层”的概念是不同的;没有层次结构的窗口。) – 2013-05-12 19:03:08