2012-01-25 71 views
7

我正在尋找一種可靠的技術在NSTextView中做簡單的字符串格式(粗體,斜體,...)。文本解析幾乎用正則表達式完成,但現在我需要應用字體特徵並改變大小。技術如何格式化/顏色NSTextView的字符串

我如何大膽

[[textView textStorage] beginEditing]; 
[[textView textStorage] applyFontTraits:NSFontBoldTrait range:range]; 
[[textView textStorage] endEditing]; 

這也是大小變化的文字與

[[textView textStorage] beginEditing]; 
NSFont* font = [[textView textStorage] attribute:NSFontAttributeName atIndex:range.location effectiveRange:nil]; 

NSFont* newFont = [NSFont fontWithName:[font familyName] 
            size:[font pointSize] + size]; 

[[textView textStorage] addAttribute:NSFontAttributeName 
           value:newFont 
           range:range]; 
[[textView textStorage] endEditing]; 

正常工作的一些代碼片斷。我現在唯一的問題是,在某些情況下,當我鍵入新字符時,默認情況下這些字符是粗體或斜體,即使我沒有將屬性應用於它們。

是否必須重置NSTextViewsetTypingAttributes或我是否錯過了這裏的內容?

+0

我需要做類似的事情。你介意說你在哪裏調用格式化代碼?就我而言,我有一個使用綁定的文本視圖,所以可以通過編輯或通過底層控制器完成的更改來修改它。 – paulmelnikow

回答

2

我認爲你是正確的方法來設置typingAttributesReference for -setTypingAttributes: says

但是,如果您添加任何更改文本屬性的用戶操作,操作應該使用此方法以後應用這些屬性。更改屬性的用戶操作應始終設置鍵入屬性,因爲在下次鍵入之前,選擇中可能沒有後續更改。

這似乎適用於你的情況。

我不知道所描述的行爲是否只適用於所見即所得的編輯器,如TextEdit。您似乎在處理與語法突出顯示的編輯器類似的行爲。你從來沒有真的想要手動改變文本屬性,而是從語法結構。它可能不適合這種情況,你應該重置typingAttributes或根據解析設置它。

+0

由於效果不能在我身邊重現,我認爲重新設置'typingAttributes'就是要走的路。我會回到這個答案,並且在我可以驗證時將其標記爲正確。 – brutella

+0

我剛剛嘗試過,它適用於我。我使用'NSTextViewDelegate'中的'textViewDidChangeSelection:'方法來掛接並調用'setTypingAttributes:'。告訴我,如果它不起作用,那麼我會在某個地方發佈示例項目。 – febeling

+0

這裏有一個例子的要點:git://gist.github.com/1816087.git鍵入test,使用按鈕使其變爲粗體,將光標置於一個寒冷的範圍內,鍵入,並且它是普通的字體重量。 – febeling