如何在 SwiftUI AttributedString 中渲染 Markdown 标题?

2024-02-01

我一直在尝试使用新的属性字符串 https://developer.apple.com/documentation/foundation/attributedstring随 iOS 15 一起发布,用于渲染存储在变量中的 Markdown。但是,我一直无法找到一种方法来呈现 markdown 标题,例如:

# Title 1
### Title 3
###### Title 6

这是我的代码:

let description = """
        # Hello World

        Coin coin
        """
let attributed = (try? AttributedString(markdown: description)) ?? AttributedString(description)
return ScrollView {
    Text(attributed)
        .padding(.horizontal)
}

但预览中显示的内容如下:

有没有人成功地让他们工作或者这是目前不可能做到的事情?


降价已正确解析,问题似乎是标题的表示意图没有做任何事情。

您可以查看演示意图并将样式手动应用到标题。

你必须使用interpretedSyntax: .full这意味着空白将被忽略,因此您可能还想在每个块之后添加一个新行。

extension AttributedString {
    init(styledMarkdown markdownString: String) throws {
        var output = try AttributedString(
            markdown: markdownString,
            options: .init(
                allowsExtendedAttributes: true,
                interpretedSyntax: .full,
                failurePolicy: .returnPartiallyParsedIfPossible
            ),
            baseURL: nil
        )

        for (intentBlock, intentRange) in output.runs[AttributeScopes.FoundationAttributes.PresentationIntentAttribute.self].reversed() {
            guard let intentBlock = intentBlock else { continue }
            for intent in intentBlock.components {
                switch intent.kind {
                case .header(level: let level):
                    switch level {
                    case 1:
                        output[intentRange].font = .system(.title).bold()
                    case 2:
                        output[intentRange].font = .system(.title2).bold()
                    case 3:
                        output[intentRange].font = .system(.title3).bold()
                    default:
                        break
                    }
                default:
                    break
                }
            }
            
            if intentRange.lowerBound != output.startIndex {
                output.characters.insert(contentsOf: "\n", at: intentRange.lowerBound)
            }
        }

        self = output
    }
}

据我所知仅baselineOffset, backgroundColor, font, foregroundColor, kern, strikethroughStyle, tracking, and underlineStyleSwiftUI 支持。

