Привет, ребята. Я новичок в TextKit и пытаюсь нарисовать фон и границы вокруг определенных атрибутов. Я подошел довольно близко, но еще не нашел методов, которые не генерируют очень противоречивые размеры, что выглядит плохо. Вот мой первый треск на это:
class MyLayout: NSLayoutManager {
override func drawBackground(forGlyphRange glyphsToShow: NSRange, at origin: CGPoint) {
super.drawBackground(forGlyphRange: glyphsToShow, at: origin)
guard let storage = textStorage else {
return
}
guard let context = UIGraphicsGetCurrentContext() else {
return
}
var codeBlockRect: CGRect? = nil
enumerateLineFragments(forGlyphRange: glyphsToShow) { (rect, usedRect, container, subRange, stop) in
var effectiveRange = NSRange()
let attributes = storage.attributes(at: subRange.location, effectiveRange: &effectiveRange)
storage.enumerateAttribute(.inlineCodeBlock, in: subRange) { (value, attributeRange, stop) in
guard value != nil else {
return
}
var background = self.boundingRect(forGlyphRange: attributeRange, in: container)
background.origin.x += origin.x
background.origin.y += origin.y
context.setFillColor(UIColor.lightGrey.cgColor)
context.setStrokeColor(UIColor.mediumGrey.cgColor)
context.stroke(background)
context.fill(background)
}
}
}
}
Это дает следующие результаты:
Одна строка текста:
Несколько строк текста:
Как видите, разница между размерами составляет около 3 пикселей. Я думаю, это потому, что boundingRect
, как сказано в документации:
Возвращает наименьший ограничивающий прямоугольник, который полностью вмещает глифы в данном glyphRange
Но я не нашел метод, который дал бы мне число ближе к тому, что я ищу. Мой идеальный сценарий заключается в том, что каждый прямоугольник будет иметь одинаковую высоту.
Дайте мне знать, если потребуется дополнительная информация.
Обновление
Мне пришло в голову, что это может быть связано с проприетарным шрифтом, который мы используем, поэтому я изменил все, чтобы использовать UIFont.systemFont, что не имело никакого значения.