水平<hr /> - 类似于NSAttributedString中的分隔符

时间:2012-07-02 00:23:01

标签: html cocoa osx-lion separator nsattributedstring

如何创建基本上是水平分隔符的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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

最后,您可以选择执行Kevin建议 - 使用NSLayoutManager计算合适的位置并自行渲染。

答案 1 :(得分:1)

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

答案 2 :(得分: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])

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

horizontal line