这不是一个完美的解决方案,但它可能会让您更接近您所需要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SwiftUI AttributedString 中渲染 Markdown 标题? 的相关文章

  • Phonegap - cordova 在 Android 和 iOS 设备上延迟且缓慢

    我刚刚开始使用 zend studio 开始我的第一个 PhoneGap 项目 但是 在我构建并部署它之后 该应用程序非常慢 Android 和 iOS 均可 滚动滞后 如果我按下按钮 转到下一页的速度很慢 有什么办法可以提高它的性能吗 提
  • 文档 Main.storyboard 需要 Xcode 8.0 或更高版本

    我下载了 Xcode beta 并打开了现有的项目 看看它如何与 Xcode 8 beta 一起使用 我从 Xcode 8 打开了 Storyboard 文件 现在 当我从 Xcode 7 3 打开项目时 我无法打开故事板文件 它给出了以下
  • Swift iOS 9.2 中的每日本地通知

    尝试快速发送每日本地通知 然而 由于某种原因 它只是每分钟发送一次 我希望第一个通知在应用程序打开后 30 分钟发送 然后每天重复此通知 在 swift fie 中我有以下代码 每日通知代码 同时在应用程序委托中添加部分 让 Date NS
  • 在一个 SwiftUI 视图中相同的 ForEach 循环两次

    当我在视图中对数组使用 ForEach 循环两次时 我在运行时收到以下警告 LazyVGridLayout the ID 84308994 9D16 48D2 975E DC40C5F9EFFF is used by multiple ch
  • 如何使 collectionViewCell 仅按高度自动调整大小?

    我使用collectionView的自动调整流布局的功能 self flow UICollectionViewFlowLayout alloc init self flow scrollDirection UICollectionViewS
  • 如何在 macOS 上的 SwiftUI 中设置拖动图像

    我正在尝试更改 GridView 的默认拖放预览图像 该图像似乎包含网格中的所有可见项目 据我了解 我应该能够设置NSItemProvider previewImageHandler块来自定义所使用的图像 我似乎找不到任何关于返回自定义图像
  • 为什么每次用户启动应用程序时都要注册推送通知?

    在Apple文档中你可以找到下面这句话 应用程序应在每次启动时进行注册 并向其提供者提供当前令牌 它调用 registerForRemoteNotificationTypes 来启动注册过程 因此 当我在应用程序中实现推送通知时 我必须注册
  • swift:移动动画

    我在故事板中有 viewController 还有4个正方形 我想将我的方块放在视图中 首先我想显示两个正方形 如果我按下按钮 我希望我的红色 2 个方块向左移动 然后显示接下来的 2 个蓝色方块 就像这部动画 我需要创建一个scrollV
  • Xcode 8.2.1 无法添加文件夹引用

    我的 Xcode 8 2 1 不允许我添加文件夹引用 我尝试过的 我右键单击名为 Unity 的文件夹 然后单击 将文件添加到项目 在选项下选中 创建文件夹引用 我的文件夹被添加为红色文件 而不是通常的蓝色文件夹 我尝试将文件的 类型 更改
  • 手动屏幕跟踪在 Firebase (iOS) 中不起作用

    我正在尝试禁用 Firebase 中的手动屏幕跟踪 并将其替换为我自己的屏幕跟踪实现 通过自动屏幕跟踪 我发送到 firebase 的每个事件都有两个额外的参数 firebase screen class and firebase scre
  • iOS - 检测应用程序是否正在从 Xcode 运行 [重复]

    这个问题在这里已经有答案了 我试图根据代码是否通过 USB Xcode 调试 运行或在从应用程序商店下载的生产模式 发布 运行来启用 禁用部分代码 我知道检查它是否正在运行DEBUG or RELEASE像这样的模式 ifdef DEBUG
  • 如何缓存单元格并重用每个单元格中嵌入了 avplayers 的集合视图中的单元格?

    基本上我想做的是缓存单元格并让视频继续播放 当用户滚动回到单元格时 视频应该只从播放的位置显示 问题是玩家被移除并且单元格最终出现在随机单元格上 而不是其指定区域 您需要有两个视频才能正常工作 我从这里下载了视频https commonda
  • Swift 每 5 天重复一次 LocalNotification

    如何每 5 天上午 10 00 重复一次 LocalNotification 我尝试这个 但它不起作用 let content UNMutableNotificationContent content title Hello content
  • iOS图片上的线测量

    我需要一些帮助来开始绘制末端带有圆圈的线条 并测量其长度 我能够划清界限 但无法让它移动 花了几个小时决定在 SO 上发布 因此 请参阅下图并指导我开始 任何使用 Objective C 的示例或教程都会有帮助 谢谢 这个想法看起来实现起来
  • iOS-Swift UIApplication.shared.isIdleTimerDisabled = true 在 AppStore 审核后不起作用

    努力实现停止屏幕在某些情况下进入睡眠状态View Controller 我做了什么我已在运行 iOS 12 1 12 的物理 iPhone 6 上使用以下代码测试了我的应用程序 我设置了手机Dislpay Brigthness gt Aut
  • 使用本地化故事板进行即时本地化

    我正在开发一个应用程序 它有一个切换按钮可以在英语和阿拉伯语之间切换 并且应该是动态的 我正在使用该方法https github com maximbilan ios language manager https github com ma
  • 在 ios 中从 XMPP 服务器检索存档的消息

    我正在将 XMPP 功能集成到我的 ios 应用程序中 但遇到了一个无法解决的问题 问题是我无法从服务器获取存档的消息 我的客户能够登录 并且我已经成功测试了多个服务调用 发送 接收消息 获取有关用户的信息 发送后
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • 在 try 中使用零合并运算符? for 抛出并返回可选值的函数

    我想在以下两种情况下使用 nil coalescing 运算符设置默认值 函数抛出错误 函数返回 nil 请看一下下面的代码片段 我有以下问题 为什么 item1 为零 item1和item2的初始化有什么区别 enum VendingMa
  • 呈现 UIActivityViewController 时发出警告

    当我提出一个UIActivityController使用我得到的下面的代码 它被呈现 但控制台显示 Warning Attempt to present

