2010-10-28 22 views
1

我有一個NSTextViewNSScrollView,並且我編程插入NSView子類作爲NSTextView的子視圖。這NSView充當疊加層,疊加關於其下的文本的圖形信息。NSTextView疊加造成第一響應者狀態的怪異

我認爲它工作得很好,直到我注意到文本視圖不響應右鍵單擊。其他操作(編輯,選擇)似乎工作得很好。另外,如果第一響應者被更改爲滾動視圖的同級(例如大綱視圖),則文本視圖不會從點擊它的狀態中重新獲得第一響應者狀態。選擇將響應點擊而改變,但選擇高亮顯示爲灰色而不是藍色(表示文本視圖不是第一響應者)。

如果我偏移了疊加子視圖的框架,文本視圖在未與疊加層重疊的區域中表現爲100%,但重疊區域的行爲不正確,如上所述。

步驟要複製在Mac OS X 10.6.4此行爲:

  1. 創建一個普通的老式非基於文檔Cocoa程序。
  2. 將「NSTextView」IBOutlet添加到應用程序委託.h。
  3. 在MainMenu.xib的窗口中添加一個NSTextView。連接textView插座。
  4. 鍵入一些代碼:

applicationDidFinishLaunching:

NSView *overlay = [[NSView alloc] initWithFrame:textView.bounds]; 
[textView addSubview:overlay]; 
[overlay release]; 

運行應用程序時,觀察到在文本區域點擊右鍵不起作用,因爲它應該,但你仍然可以以其他方式進行交互與文本視圖。

接下來,將NSOutlineView添加到xib中的窗口。觀察到一旦焦點離開文本區域(如果您點擊大綱視圖)並且疊加就位,則無法將焦點設置迴文本視圖(它不會再次成爲第一響應者)。


有一些辦法可以使NSTextView接收所有的事件,儘管我NSView覆蓋不接受第一個響應或鼠標事件?我懷疑這可能與字段編輯器有關 - 也許它忽略了它認爲註定要覆蓋視圖的事件?

+0

需要更多上下文(可能是代碼)。 – 2010-10-28 19:26:09

+0

你能更詳細地描述你認爲缺少的東西嗎? – 2010-10-28 19:50:33

+0

原來,在從頭構建的應用程序中複製它非常簡單。我已經添加了重現步驟。 – 2010-10-28 20:23:13

回答

1

您可能需要將您的覆蓋圖作爲自定義視圖類的實例,將所有事件和輔助功能消息轉發到文本視圖。您可能還需要將任何視圖相對座標轉換爲文本視圖的座標系。

0

我對它沒有太多的經驗,但另一種可能性是使用Core Animation層作爲覆蓋層。

+0

欣賞這個建議,但是我對響應鼠標事件特別感興趣,並且不希望重新發明輪子以將它們映射到子層等。 – 2010-10-29 03:13:31

1

一個乾淨的方式來處理,這是通過使您的疊加觀看的NSView的自定義子類,然後重寫則hitTest:方法總是返回。這將阻止重疊視圖參與響應者鏈。相反,事件會自動發送到它的超級視圖或視圖層次結構的更高層。您可能還想覆蓋accepFirstResponder返回是安全的(以防萬一它被意外設置爲編程)。

相關問題