NSAttributedString и html-стилизация (выравнивание маркера)

В моем приложении для iOS я использую NSAttributedString для генерации списка маркеров. К сожалению, я борюсь за то, чтобы пули выглядели презентабельно. Моей первой попыткой было использование обычного текста и символа Юникод для маркеров, в основном используя строку вроде этой:

var attributedString = NSMutableAttributedString(
    string: "Here is a list of bullets and a paragraph introducing them, note that this paragraph spans multiple lines\n" +
    "• This is the first bullet\n" +
    "• Here is a second bullet\n" +
    "• And here is a third bullet with a lot of text such that it overflows to the next line"
)

Результат был такой:

Мне нравится, как выглядят маркеры, но переполняемый текст в последнем маркере должен быть выровнен по строке раньше, и я не мог понять, как этого добиться с помощью простого текста (без применения такого же выравнивания к абзацу выше).

Моя вторая попытка состояла в том, чтобы использовать html в NSAttributedString через NSHTMLTextDocumentType и использовать<ul> а также<li> элементы для генерации пуль.

let content = "Here is a list of bullets and a paragraph introducing them, note that this paragraph spans multiple lines" +
    "<ul>" +
         "<li>This is the first bullet</li>" +
         "<li>Here is a second bullet</li>" +
         "<li>And here is a third bullet with a lot of text such that it overflows to the next line</li>" +
    "</ul>"
var attributedString = try! NSMutableAttributedString(
    data: content,
    options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
    documentAttributes: nil
)

Это исправило первую проблему, но представило новую:

Пули теперь расположены слишком далеко (как от левого края, так и от текста справа). Я попытался использовать типичные трюки HTML / CSS, чтобы исправить выравнивание (<li style="text-indent: -10px;">) но эти стили, кажется, игнорируются NSAttributedString.

Я попытался исправить это с помощью дополнительного NSMutableParagraphStyle, но это, кажется, приносит больше вреда, чем пользы. Вот что я попробовал:

var paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.firstLineHeadIndent = 0
paragraphStyle.headIndent = 20
attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: attributedStringRange)

И вот что я получил:

Как вы можете видеть, это только ухудшило ситуацию, вот мои проблемы с этим:

Он смещает 2-ю строку, но я хочу, чтобы этот эффект был только для маркеров, а не абзаца до этого (думаю, я могу исправить это, уменьшив диапазон, в котором применяется эффект)Я должен угадать / жестко закодировать смещение, в моем примере я выбрал 20, и этого было недостаточно для маркеров с учетом текущих настроек шрифта, которые могли бы изменитьПо какой-то причине промежуток между пулями теперь еще больше растягивается без всякой причины, похоже, что просто применение ванильного NSParagraphStyle без каких-либо действий делает это, и я не вижу возможности исправить это.

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

Спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос