如何在UITextView中完整渲染Markdown元素(含特殊公式)
在UITextView中完整渲染Markdown(含数学公式)的解决方案
问题根源
你当前指定的.inlineOnlyPreservingWhitespace语法解析集仅支持行内Markdown元素(比如粗体、链接),完全不处理标题、列表、段落换行这类块级元素,这就是大部分格式失效的核心原因。另外,默认解析逻辑不包含数学公式支持,需要单独开启。
解决步骤
1. 切换到完整Markdown语法解析集
把interpretedSyntax改成.full或者.standard,这两个语法集支持所有标准Markdown块级+行内元素:
.full:支持所有Apple实现的Markdown语法(包括扩展功能).standard:严格遵循CommonMark标准
2. 开启数学公式支持
iOS 16及以上版本支持LaTeX格式的数学公式,需要在解析选项中添加.inlineMath和.displayMath语法,同时要确保文本使用支持数学符号的字体(比如SF Pro Math)。
3. 修正UITextView基础设置
确保UITextView的isEditable设为false(如果只是展示用),textContainer.lineBreakMode设为.byWordWrapping,避免文本挤成一行。
完整可运行代码示例
import UIKit class ViewController: UIViewController { @IBOutlet weak var instructionsTextView: UITextView! override func viewDidLoad() { super.viewDidLoad() // 包含所有需要测试的Markdown元素(含数学公式) let mdString = """ # 一级标题 这是普通段落文本。 * 无序列表项1 * 无序列表项2 **粗体文本** *斜体文本* ## 二级标题 [Apple链接](https://www.apple.com) ### 数学公式示例 行内公式:$E=mc^2$ 块级公式: $$ \\sum_{i=1}^n i = \\frac{n(n+1)}{2} $$ """ // 配置完整Markdown解析选项,包含数学公式支持 var syntax = AttributedString.MarkdownSyntaxSet.full syntax.formula.inlineMath = true syntax.formula.displayMath = true let options = AttributedString.MarkdownParsingOptions( interpretedSyntax: syntax, allowsExtendedAttributes: true ) // 转换为富文本,指定数学字体 do { var attributedText = try AttributedString(markdown: mdString, options: options) // 全局设置支持数学符号的字体 attributedText.font = UIFont(name: "SF Pro Math", size: 16) ?? .systemFont(ofSize: 16) instructionsTextView.attributedText = NSAttributedString(attributedText) } catch { print("Markdown解析失败:\(error)") } // UITextView基础配置 instructionsTextView.isEditable = false instructionsTextView.textContainer.lineBreakMode = .byWordWrapping instructionsTextView.textContainerInset = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16) } }
关键说明
- 数学公式仅支持iOS 16.0+、iPadOS 16.0+版本
- 如果需要兼容更低版本,得使用第三方Markdown渲染库(比如Down、MarkdownKit)
- 块级数学公式需要用
$$包裹,行内公式用$包裹,LaTeX语法遵循标准规则
内容的提问来源于stack exchange,提问作者Mitch Cohen
相关产品推荐
相关产品推荐

