4

我试图允许 textView 通过自定义按钮通过插入带有属性的 NSAttributedString @"\u2022"(项目符号点的 unicode)来允许项目符号点,该NSParagraphStyle属性将其headIndent设置设置为特定的点长度以创建缩进。

问题是这样的:一旦我将该属性项目符号附加到 UITextView 的attributedString属性中,该属性就会对所有未来键入的文本生效。这意味着如果你换行(无论是按回车键还是仅仅输入足够的内容以达到 textView 的水平边界),它将始终缩进。我确实将属性分配给了仅包含项目符号点的属性字符串,所以我不知道为什么它会对所有其他键入的文本生效。

我想不出任何删除该属性的方法,因为它似乎不再分配给某个范围,因为它会影响所有未来的文本。我知道删除属性的唯一方法是,如果它有一个指定的范围,使用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;

摘要:带有 NSParagraphStyle 属性的 NSAttributedString 附加到 textView 的文本。属性会影响所有未来键入的文本,尽管它在创建时被分配到特定范围。

4

1 回答 1

2

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

A bcdef
G hijkl

只有有效的段落样式适用于A并且G很重要。其余的无关紧要。

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

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

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

但是,在任何这些情况下,用户都可能在文本中四处移动并弄乱您的段落样式。您可能需要跟踪它们并在textViewDidChange:.

于 2013-05-24T00:09:02.003 回答