objective-c - iOS 相当于 MacOS NSAttributedString initWithRTF

标签 objective-c ios macos nsattributedstring

什么是 iOS 等效于 MacOS NSAttributedString initWithRTF ?

Application Kit 扩展了 Foundation 的 NSAttributedString 类,增加了对 RTF、RTFD 和 HTML(带或不带附件)、图形属性(包括字体和标尺属性)、绘制属性字符串的方法以及计算重要语言单位的方法的支持。

- (id)initWithRTF:(NSData *)rtfData documentAttributes:(NSDictionary **)docAttributes

我需要在 iOS 应用程序中处理一小段 RTF 数据。
谢谢!

最佳答案

iOS 中没有等价物。 NSAttributedString的iOS版本只有CoreText需要的功能,CoreText本身也只有UI类需要的功能,不包括RTF处理。

据我所知,至少从 5.0 开始,UIWebView是处理 RTF 的唯一方法。见 https://developer.apple.com/library/ios/#qa/qa1630/_index.html .这可能在 5.1 中发生了变化,因为 Apple 的其他一些应用程序现在似乎可以处理富文本(但话说回来,这些应用程序可能刚刚从 UITextView 更改为 UIWebView ...)。
UIWebView没有给您任何从 RTF 访问属性文本的方法,因为 Web View 从不构建属性文本,而是构建 HTML 和 CSS。

好消息是这些 HTML 和 CSS 在 DOM 中可用。至少对于某些类型来说,这是不正确的——你所看到的只是一个不透明的包装器,它被 WebKit 中的一些你无法访问的魔术代码呈现——但 RTF 不是这些类型之一。

使用 Safari Web Inspector , 我开了a sample RTF file在我的 iPhone 上,查看了 DOM。它充满了这样的节点:

<span class="s2"><span class="bumpedFont16">m a test file. This is some </span></span>
<span class="s3"><span class="bumpedFont16">bold</span></span>

…这些类是用内联定义的<style>紧接在它们第一次使用的标签之前的标签。

因此,如果遍历具有文本的节点,该文本就像一个属性字符范围(尽管如果你真的想要开始和结束索引,你需要自己计算它们......),它的计算样式大致就像一个属性字典。当然,“大致相似”不是“相同”;计算样式如下所示:
direction: ltr; display: inline; font-family: 'Times New Roman'; font-size: 22px;
font-weight: bold; height: auto; margin-bottom: 0px; margin-top: 0px;
padding-right: 0px; text-align: left; width: auto;

所以,实际上与 NSAttributedString 不兼容,也没有那么好(当然,除非你的最终目标是创建 HTML)……但至少你可以使用一些东西。

关于objective-c - iOS 相当于 MacOS NSAttributedString initWithRTF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10920678/

相关文章:

iphone - Self.view在iPhone中调用viewDidLoad

ios - 访问 iOS 7 隐藏的 UITableViewCellScrollView?

ios - NSURLConnection:我正在尝试接收 html 页面,但总是收到错误 403

xcode - Omnigroup 框架依赖性

cocoa - EXC_BAD_指令: task_thread failed cocoa

ruby-on-rails - 使用docker for rails运行数据库迁移时出错

ios - 使 swift 类符合定义属性的 objective c 协议(protocol)

ios - NSPredicate 多个 ANY 查询与 CoreData

ios - 在哪里自定义 IBOutlets

ios - Swift 3.0 委托(delegate)协议(protocol)不起作用