如何从textView的attributedText中删除NSParagraphStyle属性?

时间:2013-05-23 20:06:22

标签: ios uitextview nsattributedstring

我正在尝试允许textView通过自定义按钮允许子弹点,方法是插入NSAttributedString @"\u2022"(子弹点的unicode),其NSParagraphStyle属性为headIndent设置设置为某个点长度以创建缩进。

问题是这样的:一旦我将该属性项目追加到UITextView的attributedString属性,该属性就会对所有未来打字的文本生效。这意味着如果你去一个新的行(无论是通过按Enter还是只键入足以击中textView的水平边界),它将始终缩进。我将属性分配给仅包含项目符号点的attributionString,因此我不知道为什么它对所有其他键入的文本生效。

我无法想到删除属性的任何方法,因为它似乎不再被分配到某个范围,因为它会影响所有未来的文本。我知道删除属性的唯一方法是它是否具有指定范围,removeAttribute:range:

另一个注意事项:UITextView的typingAttributes属性中不存在该属性。

以下是代码:

NSMutableAttributedString *bulletString = [[NSMutableAttributedString alloc]initWithString:@"\u2022"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc]init];
[style setFirstLineHeadIndent:25.0];
[bulletString addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0.0, [bulletString.string length])];

NSMutableAttributedString *textViewText = [[NSMutableAttributedString alloc]initWithAttributedString:self.textView.attributedText];
[textViewText appendAttributedString:bulletString];
 self.textView.attributedText = textViewText;

摘要:NSAttributedString,其中NSParagraphStyle属性附加到textView的文本中。属性会影响所有未来的文本类型,尽管在创建时将其分配到特定范围。

1 个答案:

答案 0 :(得分:2)

首先,段落样式适用于段落。段落由换行符之间的所有字符(或字符串的开头或结尾)组成。段落样式由段落的第一个字符的有效样式定义。所以在本文中:

A bcdef
G hijkl

仅适用于AG的有效段落样式。其余的都无关紧要。

其次,当您将字符插入或附加到属性字符串时,新文本将采用周围文本的属性。具体来说,在您的情况下,当用户追加到属性字符串时,最后一个字符的有效属性将应用于附加字符。

因此,您追加@"\u2022"并为其指定一些属性。然后有人输入“A”。 A现在具有与子弹相同的所有属性。继续。

您需要确保在下一段开头之前的某个时间段中删除了段落样式。可能最简单的方法是观察用户输入换行符,并在此时分配所需的新段落样式。另一种方法是插入@"\u022\t"(即在子弹后添加一个标签)。然后将您的段落样式分配给项目符号并将其从选项卡中删除。

但是,在任何一种情况下,用户都可以在文本中移动并弄乱你的段落样式。您可能需要跟踪它们并在textViewDidChange:中正确地重新应用它们。