2013-05-12 47 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