【问题标题】:Horizontal <hr>-like separator in NSAttributedStringNSAttributedString 中的水平 <hr>-like 分隔符
【发布时间】:2012-07-02 10:54:05
【问题描述】:

如何制作一个基本上是水平分隔符的 NSAttributedString,例如 HTML 的 &lt;hr&gt; 标签?

我试过了:

NSAttributedString *hr = [[NSAttributedString alloc] initWithHTML:
  [NSData
    dataWithBytes:"<html><body><hr>hi</body></html>"
    length:strlen("<html><body><hr>hi</body></html>")]
  documentAttributes:NULL];

但是,&lt;hr&gt; 标记不会出现。不过,将字符串添加到我的视图中是可行的,因为我可以看到 hi

【问题讨论】:

    标签: html cocoa osx-lion separator nsattributedstring


    【解决方案1】:

    这是一个相当古老的问题,但我认为值得更全面地回答。

    获得水平标线的一种简单方法是在您想要的标线长度处设置一个带有制表位的段落,并将其对齐方式设置为居中。然后将文本设置为U+00A0 U+0009 U+00A0,并在文本上设置删除线属性。规则的长度由制表位的位置设置。这具有开箱即用的复制和粘贴的显着优势 - 并且确实与使用文本系统的其他程序一起使用。

    如果您想要(例如)随文本扩展的水平规则,另一种可行的方法是将NSTextAttachment 与自定义单元格一起使用。单元格被传递一个线片段矩形,并且可以根据需要设置自己的框架。 FWIW,您不必为NSTextAttachment 使用图像;您的单元格可以进行自定义绘图。但是,您将遇到的问题是复制和粘贴将根据附件内容设置单元格类型(这是有道理的,因为您的自定义单元格在其他应用程序中不可用)。您可以采用混合方法并将图像设置为附件,同时在应用程序中进行自己的自定义渲染;镀金版本可能会在 PNG 附件中使用自定义标签来指示它应该是自定义呈现的。

    您也可以使用NSTextTable 来制定规则——我没有尝试过这种方法,但我怀疑它可以很容易地工作。

    最后,您可以选择按照 Kevin 的建议进行操作 - 使用 NSLayoutManager 计算适当的位置并自己渲染。

    【讨论】:

    • alastair,我想我正在研究这种方法,但你有一些代码可以澄清它吗?
    • 感谢您的努力...第一个解决方案效果很好(我的情况需要稍作改动)
    【解决方案2】:

    您将不得不自己绘制它。 &lt;hr&gt; 不是文本,也不是修改文本的属性。因此,NSAttributedString 无法表示它,而 Cocoa 文本系统或 CoreText 没有工具来绘制它。

    【讨论】:

    • 嗯,如果我不能使用NSAttributedString,那我怎么能把&lt;hr&gt;插入NSTextView呢?
    • @houbysoft:我想你还是得自己画。在文本渲染中放置一些空间,计算位置,并在文本视图的该部分可见时绘制它。
    • 真的没有更好(/更简单)的方法吗?例如,我知道您可以通过NSTextAttachment 将图像添加到NSAttributedString,也许我可以使用它?
    • @houbysoft:我想你可以尝试动态创建一个图像,在其中绘制
      ,然后附加它,但是如果你的文本字段的宽度发生变化,你就有麻烦了。更不用说你自己还在画这该死的东西。
    • 对...我可能会放弃&lt;hr&gt;。这不是必需的,所以我不能证明在它上面花费太多时间是合理的,但它会是一个不错的功能。
    【解决方案3】:

    我已尝试遵循@alasair 说明的第一种方法,并在 Swift 中成功使用:

    let hr = NSAttributedString(string: "\n\r\u{00A0} \u{0009} \u{00A0}\n\n", attributes: [.strikethroughStyle: NSUnderlineStyle.single.rawValue, .strikethroughColor: UIColor.gray])
    

    这将呈现以下行,横跨整个屏幕宽度:

    【讨论】:

    • 我复制/粘贴了这段代码,它在深色和浅色配色方案中都能很好地工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多