UITextView项目符号处理

时间:2017-07-20 07:24:43

标签: ios uitextview

TL; DR:是否存在在UITextView中使用项目符号的内置方式,或者是否有使用TextKit执行此操作的方法,或者是否有针对我在下面使用方法I&I描述的四个问题的单独解决方法已经在使用了?请继续阅读,了解我所尝试的方法及其中的问题。

我一直在尝试将子弹点处理添加到UITextView子类。重要的是,这应该是可编辑的,而不仅仅是显示文本。

为了添加项目符号,我获取光标当前所在段落的起始位置,并在该位置插入项目符号字符。

UITextPosition *startOfParaPosition = [self startOfCurrentParagraph];
NSInteger startOfParaOffset = [self offsetFromPosition:self.beginningOfDocument toPosition:startOfParaPosition];

NSMutableAttributedString *mAttributedString = [self.attributedText mutableCopy];
NSAttributedString *bullet = [[NSAttributedString alloc] initWithString:@"• "];
[mAttributedString insertAttributedString:bullet atIndex:startOfParaOffset];
[self setAttributedText:mAttributedString];

然后我得到了当前段落的整个范围。

NSRange range = [self rangeOfCurrentParagraph];

最后,我获取当前段落的现有样式,修改缩进,然后重新应用段落样式。

[self getParagraphStyleInString:self.attributedText range:range completion:^(NSMutableParagraphStyle *paragraphStyle) {
    paragraphStyle.firstLineHeadIndent = 10.0;
    paragraphStyle.headIndent = 20.0;

    NSMutableAttributedString *mAttributedText = [self.attributedText mutableCopy];
    [mAttributedText addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range];

    [super setAttributedText:mAttributedText];

}];

请注意,我在此处调用了[super setAttributedText:],因为我在self中重载了此函数以添加其他一些样式,我不想在此时应用这些样式。

这种方法存在许多问题。

  1. 因为子弹字形作为文本中的字符添加(而不是与文本分开),所以用户可以选择项目符号,也可以在其前面移动光标。这意味着用户可以在没有缩进变化的情况下删除子弹字形,也可以在子弹之前插入字符。这不是正常的要点行为。
  2. 虽然子弹直接出现,但在UITextView中键入内容之前,缩进不适用。
  3. 在项目符号项目内(或结尾处)按Return键继续段落格式化(即它仍然正确缩进),但显然不会在文本中添加另一个项目符号。
  4. 退格以删除项目符号然后继续,以便项目符号行向上移动到上一行的末尾,导致上面的段落继承项目符号项的缩进段落样式,而不是相反。 / LI>

    简而言之,使用NSParagraphStyle和基于字符串的项目符号似乎不是在UITextView中实现项目符号列表的好方法。我知道我可以使用带有contenteditable div的UIWebView,这确实是我一直在做的事情。但是,我不想使用方法调配来修改UIWebView键盘上的工具栏,所以更倾向于使用UITextView。我也不想使用HTML作为格式。

    所以,我的问题再次提出:是否存在在UITextView中使用项目符号的内置方式,或者是否有使用TextKit执行此操作的方法,或者是否有单独的解决方法来解决我在上面使用该方法编写的四个问题我已经在使用?

    提前致谢。

0 个答案:

没有答案