Поскольку кажется, что ваша реальная цель - определить, содержит ли строка символ с потомком, вы можете использовать Базовый текст, чтобы посмотреть на ограничивающий прямоугольник каждого глифа.Если происхождение ограничивающего прямоугольника отрицательно, это означает, что глиф начинается ниже базовой линии.Это будет верно для таких символов, как 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,")
Возможно, вы захотите добавить дополнительные проверки, чтобы смотреть только на буквы в зависимости от ваших потребностей.