Получить все символы UIFont, имеющие спусковое устройство - PullRequest
0 голосов
/ 21 января 2019

Есть ли способ получить все глифы UIFont, которые содержат истинное потомство? Кажется, что использование CTLineGetTypographicBounds не является точным и возвращает одинаковое значение спуска для каждой строки. Я думал, что это даст информацию, которая мне нужна, но это не так. Итак, теперь я смотрю, смогу ли я создать набор символов из глифов, которые содержат настоящие спусковые устройства, если нет другого пути. Конечная цель - увидеть, находится ли строка текста ниже базовой линии.

  let line = CTLineCreateWithAttributedString(NSAttributedString(string: s, attributes: attr))
  //let's get the real descent test
   var a : CGFloat = 0
   var d : CGFloat = 0
   var l : CGFloat = 0
   let bounds = CTLineGetTypographicBounds(line, &a, &d, &l)
   print("the descent is \(d)")
   print("the ascent is \(a)")
   print("the leading is \(l)")

1 Ответ

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

Поскольку кажется, что ваша реальная цель - определить, содержит ли строка символ с потомком, вы можете использовать Базовый текст, чтобы посмотреть на ограничивающий прямоугольник каждого глифа.Если происхождение ограничивающего прямоугольника отрицательно, это означает, что глиф начинается ниже базовой линии.Это будет верно для таких символов, как y, но также и ,.

func checkDescender(string: String) {
    let uiFont = UIFont.systemFont(ofSize: 14) // Pick your font
    let font = CTFontCreateWithName(uiFont.fontName as CFString, uiFont.pointSize, nil)
    for ch in string.unicodeScalars {
        let utf16codepoints = Array(ch.utf16)
        var glyphs: [CGGlyph] = [0, 0]
        let hasGlyph = CTFontGetGlyphsForCharacters(font, utf16codepoints, &glyphs, utf16codepoints.count)
        if hasGlyph {
            let rect = CTFontGetBoundingRectsForGlyphs(font, .default, glyphs, nil, 1)
            // print("\(ch) has bounding box of \(rect)")
            if rect.origin.y < 0 {
                print("\(ch) goes below the baseline by \(-rect.origin.y)")
            }
        }
    }
}

checkDescender(string: "Ymy,")

Возможно, вы захотите добавить дополнительные проверки, чтобы смотреть только на буквы в зависимости от ваших потребностей.

...