Как мне вертикально отцентрировать текст UITextField? - PullRequest
142 голосов
/ 26 марта 2011

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

Ответы [ 4 ]

366 голосов
/ 26 марта 2011
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

При быстром использовании:

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
7 голосов
/ 22 июля 2015

Это может иметь несколько усложняющих факторов, на которые ссылались в предыдущих ответах:

  • То, что вы пытаетесь выровнять (только цифры, только буквы, только заглавные буквы или сочетание)
  • заполнители
  • Кнопка очистки

Что вы пытаетесь выровнять, важно, потому что точка шрифта должна быть вертикально центрирована из-за высоты линии, по возрастанию, по убыванию и т. Д.
вертикальные характеристики шрифта http://cdn.ilovetypography.com/img/vert-metrics/gxNh-minion.png
(Изображение благодаря http://ilovetypography.com/2009/01/14/inconspicuous-vertical-metrics/)

Когда вы имеете дело, например, только с числами, стандартное выравнивание по центру будет выглядеть не совсем правильно. Сравните разницу между двумя ниже, которые используют одинаковое выравнивание (в приведенном ниже коде), одно из которых выглядит правильно, а другое выглядит немного не так:

Не совсем верно со смесью букв:

letters not looking centered

но выглядит правильно, если это просто цифры

numbers looking centered

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

Я поместил приведенный ниже код в подкласс UITextField. Он вызывает методы суперкласса, поскольку учитывает наличие кнопки очистки.

override func awakeFromNib() {
    contentVerticalAlignment = UIControlContentVerticalAlignment.Center
}

override func textRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.textRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    let boundsWithClear = super.editingRectForBounds(bounds)
    let delta = CGFloat(1)
    return CGRect(x: boundsWithClear.minX, y: delta, width: boundsWithClear.width, height: boundsWithClear.height - delta/2)
}

override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
    let delta = CGFloat(1)
    return CGRect(x: bounds.minX, y: delta, width: bounds.width, height: bounds.height - delta/2)
}
4 голосов
/ 10 мая 2014

В раскадровке: под контролем -> изменить вертикальное и горизонтальное выравнивание в соответствии с вашими потребностями.

enter image description here

1 голос
/ 07 октября 2013

Это прекрасно работает для текста textField.Но если вы хотите использовать заполнитель текста (текст, который будет отображаться, когда текстовое поле пусто), в iOS 7 вы столкнетесь с проблемами.

Я решил это, переопределив класс TextField и

- (void) drawPlaceholderInRect:(CGRect)rect

method.

Например:

- (void) drawPlaceholderInRect:(CGRect)rect
{
    [[UIColor blueColor] setFill];
    CGRect placeholderRect = CGRectMake(rect.origin.x, (rect.size.height- self.font.pointSize)/2, rect.size.width, self.font.pointSize);
    [[self placeholder] drawInRect:placeholderRect withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment];
}

Работает как для iOS7, так и для более ранних версий.

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