Swift:如何不使用HTML,通过代码创建带表格的NSAttributedString
直接用NSMutableAttributedString构建表格
当然可以跳过HTML转换,纯代码实现带表格的NSAttributedString!苹果提供了NSTextTable和NSTextTableCell这类专门的类来处理富文本表格,下面就用你示例里的两行两列表格来演示:
完整实现代码
import UIKit // 若是Mac平台则导入AppKit func createTableAttributedString() -> NSAttributedString { // 初始化可变富文本对象 let mutableAttrStr = NSMutableAttributedString() // 1. 创建表格实例,配置列数和列宽 let table = NSTextTable() table.numberOfColumns = 2 table.columnWidths = [65.5, 65.5] // 和你HTML里的宽度保持一致 table.borderWidth = 1 // 可选:添加边框,还原HTML默认表格的视觉效果 // 2. 构建第一行 let firstRow = NSTextTableBlock(table: table, startingRow: 0, rowSpan: 1, startingColumn: 0, columnSpan: 2) // 第一行第一个单元格 let cellA = NSTextTableBlock(table: table, startingRow: 0, rowSpan: 1, startingColumn: 0, columnSpan: 1) cellA.content = NSAttributedString(string: "a") // 第一行第二个单元格 let cellB = NSTextTableBlock(table: table, startingRow: 0, rowSpan: 1, startingColumn: 1, columnSpan: 1) cellB.content = NSAttributedString(string: "b") // 将单元格加入行 firstRow.addTableCell(cellA) firstRow.addTableCell(cellB) // 3. 构建第二行 let secondRow = NSTextTableBlock(table: table, startingRow: 1, rowSpan: 1, startingColumn: 0, columnSpan: 2) let cellC = NSTextTableBlock(table: table, startingRow: 1, rowSpan: 1, startingColumn: 0, columnSpan: 1) cellC.content = NSAttributedString(string: "c") let cellD = NSTextTableBlock(table: table, startingRow: 1, rowSpan: 1, startingColumn: 1, columnSpan: 1) cellD.content = NSAttributedString(string: "d") secondRow.addTableCell(cellC) secondRow.addTableCell(cellD) // 4. 将行加入表格,再把表格内容附加到可变富文本 table.addTableBlock(firstRow) table.addTableBlock(secondRow) mutableAttrStr.append(table.attributedString()) return mutableAttrStr } // 使用示例 let tableAttrStr = createTableAttributedString()
关键细节说明
NSTextTable:作为表格的容器,你可以在这里配置列数、列宽、边框宽度等全局表格属性。NSTextTableBlock:既可以代表整行,也可以代表单个单元格——通过columnSpan参数区分:如果columnSpan等于表格列数,就是行;如果等于1,就是单个单元格。- 自定义样式:如果需要给单元格内的文本加样式(比如字体、颜色),直接给
cell.content传入带属性的NSAttributedString即可:let cellAttrs: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 14, weight: .medium), .foregroundColor: UIColor.darkGray ] cellA.content = NSAttributedString(string: "a", attributes: cellAttrs)
这种纯代码的方式比HTML转换更灵活,你可以动态调整表格结构、样式,完全不需要依赖字符串拼接和HTML解析。
内容的提问来源于stack exchange,提问作者alagris
相关产品推荐
相关产品推荐

