Как мне вертикально центрировать текст UITextField?
Я просто создаю экземпляр a UITextField и заметив, что текст не центрируется вертикально. Вместо этого он находится вровень с верхней частью моей кнопки, что я нахожу немного странным, так как я ожидаю, что по умолчанию он центрируется вертикально. Как я могу центрировать его вертикально, или есть некоторые настройки по умолчанию, которые мне не хватает?
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/ )когда вы имеете дело только с числами, например, стандартное выравнивание центра будет выглядеть не совсем правильно. Сравните разницу в двух ниже, которые используют одно и то же выравнивание (в приведенном ниже коде), один из которых выглядит правильно, а другой выглядит немного выкл:
не совсем правильно с буквы:
но выглядит хорошо, если это просто цифры
Так что, к сожалению, это может потребоваться немного проб и ошибок и ручной настройки, чтобы получить его глядя визуально правильно.
Я поместил приведенный ниже код в подкласс 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) }
в раскадровке: под управлением - > изменить вертикальное, а также горизонтальное выравнивание, в соответствии с вашими потребностями.
это прекрасно работает для текста текстового поля. Но если вы хотите использовать текст-заполнитель (текст, который будет отображаться, когда текстовое поле пусто), на 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