Ios UITextView项目符号点处理

Ios UITextView项目符号点处理,ios,uitextview,Ios,Uitextview,TL;DR:在UITextView中是否有使用项目符号的内置方法,或者是否有使用TextKit的方法,或者是否有针对我在下面描述的四个问题的单独解决方法,以及我已经使用的方法?请继续阅读我尝试过的方法的完整描述以及其中的问题 我一直在尝试向UITextView子类添加要点处理。重要的是,它应该是可编辑的,而不仅仅是用于显示文本 对于添加项目符号,我获取光标当前所在段落的起始位置,并在该位置插入项目符号字符 UITextPosition *startOfParaPosition = [self s

TL;DR:在UITextView中是否有使用项目符号的内置方法,或者是否有使用TextKit的方法,或者是否有针对我在下面描述的四个问题的单独解决方法,以及我已经使用的方法?请继续阅读我尝试过的方法的完整描述以及其中的问题

我一直在尝试向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
中重载了这个函数,以添加一些其他样式,我现在不想应用这些样式

这种方法存在许多问题

  • 由于项目符号图示符是作为文字中的字符添加的(而不是与文字分开),因此用户可以选择项目符号,也可以在项目符号之前移动光标。这意味着用户可以在不改变缩进的情况下删除项目符号图示符,还可以在项目符号之前插入字符。这不是正常的要点行为
  • 尽管项目符号直接出现,但只有在UITextView中键入内容后,缩进才会应用
  • 在带项目符号的项目内(或在项目末尾)按Return键可继续段落格式设置(即仍然正确缩进),但显然不会在文本中添加另一个项目符号
  • 退格删除项目符号点,然后继续,使项目符号行上移到前一行的末尾,会使上面的段落继承项目符号项的缩进段落样式,而不是相反
  • 简言之,使用NSParagraphStyle和基于字符串的项目符号点似乎不是在UITextView中实现项目符号列表的好解决方案。我知道我可以使用带有contenteditable div的UIWebView,这确实是我一直在做的事情。但是,我不喜欢使用方法swizzling来修改UIWebView键盘上的工具栏,所以我更愿意使用UITextView。我也不想使用HTML作为格式

    那么,我的问题是:在UITextView中是否有一种内置的使用项目符号的方法,或者是否有一种使用TextKit的方法来实现这一点,或者是否有针对我上面所写的四个问题的单独解决方法,以及我已经使用的方法


    提前感谢。

    为什么不能在需要的位置将项目符号字符作为子视图添加到UITextView?因为这样项目符号就不会与文本一起流动。在项目符号段落上方添加新内容,将其进一步向下推至视图,将使项目符号子视图保留在最初放置的位置。@masher您是否找到了问题的解决方案?我还试图复制这种行为。@jbouaziz不,我没有找到解决方案,而且这个项目从来没有启动过,因为它被放弃了。抱歉,我帮不上忙。为什么不能在需要的位置将项目符号字符作为子视图添加到UITextView?因为这样项目符号就不会与文本一起流动。在项目符号段落上方添加新内容,将其进一步向下推至视图,将使项目符号子视图保留在最初放置的位置。@masher您是否找到了问题的解决方案?我还试图复制这种行为。@jbouaziz不,我没有找到解决方案,而且这个项目从来没有启动过,因为它被放弃了。对不起,我帮不上忙。