Невозможно отобразить NSAttributedString в виде списка с 2 вкладками в виде столбца в PDF - PullRequest
0 голосов
/ 06 июня 2019

Я создаю большую строку, которая выводится в 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" и "get" были выровнены по серединедокумент, так что я могу вместить гораздо большие слова.

1 Ответ

0 голосов
/ 07 июня 2019

Оказывается, я был на стадионе, но точно не близко.

Следующее обеспечивает желаемый эффект разделения столбца:

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

И будет выглядеть так:

enter image description here

Что здесь происходит?

Итак, я узнал, что tabStopsсообщает iOS, в каком месте в строке разместить вкладку:

  1. Первая вкладка перейдет в положение 100
  2. Вторая вкладка перейдет в положение 300
  3. AТретья вкладка обернется вокруг документа и также перейдет в положение 100

Что касается табуляции, если вы назначите вкладку с местоположением 0 в первом индексе, то табуляция новой строки приведет ее в соответствие слевый край.

Что касается того, что решило проблему для меня.Я полагался на подход, при котором каждый компонент строки добавлялся так, как он встречался.Однако эта строка не сможет правильно отформатировать.Вместо этого, объединив все в одну строку и применив атрибуты, видимые в моем рабочем коде, я смог правильно настроить его.

Я также протестировал использование отдельных компонентов, как видно из моего вопроса, но с применением атрибутов стиля абзаца, что также привело к рабочему решению.

На основании этого онПохоже, что моей ошибкой было смешивание строк, которые имели и не имели желаемого поведения табуляции.

...