随机推荐

  • 如何打印由字母组成的菱形? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想了解如何打印钻石 如下所示 我是初学者 非常感谢您的帮助 给定一个字母 打印出一颗以 A 开头的钻石 所提供的字母位
  • 确定类型是否为匿名类型[重复]

    这个问题在这里已经有答案了 在C 3 0中 是否可以判断一个实例是否Type代表匿名类型 即使匿名类型是普通类型 您也可以使用一些启发式方法 public static class TypeExtension public static B
  • 每次保存文件时运行相应的单元测试

    我刚刚转而使用 PyCharm 作为我的主要 Python 编辑器 并且很想知道如何配置它 以便每次保存文件时 都会运行与修改后的文件相对应的单元测试 浏览文档后 我没有找到如何执行此操作的明确解释 当您运行单元测试时 您会得到一个新的单元
  • 南姜戈迁徙

    我已经做了 python manage py schemamigration TestDBapp1 initial python manage py schemamigration TestDBapp1 auto 成功地 但如果我输入 py
  • 获取表内的方法形式

    我之前问过一个问题 但我认为我没有正确地提出问题 这是我的代码 HTML
  • 最简单的跨浏览器检查协议处理程序是否已注册

    当用户单击带有自定义协议的链接时 例如myapp superlink 我需要启动应用程序或允许用户下载并运行配置应用程序 我正在寻找跨浏览器的方法来检查自定义协议是否已注册 我试图通过检查用户代理服务器端 对于 IE 来确定这一点 HKEY
  • 构建库代码的最佳方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如果我是唯一的用户,可以避免 ROAuth 握手中的 PIN 步骤吗?

    Question 有没有办法避免在进行 OAuth 握手时手动输入 PIN Context 进行 ROAuth 握手时 系统会要求我输入通过以下链接获取的 PIN rm list ls library twitteR library ROA
  • 捕获 ThreadAbortException 时隐藏的 Throw 有何作用?

    我正在阅读一本关于一般 C 开发的书 并且已经读到了线程中止部分 这本书说 当你在另一个线程上调用 Thread Abort 时 该线程将抛出 ThreadAbortException 即使你试图抑制它 它也会自动重新抛出它 除非你做了一些
  • 将组件推送到组件数组 - ReactJS

    我对 React 数组有点迷失了 我想要做的是拥有组件 文章 数组 并且在该数组中我想要拥有标题和内容 我想要对该数组执行的操作是添加 删除并将其显示在我的页面上 那么我做错了什么 另外这个动作到底叫什么 代码来自ReactJS 演示 ht
  • jquery 图像映射调整大小

    我编写此函数是为了重新调整 onLoad 元素的位置以及用户是否调整浏览器窗口的大小 它在加载时工作正常 但在调整窗口大小时无法正确重新计算 我究竟做错了什么 var orig width jQuery imageMaps attr wid
  • React.js:数组和“违反了有关合并函数的关键假设”错误

    http jsfiddle net NV f54Xr http jsfiddle net NV f54Xr jsx React DOM var Dummy React createClass mixins React addons Link
  • 使用Python将ts转换为mp4[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们不允许提出寻求书籍 工具 软件库等推荐的问题 您可以编辑问题 以便用事实和引文来回答 编辑问题以包括期望的行为 特定问题或错误以及重现
  • 使用 PhantomJS 运行 RequireJS/WireJS 应用程序

    我正在尝试执行一个使用 RequireJS 2 1 8 WireJS 0 10 2 和 PhantomJS 1 9 2 的基本应用程序 当使用 PhantomJS 运行应用程序时 这是我的目标 WireJS 无法加载 请参见下面的错误 使用
  • 中心导航栏链接没有品牌将其推到 Bootstrap 4 的右侧?

    我试图将我的导航栏链接居中 但是当我这样做时 我的品牌徽标将其推到右侧 因此它不居中 这是我的 html
  • AngularJS - 将 $resource.query 与 params 对象一起使用

    我正在尝试接起angular js http angularjs org并致力于找出一些记录较少的事情 考虑一下 我在服务器上有一个搜索方法 它接受查询参数并返回搜索结果的集合 并响应GET search json路线 Rails FWIW
  • Ag-grid:使用 AggFunc 时如何更改定义列标题名称?

    对于给定的列定义 当使用 aggFunc 时 headerName 以 func string 格式显示 我只希望标题显示我定义的字符串 当 AggFunc 为 null 时 此行为不存在 const columnDef any heade
  • 使 Appen 功能在 Google 谷歌表格/[重复]中运行得更快

    这个问题在这里已经有答案了 我有一个代码工作正常但没有优化 我是 Google App 脚本的新手 该代码执行以下操作 从外部URL获取数据 过滤数据 解析文件夹中包含的工作表中的数据 更改列标题 在特定列中附加内容 function my
  • PostgreSQL - 按 UUID 版本 1 时间戳排序

    我在用UUID版本1 https en wikipedia org wiki Universally unique identifier Version 1 date time and MAC address 作为主键 我想按 UUID v
  • 如何在 SwiftUI AttributedString 中渲染 Markdown 标题?

    我一直在尝试使用新的属性字符串 https developer apple com documentation foundation attributedstring随 iOS 15 一起发布 用于渲染存储在变量中的 Markdown 但是