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



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

707   4  

4 ответов:

textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

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

textField.contentVerticalAlignment = UIControlContentVerticalAlignment.center

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

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

что вы пытаетесь выровнять важно из-за того, какая точка в шрифте должна быть вертикально центрирована из-за высоты линии, восходящих, нисходящих и т. д.
вертикальная характеристики шрифта 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. Он вызывает методы суперкласса, поскольку при этом учитывается кнопка clear подарок.

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)
}

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

enter image description here

это прекрасно работает для текста текстового поля. Но если вы хотите использовать текст-заполнитель (текст, который будет отображаться, когда текстовое поле пусто), на 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, так и для более ранних версий.

Comments

    Ничего не найдено.