Це потенційно має декілька ускладнюючих факторів, на які згадувалось у попередніх відповідях:
- Що ви намагаєтеся вирівняти (просто цифри, лише букви, лише великі літери або суміш)
- Заповнювачі
- Кнопка очищення
Те, що ви намагаєтеся вирівняти, важливо, тому що точка шрифту має бути вертикально центрована через висоту лінії, висхідні гори, спуски тощо (джерело: 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)
}
textField
є ім'я йогоUITextField
екземпляра - ваш може бути різним. Тож у нього буде щось подібнеUITextField *textField = [[UITextField alloc] init];
. Якщо ви використовуєте інше ім'я змінної (що-небудь інше, ніжtextField
після*
), вам потрібно зробити цеyourDifferentVariableNameHere.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter
.