Как вертикально отцентрировать текст UITextField?

143

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

детеныш
источник

Ответы:

369
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

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

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center
Роджер
источник
1
@ user353877: Это все еще работает нормально. Обратите внимание, что в ответе Роджера textFieldуказано имя его UITextFieldэкземпляра - ваш может отличаться. Так что у него будет что-то подобное UITextField *textField = [[UITextField alloc] init];. Если вы используете другое имя переменной (что угодно, кроме textFieldпосле *), вам нужно сделать это yourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenterвместо.
GeneralMike
@ user353877 Добавьте точку прямо перед «Центром»: UIControlContentVerticalAlignment.Center;
Джош
1
Есть ли такой же метод для UITextView?
CaffeineShots
Есть ли быстрый эквивалент для этого свойства?
демонофизист
2
В Swift 3.0 это рекомендуемый способ использования enum:textField.contentVerticalAlignment = .center
Glenn
9

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

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

То, что вы пытаетесь выровнять, важно, потому что точка шрифта должна быть вертикально отцентрирована из-за высоты линии, возрастания, спуска и т. Д. (Источник: ilovetypography.com ) (Изображение благодаря http://ilovetypography.com/2009 / 01/14 / незаметно-вертикальная метрика / )
характеристики вертикального шрифта


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

Не совсем правильно со смесью букв:

буквы не выглядят по центру

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

числа выглядят по центру

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

Я поместил приведенный ниже код в подкласс 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)
}
ginchly
источник
Я думаю, что placeholderRectForBoundsпростирается слишком много вправо. У меня есть правильное представление, и это входит в это в отличие от других границ. Я только что реализовал textRectForBoundsи вызвал его из двух других функций :)
Сашо
5

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

введите описание изображения здесь

Кумар К.Л.
источник
1

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

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

- (void) drawPlaceholderInRect:(CGRect)rect

метод.

Как это:

- (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 и более ранних версий.

ancajic
источник
Как вы справляетесь с этим в Swift? Потому что self.placeholder.drawInRect не существует в Swift.
Король-волшебник
это работает, но self.font.pointSize, кажется, работает немного лучше, чем pointSize
ED-209