получать согласованные размеры для фонов глифа - PullRequest
0 голосов
/ 04 января 2019

Привет, ребята. Я новичок в 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)
            }
        }
    }
}

Это дает следующие результаты:

Одна строка текста:
Single line of text

Несколько строк текста:
Multiple lines of text

Как видите, разница между размерами составляет около 3 пикселей. Я думаю, это потому, что boundingRect, как сказано в документации:

Возвращает наименьший ограничивающий прямоугольник, который полностью вмещает глифы в данном glyphRange

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

Дайте мне знать, если потребуется дополнительная информация.

Обновление

Мне пришло в голову, что это может быть связано с проприетарным шрифтом, который мы используем, поэтому я изменил все, чтобы использовать UIFont.systemFont, что не имело никакого значения.

1 Ответ

0 голосов
/ 07 января 2019

Я нашел здесь обходной путь - вместо того, чтобы определять inlineCodeBlock как фон, я определил его как собственный стиль подчеркивания.

Это позволяет мне переопределить drawUnderline(forGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:).

Получив это, я смог использовать baselineOffset, чтобы получить последовательное позиционирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...