如何在文本视图中实现水平规则?

问题描述 投票:1回答:1

假设我有一个NSTextView(或iOS上的UITextView),我希望用户能够插入水平分隔符规则,如HTML <hr>标记或这个东西:


What's the best way to implement this?

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

  1. 为每个规则插入一个NSTextAttachment,并让布局管理器以某种方式绘制它。
  2. 使用多个禁用滚动的文本视图,将它们放在堆栈视图中,在它们之间添加分隔符视图,然后将堆栈视图放在滚动视图中,而不是单个文本视图。

这两种方法对我来说都显得有点不对劲或不优雅,因为:

  1. 从文档中可以看出,文本附件首先用于附加文件。水平规则不是文件。
  2. 如果我使用多个文本视图,我可能会丢失一些NSTextView固有的性能调整,因为无论用户在哪里滚动,所有文本视图都需要加载并准备好显示。此外,多文本视图方法会阻止用户选择整个文本,这是我的应用程序中的一项要求。

有更好的想法吗?

cocoa uitextview nsattributedstring nstextview nstextattachment
1个回答
1
投票

我记得多年前尝试这样做。使用NSTextAttachment是适合我的方法。我将this conversation和Mike Ferris一起加入书签,以帮助我记住如何做到这一点。我不再有代码,但它非常简单。我将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>标签一样嵌入文本本身。

© www.soinside.com 2019 - 2024. All rights reserved.