Использование NSAttributedString с несколькими foregroundColor заставляет текст в UILabel выглядеть ниже, чем ожидалось - PullRequest
0 голосов
/ 12 февраля 2019

Демо

https://github.com/NSFish/NSAttributedStringWithMultipleForegroundColor

Описание

Здесь у меня есть UILabel настолько простой, насколько это может быть

let label = UILabel()
label.backgroundColor = UIColor.gray
label.numberOfLines = 2
view.addSubview(label)
// autolayout stuff..

И настроенная строка NSAttributedStringчтобы соответствовать замыслу дизайнера

let content = " 自营  回力/WARRIOR 轮胎 215/65R16 98H SR1"
let attributedText = NSMutableAttributedString.init(string: content)
let font = UIFont.systemFont(ofSize: 16)
let baselineOffset = (lineHeight - font.lineHeight) / 4
let attributes: [NSAttributedString.Key : Any] = [NSAttributedString.Key.font: font,
                                                  NSAttributedString.Key.foregroundColor: UIColor.black,
                                                  NSAttributedString.Key.baselineOffset: Int(baselineOffset)]

attributedText.setAttributes(attributes, range: NSRange.init(location: 0, length: content.count))

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.maximumLineHeight = lineHeight
paragraphStyle.minimumLineHeight = lineHeight
        attributedText.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSRange.init(location: 0, length: content.count))

label.attributedText = attributedText

Строка содержимого появилась в центре UILabel, как и ожидалось.Но когда я изменил foregroundColor первых двух символов, все пошло не так

// text looks lower
var prefixAttributes = attributes
prefixAttributes[NSAttributedString.Key.foregroundColor] = UIColor.white
attributedText.setAttributes(prefixAttributes, range: NSRange.init(location: 0, length: 5))
attributedText.setAttributes(attributes, range: NSRange.init(location: 5, length: content.count - 5))
// text in the center, works
// attributedText.setAttributes(attributes, range: NSRange.init(location: 0, length: content.count))

Единственное отличие здесь - цвет переднего плана в диапазоне (0, 5) изменился на белый.

Результат

before after

Вопрос

Я не очень знаком с TextKit, но знаюПоложение текста внутри UILabel должно определяться baselineOffset или, по крайней мере, чем-нибудь, кроме foregroundColor текста ...

...