2013-05-07 31 views
11

我試圖讓不同風格的文本輸入到UITextView中,有點像使用簡單屬性(如粗體或斜體)的文本編輯器。我明白通過使用textView的attributedText屬性我可以將屬性應用於特定範圍的文本。這很好,但我希望能夠將屬性文本鍵入textView中,該文本將被按鈕(例如粗體文字的輸入)切換。如何允許將NSAttributedString文本輸入到UITextView中?

這裏就是我認爲的迄今:

我用-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text UITextView的委託方法採取text參數,並通過與相同的文本創建NSAttributedString帶屬性的修改。然後創建一個NSMutableAttributedString,它是textView的屬性文本的副本。使用appendAttributedString附加這兩個,然後將textView的attributedText屬性設置爲生成的attributes字符串。

下面的代碼:

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 

    if (self.boldPressed) { 

     UIFont *boldFont = [UIFont boldSystemFontOfSize:self.textView.font.pointSize]; 
     NSDictionary *boldAttr = [NSDictionary dictionaryWithObject:boldFont forKey:NSFontAttributeName]; 
     NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]initWithString:text attributes:boldAttr]; 
     NSMutableAttributedString *textViewText = [[NSMutableAttributedString alloc]initWithAttributedString:textView.attributedText]; 
     [textViewText appendAttributedString:attributedText]; 
     textView.attributedText = textViewText; 

      return NO; 
     } 
    return YES;     
} 

擁有每鍵入字符好像有點多了一個簡單的動作時間重置textViews attributedText。不僅如此,但它不能正常工作。這裏是什麼樣子時,啓用了大膽的屬性,如:

attributedText issues

有兩個問題。最明顯的就是每一個新角色如何投入新的生產線。但奇怪的是,插入點總是在文本視圖中的文本的第一個索引處(只有當啓用粗體時,粗體字符才插入到新行中)。因此,如果您正在使用粗體打字,然後關閉粗體,請在所有現有文本前輸入簡歷。

我不知道爲什麼會發生這些錯誤。我也不認爲我的解決方案非常高效,但我想不出任何其他方式來實現它。

+1

這應該工作,我認爲它就像你會發現的一樣。你可以添加一些日誌消息?另外,爲什麼不總是寫屬性字符串 - 永遠不會返回YES。您可以擁有您維護的影子歸因字符串,並始終將其設置爲該委託方法,而不是混合常規字符串和特定字符串。如果失敗了,請上傳一個演示應用程序,只需編碼這個代碼,然後有人(像我)會看看它。我很喜歡99%確定你可以得到這個工作(但沒有完全做到這一點)。 – 2013-05-07 16:56:45

+0

原來,必須使用'typingAttributes'屬性,正如您在其他答案中所看到的。添加一些日誌消息最終產生更多的問題而不是答案,因爲所有附加到textView「屬性文本」的NSAttributedStrings總會進入一個新行。這導致我得出這樣的結論:'shouldChangeTextInRange'方法是不可行的因此setTypingAttributes屬性)。仍然不知道爲什麼,但設置'typingAttributes'似乎是一種更優雅的解決方案。 – Joe 2013-05-08 01:04:03

+0

哈 - 這就是爲什麼羅布納皮爾有70K點!很高興你找到了解決方案 - 我確信有一個! – 2013-05-08 02:12:31

回答

28

這是setTypingAttributes:的用途。無論用戶何時按下其中一個屬性按鈕,都將其設置爲屬性字典,並且新字符將提取請求的屬性。

+0

謝謝,不知道存在。當你不再想使用它時,你將如何移除該屬性?我嘗試將typingAttributes屬性設置爲空字典,但刪除了字體大小等所有其他屬性。該屬性不可變,所以我無法刪除添加的最後一個屬性。 – Joe 2013-05-07 20:16:50

+0

製作當前值的'mutableCopy'。修改它,並重新分配它。 – 2013-05-07 22:16:10

+0

啊,明白了。非常感激。 – Joe 2013-05-08 00:43:35

3

下面是示例代碼,這樣做,如果你正在尋找的例子

雨燕3.0

var attributes = textField.typingAttributes 
attributes["\(NSForegroundColorAttributeName)"] = UIColor.red 
textField.typingAttributes = attributes 

Objective-C的

NSMutableDictionary* attributes = [textField.typingAttributes mutableCopy]; 
attributes[NSForegroundColorAttributeName] = [UIColor redColor]; 
textField.typingAttributes = attributes; 
相關問題