使用iOS Dynamic-Type从RTF获取NSAttributedString

时间:2015-12-26 13:40:49

标签: ios rtf nsattributedstring

我的应用程序有一个简单的内置帮助页面。页面从富文本文件加载到NSAttributedString,字符串显示在UITextView中。

这是来自prepareForSegue:的代码片段,我在加载NSAttributedString之前将其用于显示...

NSURL *const textURL =
[[NSBundle mainBundle] URLForResource: @"DontPanic"
                        withExtension: @"rtf"];

NSDictionary *const options =
@{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType};

NSAttributedString *const text =
[[NSAttributedString alloc] initWithURL: textURL
                                options: options
                     documentAttributes: nil
                                  error: nil];

这一切都运作良好。但是,它并不支持iOS "Dynamic Type" - 字体会被刻录到RTF文件中,并且不会对用户的设置做出反应。

我喜欢使用系统定义的正文样式的指南:UIFontTextStyleBody和标题:UIFontTextStyleHeadline

我怎么能这样做?

我很高兴能够以HTML或Markdown等其他格式定义指南。如果我可以避免使用外部库,我宁愿不在项目中添加外部库。

1 个答案:

答案 0 :(得分:3)

您可以通过CSS访问首选字体。例如,您可以创建一个html文档,如:

<html>
    <body>
        <h1 style="font: -apple-system-headine; font-family:-apple-system;">My heading</h1>
        <p style ="font: -apple-system-body; font-family:-apple-system;">The body of this document</p>
    </body>
</html>

然后在上面的代码中将NSRTFTextDocumentType替换为NSHTMLTextDocumentType

CSS中首选字体名称的完整列表是:

-apple-system-headline
-apple-system-subheadline
-apple-system-short-headline
-apple-system-short-subheadline
-apple-system-body
-apple-system-short-body
-apple-system-tall-body
-apple-system-caption1
-apple-system-caption2
-apple-system-short-caption1
-apple-system-footnote
-apple-system-short-footnote

如果您不想在每个元素上定义字体,可以在html <head>标记中修改样式,如下所示:

<html>
  <head>
    <style type="text/css">
      H1 {font: -apple-system-headine; font-family: -apple-system;}
      P {font: -apple-system-body; font-family: -apple-system;}
    </style>
  </head>

  <body>
    <h1>This is a heading. It will be shown with the dynamic type headline font.</h1>
    <p>This is a paragraph. It will use the dynamic type body font.</p>
  </body>
</html>