如何使用 NSLayoutManager 用自定义绘图替换文本附件?

Mis*_*cha 5 nslayoutmanager nsattributedstring nstextattachment ios nstextstorage

我的最终目标是让用户能够将文本拆分为一个NSTextViewUITextView多个部分,其中两个后续部分通过自定义视图分隔符在视觉上分开(可能,但不一定是水平规则 - 我希望能够调整分离器的视觉外观没有麻烦)。

分节符分隔符的示例屏幕截图

我需要一个适用于两个平台的解决方案:macOS 和 iOS

(我的相关问题集中在 macOS 的解决方案上,并且有一个使用NSTextAttachmentCells 在 iOS 上不可用。)

我目前解决这个问题的方法如下:

  1. 我在窗口的工具栏中有一个按钮来插入分节符。
  2. 当用户点击该按钮时,我会创建一个没有文本但带有文本附件的新属性字符串:

    let attachment = SectionChangeTextAttachment()
    let attachmentString = NSAttributedString(attachment: attachment)
    
    Run Code Online (Sandbox Code Playgroud)

    SectionChangeTextAttachmentNSTextAttachment我创建的自定义子类,以便能够将此分节符附件与其他可能的附件区分开来。)

  3. 我将其插入attachmentString到当前光标位置的文本存储中:

    textStorage.insert(attachmentString, at: textView.selectedRange().location)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我创建了一个自定义NSLayoutManager子类。它的任务是找到类的所有附件,SectionChangeTextAttachment并用分隔符图(或字形?)替换所有出现的地方。这就是问题所在:由于 Apple 有限且部分过时的文档,我无法弄清楚如何执行此操作。

所以我的问题是:

如何让我的布局管理器用比字符/字形占用更多空间的自定义图形(分隔符)替换附件字符(带有特定附件)?

(我猜附件字符没有字形,因此布局管理器没有为它提供任何空间。)

我需要覆盖哪些方法才能使其工作?

(这种方法从一开始就有意义吗?)