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

时间:2019-06-06 18:13:46

标签: ios swift nsattributedstring nstexttab nsmutableparagraphstyle

我正在构建一个输出到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生成器时,它会产生以下结果:

enter image description here

最终,我希望“ is”和“ getting”与文档的中心对齐,以便我可以容纳更大的单词。

1 个答案:

答案 0 :(得分:0)

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

以下内容提供了所需的拆分列效果:

7/3
Stored in BigDecimals: 7/3
Converted decimal value: 2

enter image description here

要获得奖励积分,如果您想在文档中包含多列,请执行以下操作(请原谅我的粗格式):

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]
)

看起来像这样:

enter image description here

这是怎么回事?

因此,我在这里了解到的是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] ) 告诉iOS放置标签的行中的哪个位置:

  1. 第一个标签页将转到位置100
  2. 第二个标签将转到位置300
  3. 第三个标签将环绕文档并定位到第100个位置

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

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

我也使用问题中的单个组件进行了测试,但是还应用了段落样式属性,这也导致了可行的解决方案。

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