在iOS 6中带格式的输入UITextView

3

好的,这似乎很荒谬,它不能实现 - 您可以设置预定义的属性字符串以显示具有格式的文本视图,但您无法设置通用格式以应用于在 UITextView 上进行的实时输入。

例如,如果我在文本视图中输入任何内容之前执行此操作:

NSString *string = @"Hello world";
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.minimumLineHeight = 50.f;
NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc] initWithString:string];
[aStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0,[string length])];
mainTextView.attributedText = aStr;

然后就会出现格式化的显示,当我用键盘编辑文本时,格式化仍然存在。
但是,如果我想从一个空白的UITextView开始,并对用户输入到视图中的任何内容应用格式怎么办?
我尝试设置string = @""string = @" ",但这两者都不能保留格式。难道没有办法应用格式来处理用户的输入吗?那么UITextView具有属性字符串属性的意义是什么?
根据文档,设置UITextViewtext属性会完全清除属性字符串所做的任何格式化操作。因此,无论解决方案是什么,它都不能直接设置textView.text属性,而只能调整attributedText属性。
3个回答

7
如果我理解问题正确的话,UITextViewtypingAttributes属性就是用来做这个的。也就是说,你需要做类似于这样的操作:
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.minimumLineHeight = 50.f;
mainTextView.typingAttributes = [NSDictionary dictionaryWithObject:paragraphStyle forKey:NSParagraphStyleAttributeName];

哇,这么简单?我费了好大劲创建了一个新字体来调整行间距。:( - Snowman
1
这对我没有任何作用。除了这段代码之外,我可能错过了什么明显的东西吗? - Declan McKenna
@Deco:有点晚了,但以防其他人遇到这个问题:通过编程设置attributedText会重置typingAttributes。请最后设置typingAttributes - Ricardo Sanchez-Saez

3
你的问题的关键在于这个代理方法:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

您可以将其用作私有字符串或属性字符串。当调用此方法时,您将看到应放置新字符的位置以及可能替换其他字符的建议。通过使用您的私有字符串或textView.text的副本并进行修改,您可以获得完整的字符串。

您可以创建一个新的属性字符串或修改现有的属性字符串,并将其设置在textView上:

textView.attributedString = myNewString;

如果不能改变旧字符串,请返回NO。由于NSString已提供了让您将指定范围内的字符更改为其他字符的方法,因此修改旧字符串很容易。


实际上,有一个问题...如果我使用自定义键盘并通过UIKeyInput的insertText或UITextInput的replaceRange:withText:操作文本,它将不再调用我的textView委托,因此文本不会被格式化。您对此有什么想法吗? - Marplesoft
我没有做过这样的经验,但建议考虑子类化UITextView,然后在文本更改后进行委托调用。使用一个ivar标志来抑制那些回调调用自身。 - David H

0
你应该尝试使用 UITextView 的委托方法来得知用户何时输入文本,然后在这个方法中更改文本属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接