5

如何制作一个基本上是水平分隔符的 NSAttributedString,比如 HTML 的<hr>标签?

我试过了:

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

但是,<hr>标签不会出现。不过,将字符串添加到我的视图中是可行的,因为我可以看到hi.

4

3 回答 3

13

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

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

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

你也可以NSTextTable用来画一条规则——我没有尝试过这种方法,但我怀疑它可以很容易地工作。

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

于 2014-11-10T13:30:09.553 回答
1

你将不得不自己画它。<hr>不是文本,也不是修改文本的属性。因此, NSAttributedString 无法表示它,而 Cocoa 文本系统或 CoreText 无法绘制它。

于 2012-07-02T22:57:45.540 回答
1

我尝试遵循@alasair 指令的第一种方法,并在 Swift 中成功使用了它:

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

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

水平线

于 2021-02-01T14:46:11.873 回答