Это поздний ответ, но у меня сейчас тот же вопрос, и я решил проблему с последующим исследованием.
Выравнивание по вертикали зависит от текста, который нужно нарисовать, и шрифтавы используете, поэтому не существует единого способа сделать его вертикальным для всех случаев.
Но мы все равно можем рассчитать среднюю точку по вертикали для разных случаев.
Согласно Apple Об обработке текста в iOS , нам нужно знать, как рисуется текст.
Например, я пытаюсь выровнять по вертикали строки будних дней: Sun, Mon, Tue, ....
В этом случае высота текста зависит от высота кепки , и для этих символов нет спуск .Поэтому, если нам нужно выровнять этот текст по центру, мы можем рассчитать смещение верхней части символа верха, например, положение верхней части символа «S».
В соответствии с рисунком ниже:
Верхний пробел для заглавного символа "S" будет
font.ascender - font.capHeight
А нижний пробел для заглавного символа "S" будет
font.descender + font.leading
Так что нам нужно немного сдвинуть "S" с вершины на:
y = (font.ascender - font.capHeight + font.descender + font.leading + font.capHeight) / 2
Это равно:
y = (font.ascender + font.descender + font.leading) / 2
Тогда я могу сделатьвертикальный текст выравнивается по центру.
Вывод:
Если в вашем тексте нет символов, превышающих базовую линию, например, "p", "j", "g"и без символа над верхней частью высоты, например "f".Вы можете использовать приведенную выше формулу для выравнивания текста по вертикали.
y = (font.ascender + font.descender + font.leading) / 2
Если ваш текст содержит символ ниже базовой линии, например, "p", "j" и без символапревышать высоту колпачка, например, «f».Тогда вертикальная формула будет иметь вид:
y = (font.ascender + font.descender) / 2
Если ваш текст включает в себя не включает символ, нарисованный ниже базовой линии, например, "j", "p", и действительно включает символ, нарисованный вышелиния высоты крышки, например, "f".Тогда y будет:
y = (font.descender + font.leading) / 2
Если в вашем тексте будут встречаться все символы, тогда y равно:
y = font.leading / 2