Autocapitalization — это механизм iOS, который автоматически преобразует первую букву введённого текста в заглавную в определённых контекстах. UIKit предоставляет свойство autocapitalizationType в протоколе UITextInputTraits с четырьмя режимами: none, words, sentences и allCharacters. По данным Apple Text Programming Guide (2025), правильная настройка автокапитализации улучшает пользовательский опыт и снижает количество ручных исправлений при вводе. Используйте режим sentences для большинства текстовых полей и none для имён пользователей и паролей.
Главное
Autocapitalization (автокапитализация) — это функция операционной системы iOS, которая автоматически преобразует первый символ текста в заглавную букву при наступлении определённых условий. Механизм управляется через свойство autocapitalizationType, доступное для всех элементов, реализующих протокол UITextInputTraits: UITextField, UITextView и UISearchBar.
Функция работает на уровне текстового движка iOS и активируется в момент ввода каждого символа. Система анализирует позицию курсора и окружающий текст, чтобы определить, нужно ли преобразовать текущий вводимый символ в заглавный. Если условие срабатывает, iOS автоматически заменяет строчную букву на прописную до того, как она отобразится в поле.
По данным Apple Human Interface Guidelines (2025), автокапитализация является частью более широкой системы предиктивного ввода, которая также включает автокоррекцию и предиктивный набор текста. Пользователь может отключить все эти функции глобально в настройках системы (Настройки > Основные > Клавиатура), но разработчик также управляет ими на уровне конкретных полей.
В отличие от автокоррекции, автокапитализация не использует языковую модель — она работает по простым правилам: после точки и пробела, в начале текста, после символа новой строки. Исключение составляет режим words, где заглавной становится первая буква каждого слова, независимо от контекста.
UITextAutocapitalizationType — это перечисление из четырёх значений, определяющих стратегию автоматического преобразования регистра. Каждый режим предназначен для определённого типа текстовых полей и решает конкретную задачу пользовательского опыта.
Режим .none полностью отключает автоматическое преобразование регистра. Все символы вводятся в том регистре, в котором пользователь их набирает. Этот режим обязателен для полей паролей, email-адресов, никнеймов, поисковых запросов и любых полей, где регистр имеет значение для обработки данных на сервере.
Режим .words делает заглавной первую букву каждого вводимого слова. Система определяет границу слова по пробелу и преобразует первый символ после пробела в заглавный. Режим удобен для полей ввода имени, фамилии, названий городов, улиц и других полей, где каждое слово должно начинаться с заглавной буквы.
Режим .sentences — наиболее распространённый и используется по умолчанию для большинства текстовых полей. Система делает заглавной первую букву после точки, восклицательного или вопросительного знака, за которым следует пробел. Режим идеально подходит для полей ввода заметок, сообщений, комментариев и других многострочных текстов.
Режим .allCharacters преобразует все вводимые символы в заглавные. Этот режим эквивалентен постоянному нажатию Caps Lock и используется для полей, где данные должны быть в верхнем регистре: почтовые индексы, коды стран, аббревиатуры, номера заказов. Следует применять с осторожностью, так как текст в верхнем регистре хуже читается.
| Режим | Описание | Пример ввода | Рекомендация |
|---|---|---|---|
| .none | Без изменений | john@mail.com | Email, пароли, поиск |
| .words | Каждое слово | Иван Петров | Имя, адрес, город |
| .sentences | Начало предложения | Привет. Как дела? | Сообщения, заметки |
| .allCharacters | Все заглавные | ABC-123 | Коды, индексы |
Механизм автокапитализации активируется на этапе обработки нажатия клавиши, до отображения символа на экране. Когда пользователь нажимает клавишу, UITextInputTraits проверяет текущую позицию курсора и применяет правило преобразования регистра в соответствии с установленным autocapitalizationType.
Для режима .sentences система отслеживает триггерные символы: точка (.), восклицательный знак (!), вопросительный знак (?), а также символ новой строки (\n) при включённом режиме. После обнаружения триггерного символа и следующего за ним пробела система устанавливает флаг «ожидание заглавной буквы» для следующего вводимого символа.
Режим .words отслеживает символ пробела как триггер. После каждого пробела система ожидает заглавную букву для следующего слова. Однако есть исключения: после дефиса, апострофа и других знаков препинания внутри слова заглавная буква не вставляется. Например, «О'Брайен» останется корректным.
Важная особенность — автокапитализация работает только для первого символа слова. Если пользователь вводит слово, содержащее заглавные буквы в середине (например, iPhone или macOS), система не изменяет их, так как преобразование применяется только к первому символу после триггера. Это значит, что названия брендов и продуктов с нестандартным регистром не будут повреждены.
Автокапитализацию следует отключать в полях, где регистр символов имеет значение для корректной обработки данных. Основные случаи: поля ввода email-адресов, никнеймов и имён пользователей, паролей, поисковых запросов, URL-адресов, кодов подтверждения, IMEI и серийных номеров. Во всех этих случаях автоматическое изменение регистра приведёт к ошибкам при обработке на сервере.
Для поисковых строк (UISearchBar) автокапитализация по умолчанию отключена, что соответствует ожиданиям пользователей. Поисковый запрос может быть введён в любом регистре, и сервер обычно приводит его к нижнему регистру самостоятельно. Если включить автокапитализацию для поиска, пользователь будет каждый раз вручную исправлять заглавную букву в начале запроса.
В формах регистрации поле username или nickname должно иметь режим .none, так как многие системы различают регистр символов в именах пользователей. Поле email также должно быть без автокапитализации — хотя доменные имена не чувствительны к регистру, локальная часть email теоретически может различать регистр, хотя на практике это встречается редко.
По данным Apple Developer Documentation, поля с secureTextEntry (пароли) автоматически наследуют autocapitalizationType = .none, даже если разработчик явно установил другое значение. Система имеет наивысший приоритет для защищённого ввода и игнорирует любые попытки включить автокапитализацию для поля пароля.
Настройка автокапитализации в Swift выполняется через свойство autocapitalizationType. Свойство доступно для UITextField, UITextView и UISearchBar. Значение можно установить как в коде, так и через Interface Builder в инспекторе атрибутов, где режим называется Capitalization.
let nameField = UITextField()
nameField.autocapitalizationType = .words
let emailField = UITextField()
emailField.autocapitalizationType = .none
Для формы контактов настройте каждое поле в соответствии с его семантикой: имя — .words, email — .none, сообщение — .sentences. Такая комбинация обеспечивает наилучший пользовательский опыт и минимизирует необходимость ручного исправления регистра.
class ContactFormViewController: UIViewController {
@IBOutlet var nameField: UITextField!
@IBOutlet var emailField: UITextField!
@IBOutlet var messageView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
nameField.autocapitalizationType = .words
emailField.autocapitalizationType = .none
messageView.autocapitalizationType = .sentences
}
}
Для программного изменения режима в рантайме используйте делегат UITextFieldDelegate. Например, если поле может использоваться в разных контекстах, изменяйте autocapitalizationType в методе textFieldDidBeginEditing в зависимости от текущего режима работы формы.
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField === codeField {
textField.autocapitalizationType = .allCharacters
}
}
Автокапитализация зависит от языка ввода, установленного на клавиатуре пользователя. Для разных языков правила преобразования регистра могут отличаться. Например, в турецком языке буква «i» в верхнем регистре превращается в «İ» (с точкой), а «I» в нижнем регистре — в «ı» (без точки). iOS учитывает эти особенности автоматически.
Для русского языка автокапитализация работает по тем же правилам, что и для английского: заглавная буква после точки, в начале предложения и после новой строки. Проблемы могут возникнуть с буквой «ё» — хотя она присутствует в системном словаре, не все клавиатурные раскладки отображают её на основном слое, и автокапитализация корректно преобразует «ё» в «Ё».
Для китайского, японского и корейского языков автокапитализация не применяется, так как в этих языках нет понятия регистра. Режим autocapitalizationType игнорируется системой при использовании соответствующих клавиатур, и поле ведёт себя так же, как при режиме .none, независимо от установленного значения.
Для арабского языка и иврита автокапитализация также не применяется, так как эти языки используют собственную систему письма без разделения на строчные и заглавные буквы. Система iOS корректно определяет язык ввода и игнорирует настройки автокапитализации для языков, где это понятие отсутствует.
Часто задаваемые вопросы
Да, свойство autocapitalizationType можно изменять в любой момент, даже когда поле уже активно. Изменение вступит в силу при следующем вводе символа.
Да, для полей с isSecureTextEntry = true система автоматически устанавливает autocapitalizationType = .none. Изменить это поведение программно невозможно.
Да, UITextView полностью поддерживает autocapitalizationType. Это особенно полезно для многострочных полей, где режим .sentences работает наиболее естественно.
Если поле не помечено как secureTextEntry, но используется для ввода пароля, автокапитализация может изменить пароль. Всегда отключайте её для полей, где регистр имеет значение.
На симуляторе автокапитализация работает через аппаратную клавиатуру Mac и может вести себя иначе. Тестируйте на реальном устройстве для корректного поведения.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также