2009-11-22 71 views

回答

6

對於NSTextField,請注意,它是執行繪製的NSTextFieldCell。你會想重寫-drawInteriorWithFrame:inView:並且自己做字符串繪製。面臨的挑戰將是找到你的子串被繪製的矩形(如果範圍被包裝,則有多個)。你最終不得不使用NSLayoutManager和一個NSTextStorage容器。

最好使用NSTextView。關聯的NSLayoutManager和NSTextStorage組件已經預先組裝好了,您可以免費獲得許多其他功能。最重要的是,有一個方便的方法 - [NSTextView drawViewBackgroundInRect:]方法,因此您不必子類化任何東西。你只需要問文本視圖的佈局管理器和文本存儲,然後問它給定範圍的矩形。有關更多詳細信息,請參閱Text System Overview和鏈接的文檔。

要有效查找有趣的子字符串,可以使用custom attributes(或內置的字符,例如NSLinkAttributeName)作爲您感興趣的範圍。

+0

如果你想圍繞文本系統進行打包,你可能會比開始使用Aaron Hillegass的這段視頻談論它更糟糕:http://vimeo.com/4793853 – 2009-11-22 13:36:56

+0

一個簡單的代碼示例會很棒! :) – papr 2009-11-23 20:48:57

+0

它會的,不是嗎? :-)不幸的是,這不是可以減少到StackOverflow友好長度的東西。有一些例子可以漂浮 - 嘗試cocoadev.com和通常的友好搜索引擎。關鍵字提示:NSLayoutManager,字形範圍,nstextview drawBackgroundInRect:... – 2009-11-23 22:29:13

0

另一種考慮是可編輯的WebView,您可以在其中使用CSS構建自定義屬性。

+1

這確實需要找到給定的範圍和自定義繪圖的rects,但它對我來說似乎有點沉重。如果使用自定義屬性,則還需要花費更多的精力將屬性(本例中爲標記)分配到所需的範圍。根據OP的目標,「最好的」可能無論如何,但兩邊都有很多缺點。 – 2009-11-22 14:45:55

+0

(超出房間範圍。)爲自定義屬性指定跨度相對比較容易,但是多種類型的自定義屬性現在需要區分跨度類等。這是一個額外的層。此外,它需要更多的努力(IMO)在文檔中定位和操作這個標記,而不是Cocoa文本系統。 – 2009-11-22 14:48:21