Як вертикально центрувати текст 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)
}

Я думаю, що placeholderRectForBoundsпростягається занадто багато праворуч. У мене є правильний погляд, і це входить в нього на відміну від інших меж. Я просто реалізувати textRectForBoundsі назвав його від інших 2 funcs :)
Сашо

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, так і для більш ранніх версій.


Як ви впораєтесь із цим у Свіфті? Оскільки у Swift не існує self.placeholder.drawInRect.
Король-Чарівник

це працює, але здається, що self.font.pointSize працює трохи краще, ніж pointSize
ED-209
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.