我試圖讓不同風格的文本輸入到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。不僅如此,但它不能正常工作。這裏是什麼樣子時,啓用了大膽的屬性,如:
有兩個問題。最明顯的就是每一個新角色如何投入新的生產線。但奇怪的是,插入點總是在文本視圖中的文本的第一個索引處(只有當啓用粗體時,粗體字符才插入到新行中)。因此,如果您正在使用粗體打字,然後關閉粗體,請在所有現有文本前輸入簡歷。
我不知道爲什麼會發生這些錯誤。我也不認爲我的解決方案非常高效,但我想不出任何其他方式來實現它。
這應該工作,我認爲它就像你會發現的一樣。你可以添加一些日誌消息?另外,爲什麼不總是寫屬性字符串 - 永遠不會返回YES。您可以擁有您維護的影子歸因字符串,並始終將其設置爲該委託方法,而不是混合常規字符串和特定字符串。如果失敗了,請上傳一個演示應用程序,只需編碼這個代碼,然後有人(像我)會看看它。我很喜歡99%確定你可以得到這個工作(但沒有完全做到這一點)。 – 2013-05-07 16:56:45
原來,必須使用'typingAttributes'屬性,正如您在其他答案中所看到的。添加一些日誌消息最終產生更多的問題而不是答案,因爲所有附加到textView「屬性文本」的NSAttributedStrings總會進入一個新行。這導致我得出這樣的結論:'shouldChangeTextInRange'方法是不可行的因此setTypingAttributes屬性)。仍然不知道爲什麼,但設置'typingAttributes'似乎是一種更優雅的解決方案。 – Joe 2013-05-08 01:04:03
哈 - 這就是爲什麼羅布納皮爾有70K點!很高興你找到了解決方案 - 我確信有一個! – 2013-05-08 02:12:31