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