我正在尝试让UITextView支持输入不同样式的文本,就像一个使用简单属性(如加粗或斜体)的文本编辑器。通过使用textView的attributedText
属性,我可以将属性应用于特定文本范围。虽然这很好,但我希望能够在textView中键入带有属性的文本,并通过按钮(例如键入粗体文本)切换。
到目前为止,我想到了以下方法:
我使用了-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
UITextView委托方法来获取text
参数,并创建一份具有相同文本的NSAttributedString来修改它的属性。然后创建一个NSMutableAttributedString,它是textView的attributedText的副本。使用appendAttributedString
将两者连接起来,然后将textView的attributedText
属性设置为结果attributedString。
这是代码:
-(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,这似乎对于一个简单的操作来说有些过度了。而且它也不能正常工作。当启用粗体属性时,它看起来像这样:
这里有两个问题。最明显的问题是每个新字符都放在新行上。但更奇怪的是插入点总是在textview文本的第一个索引处(仅当启用粗体时,然后粗体字符就会插入到新行中)。因此,如果您使用粗体键入,然后关闭粗体,键入将在所有现有文本之前恢复。
我不确定为什么会出现这些错误。我也不认为我的解决方案很有效,但我想不出其他实现方法。
typingAttributes
属性,正如您在其他答案中所看到的那样。添加一些日志消息最终引起了更多问题而不是答案,因为所有附加到textView的attributedText
的NSAttributedStrings都将始终进入新行...这导致我得出结论,在shouldChangeTextInRange
方法中无法实现它(因此设置setTypingAttributes属性)。仍然不确定原因,但设置typingAttributes
似乎是一个更优雅的解决方案。 - Joe