如何在文本视图中实施水平尺?

时间:2019-03-14 04:49:17

标签: cocoa uitextview nsattributedstring nstextview nstextattachment

假设我有一个NSTextView(或iOS上的UITextView),并且我希望用户能够插入水平分隔符规则,例如HTML <hr>标签或以下内容:


实现此目标的最佳方法是什么?

Apple的文档非常重要。到目前为止,我有两个想法:

  1. 为每个规则插入NSTextAttachment,并让布局管理器以某种方式绘制它。

  2. 使用多个禁用滚动的文本视图,而不是单个文本视图,将它们放在堆栈视图中,在它们之间添加分隔符视图,然后将堆栈视图放在滚动视图中。

这两种方法对我来说似乎都是错误或不雅的,因为:

  1. 在文档中,听起来好像文本附件最初是用于附加文件的。水平尺不是文件。

  2. 如果我使用多个文本视图,则可能会丢失NSTextView固有的一些性能调整,因为所有文本视图都需要加载并准备显示,无论用户在何处滚动。另外,多文本视图方法将阻止用户选择整个文本,这是我的应用程序中的要求。

还有更好的主意吗?

1 个答案:

答案 0 :(得分:1)

我记得几年前尝试这样做。使用NSTextAttachment是对我有用的方法。我在Mike this conversation上加了书签,以帮助我记住该怎么做。我没有代码了,但是很简单。我将NSTextAttachmentCell细分为NSTextAttachmentCellProtocol。覆盖cellFrame(for textContainer: NSTextContainer, proposedLineFragment lineFrag: NSRect, glyphPosition position: NSPoint, characterIndex charIndex: Int)可以访问它的容器,该容器可以提供其宽度,并且它的行片段可以使文本在分隔符上方的y位置(以及所需的任何填充)。然后只需覆盖draw(withFrame cellFrame: NSRect, in controlView: NSView?)方法并绘制分隔线即可。

对于有效载荷NSData,您可以执行任何操作。也许您包括线的宽度,填充,颜色等?使用NSTextAttachment的好处是它像<hr>标记一样嵌入文本本身。