如何从给定位置获取NSView

时间:2013-05-12 16:18:18

标签: objective-c cocoa

给定屏幕位置(例如在拖动操作期间),我如何找到应用程序中该位置的视图?

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

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

3 个答案:

答案 0 :(得分:2)

您可以使用NSView的{​​{1}}方法:

  

返回视图层次结构中接收器的最远后代   (包括其本身)包含指定的点,如果是,则为nil   点完全在接收器之外。

hitTest:

但是 aPoint 必须在superview的坐标系中:

  

<强>参数
  的aPoint
  坐标系中的一个点   接收者的超级视图,而不是接收者本身。

答案 1 :(得分:2)

您需要致电-[NSView hitTest:],它会返回包含相关点的视图(如果有)。接收视图应该是您的根视图(例如NSWindow的{​​{1}}),并且该点应转换为该视图的contentView坐标。

答案 2 :(得分:1)

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

如果您只需要对该坐标的视图进行最深限度的点击,则可以使用-hitTestNSView)。转到您的根视图,您将找到父视图。如果您有重叠的视图,它会变得更加复杂。请将该信息添加到您的问题中。