无法将 NSAttributedString 呈现为 PDF 中的 2 列选项卡式项目符号列表

Unable to render an NSAttributedString as a 2 column tabbed bullet list in a PDF

我正在构建一个输出到 PDF 文件的大字符串,但现在,我想在我的文档中有一个 2 列的项目符号列表。但是,我还没有找到可以让我获得所需的跳格效果的正确设置。

目前,我正在测试以下代码:

let mutableString = NSMutableAttributedString()
let words = ["this", "is", "really", "getting", "old"]

let paragraphStyle = NSMutableParagraphStyle()
var tabStops = [NSTextTab]()
let tabInterval: CGFloat = 250.0
for index in 0..<12 {
    tabStops.append(NSTextTab(textAlignment: .left,
                              location: tabInterval * CGFloat(index),
                              options: [:]))
}
paragraphStyle.tabStops = tabStops

for index in 0..<words.count {
    if index != 0 && index % 2 == 0 {
        mutableString.append(NSAttributedString(string: "\n"))
    }
    if index % 2 == 1 {
        let attributedText = NSAttributedString(string: "\t", attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
        mutableString.append(attributedText)
    }
    let word = words[index]
    let attributedString = NSMutableAttributedString(string: "\u{2022}  \(word)",
        attributes: [:])
    mutableString.append(attributedString)
}

当我将其输入我的 PDF 生成器时,它会产生以下结果:

最终,我希望“is”和“getting”与文档的中间对齐,这样我就可以容纳更大的词。

事实证明我在球场上,但绝对不接近。

下面提供想要的分栏效果:

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.tabStops = [
    // 274 would be the midpoint of my document
    NSTextTab(textAlignment: .left, location: 274, options: [:])
]

let string = "\u{2022} This\t\u{2022} is\n\u{2022} getting\t\u{2022} really\n\u{2022} old"

let attributedString = NSAttributedString(
    string: string,
    attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)

为了加分,如果你想在你的文档中有多个栏目,下面将完成这个(请原谅我粗略的格式):

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.tabStops = [
    NSTextTab(textAlignment: .left, location: 100, options: [:]),
    NSTextTab(textAlignment: .left, location: 300, options: [:])
]

let string = "\u{2022} This\t\u{2022} is\t\u{2022} getting\n\u{2022} really\t\u{2022} old"

let attributedString = NSAttributedString(
    string: string,
    attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)

看起来像这样:

这是怎么回事?

所以,我在这里学到的是 tabStops 告诉 iOS 在行中的什么位置放置选项卡:

  1. 第一个选项卡将转到位置 100
  2. 第二个选项卡将转到位置 300
  3. 第三个选项卡将环绕文档并转到位置 100

关于制表符,如果您在第一个索引中指定位置为 0 的制表符,则制表符到换行符将使它与左边缘对齐。

至于是什么为我解决了这个问题。我依赖于一种方法,即在遇到字符串时添加每个组件。但是,此字符串将无法正确格式化。相反,通过将所有内容合并到一个字符串中并应用在我的工作代码中看到的属性,我能够使其正确对齐。

我还使用我的问题中看到的各个组件进行了测试,但也应用了段落样式属性,这也产生了一个有效的解决方案。

基于此,我的错误似乎是混合了具有和不具有所需制表符行为的字符串。