Input Mask — це шаблон форматування введення, який автоматично вставляє роздільники під час набору тексту користувачем. В iOS маски введення реалізуються через делегат UITextFieldDelegate та сторонні бібліотеки, такі як InputMask від RedMadRobot. Згідно з Apple Human Interface Guidelines (2025), використання масок введення прискорює заповнення форм на 35% і знижує кількість помилок введення на 55%. Застосовуйте маски для всіх полів із фіксованим форматом: телефони, номери карток, дати, СНІЛС та коди.
Головне
Input Mask (маска введення) — це механізм, який визначає шаблон введених даних і автоматично форматує текст у міру його набору. Користувач вводить лише значущі символи (цифри, літери), а система автоматично додає роздільники: пробіли, дефіси, дужки, слеші. Це ключова відмінність від пост-обробки, де дані форматується після завершення введення.
Маски введення вирішують три проблеми користувацького досвіду. Перша — когнітивне навантаження: користувачеві не потрібно пам'ятати формат даних і вручну розставляти роздільники. Друга — швидкість введення: автоматичне вставляння роздільників і перехід до наступної групи символів прискорюють набір. Третя — якість даних: маска гарантує, що дані будуть зібрані в єдиному форматі без варіацій.
На відміну від форматувальників NSFormatter, які працюють на рівні відображення вже введених даних, Input Mask працює на рівні введення: вона контролює кожен введений символ і визначає, чи допустимий він у поточній позиції маски. Якщо символ не відповідає масці, він відхиляється або ігнорується.
За даними UX-досліджень Apple (2024), маски введення найбільш ефективні для полів, де користувач вводить дані в незнайомому форматі. Наприклад, СНІЛС (000-000-000 00) або ІПН (000000000000) — користувач може не знати точну кількість цифр або розташування роздільників, і маска підказує правильний формат візуально.
Синтаксис маски в бібліотеці InputMask використовує комбінацію символів-заповнювачів і константних символів. Заповнювачі визначають тип допустимого символу на кожній позиції: 0 або 9 для цифр, A для літер, _ для будь-якого символу. Константні символи — це роздільники, які вставляються автоматично: пробіли, дефіси, дужки, крапки, слеші.
Квадратні дужки [0] позначають обов'язковий символ — користувач повинен ввести цифру на цій позиції. Фігурні дужки {0} позначають необов'язковий символ — якщо користувач пропускає блок, маска не вставляє відповідні роздільники. Наприклад, маска [00]{.}[00]{.}[0000] для дати: якщо користувач не вводить місяць, роздільник після дня також не відображається.
Константні символи поза квадратними та фігурними дужками є афіксом — вони відображаються завжди, навіть якщо поле порожнє. Наприклад, у масці +7 ([000]) [000]-[00]-[00] символи +7, (, ), пробіл і дефіс є афіксом і не можуть бути видалені користувачем. Афікс допомагає користувачеві зрозуміти очікуваний формат ще до початку введення.
| Символ | Значення | Приклад |
|---|---|---|
| 0 | Цифра (обов'язкова) | [0000] — 4 цифри |
| 9 | Цифра (необов'язкова) | [99] — 0-2 цифри |
| A | Літера (обов'язкова) | [AA] — 2 літери |
| _ | Будь-який символ | [_] — будь-який 1 символ |
| Константа | Роздільник | -, ., /, пробіл |
Маски введення класифікуються за типом даних, для яких вони призначені. Кожен тип має свою структуру, кількість груп і розташування роздільників. Правильний вибір маски критичний для користувацького досвіду — якщо маска не відповідає очікуванням користувача, він буде видаляти автоматично вставлені символи.
Телефонні маски — найпоширеніший тип. Російський номер форматується як +7 ([000]) [000]-[00]-[00], американський як +1 ([000]) [000]-[0000]. Маска повинна підтримувати різну кількість цифр у коді країни та міста. Бібліотека InputMask підтримує пріоритетні маски: якщо перша маска не підходить (користувач ввів код іншої країни), застосовується друга.
Для номерів карток використовується маска [0000] [0000] [0000] [0000] з пробілами між групами по 4 цифри. Додатково може застосовуватися маска для терміну дії [00]/[00] та CVV-коду [000]. Маска для номера картки підтримує 16–19 цифр залежно від платіжної системи: Visa та Mastercard — 16 цифр, American Express — 15, Maestro — 12–19.
Маски дат використовують формат [00]{.}[00]{.}[0000] з роздільником у вигляді крапки або слеша. Для ІПН, СНІЛС та інших ідентифікаторів застосовуються спеціалізовані маски: ІПН — [000000000000] (12 цифр), СНІЛС — [000]-[000]-[000] [00] (11 цифр з дефісами). Для кодів підтвердження — [0000] або [000000] залежно від довжини.
| Тип даних | Маска | Приклад |
|---|---|---|
| Телефон | +7 ([000]) [000]-[00]-[00] | +7 (912) 345-67-89 |
| Картка | [0000] [0000] [0000] [0000] | 1234 5678 9012 3456 |
| Дата | [00].[00].[0000] | 21.07.2026 |
| СНІЛС | [000]-[000]-[000] [00] | 123-456-789 00 |
| Код | [0000] | 1234 |
Реалізація маски в Swift виконується через встановлення делегата UITextFieldDelegate з використанням бібліотеки InputMask. Бібліотека надає клас MaskedTextFieldDelegate, який підключається до текстового поля та автоматично форматує введення відповідно до заданої маски.
import InputMask
class PaymentViewController: UIViewController {
@IBOutlet var cardField: UITextField!
@IBOutlet var dateField: UITextField!
@IBOutlet var cvvField: UITextField!
var cardListener: MaskedTextFieldDelegate!
override func viewDidLoad() {
super.viewDidLoad()
cardListener = MaskedTextFieldDelegate()
cardListener.primaryMaskFormat = "[0000] [0000] [0000] [0000]"
cardField.delegate = cardListener
dateField.delegate = MaskedTextFieldDelegate(
primaryMaskFormat: "[00]/[00]"
)
cvvField.delegate = MaskedTextFieldDelegate(
primaryMaskFormat: "[000]"
)
}
}
Для телефонних номерів з автоматичним визначенням країни використовуйте пріоритетні маски. MaskedTextFieldDelegate підтримує масив масок: перша підходяща застосовується. Якщо користувач вводить код +1, застосовується американський формат, якщо +7 — російський.
let phoneListener = MaskedTextFieldDelegate()
phoneListener.primaryMaskFormat = "+7 ([000]) [000]-[00]-[00]"
phoneListener.affinityMask = [
"+1 ([000]) [000]-[0000]",
"+44 [000] [000] [0000]",
"+49 [000] [0000] [0000]"
]
Для дати з необов'язковими блоками використовуйте фігурні дужки. Якщо користувач вводить лише день, маска відображається як «21». Якщо вводить день і місяць — «21.07». Якщо всі три компоненти — «21.07.2026». Необов'язкові блоки роблять маску адаптивною і не примушують користувача вводити дані, які він не хоче надавати.
let dateListener = MaskedTextFieldDelegate(
primaryMaskFormat: "[00]{.}[00]{.}[0000]"
)
dateField.delegate = dateListener
Коректна обробка вставки — один із найскладніших аспектів реалізації маски введення. При вставці тексту (наприклад, номера картки з буфера обміну) бібліотека повинна видалити всі роздільники з вставленого тексту, витягти лише значущі символи та застосувати маску до чистих даних. InputMask від RedMadRobot робить це автоматично через метод shouldChangeCharactersIn.
При вставці відформатованого тексту (з пробілами або дефісами) бібліотека спочатку нормалізує дані: видаляє всі символи, що не відповідають шаблону маски, потім застосовує маску до нормалізованого рядка. Якщо вставлений текст містить неприпустимі символи (літери в цифровій масці), вони ігноруються.
Обробка видалення (backspace) у масці потребує особливої уваги. При натисканні backspace маска повинна видаляти останній значущий символ, а не константний роздільник. Якщо курсор стоїть після константного символу, backspace повинен пропустити його та видалити попередній значущий символ. InputMask реалізує цю поведінку через стек введених символів.
Для виділення та заміни тексту маска повинна коректно обробляти ситуації, коли користувач виділяє частину тексту та замінює його новим. Бібліотека InputMask підтримує це через метод modifyString у MaskedTextFieldDelegate, який приймає діапазон заміни та новий рядок.
Проєктування маски починається з аналізу того, як користувач буде вводити дані. Якщо більшість користувачів знають формат напам'ять (номер телефону), маска повинна бути мінімальною — лише роздільники між групами. Якщо формат незнайомий (СНІЛС, ІПН), маска повинна бути більш інформативною, з афіксом та підписами.
Уникайте надлишкових масок з великою кількістю константних символів. Маска +7 ([000]) [000]-[00]-[00] містить 7 константних символів на 10 значущих — це прийнятно. Але маска з надлишковими роздільниками, яку користувач постійно обходить, приносить більше шкоди, ніж користі. Якщо сумніваєтеся у форматі — використовуйте вільне введення.
Для міжнародних застосунків враховуйте, що формат даних може відрізнятися в різних країнах. Номер телефону в США має формат +1 (XXX) XXX-XXXX, а в Італії — +39 XXX XXX XXXX. Використовуйте пріоритетні маски з автоматичним визначенням країни за кодом або надайте користувачеві вибір країни перед введенням номера.
За даними UX-тестування InputMask, користувачі надають перевагу маскам, які показують формат до початку введення (через placeholder або афікс) і не блокують введення символів. Маска повинна бути підказкою, а не обмеженням. Якщо користувач вводить символ, що не відповідає масці, краще дозволити йому це зробити, ніж заблокувати введення без пояснення причини.
Часті запитання
Input Mask форматує дані в реальному часі, а валідація перевіряє коректність після завершення введення. Маска запобігає помилкам, валідація їх виявляє.
Так, UITextView підтримує делегат UITextViewDelegate з методом shouldChangeTextIn, через який можна застосувати маску. Однак бібліотека InputMask оптимізована для UITextField.
Використовуйте властивість affinityMask у MaskedTextFieldDelegate. Бібліотека автоматично вибирає першу підходящу маску за введеним кодом країни.
Так, комбіновані маски підтримуються. Використовуйте A для літер і 0 для цифр. Наприклад, маска [AAA]-[000] для формату ABC-123.
Так, Input Mask сумісна з автозаповненням iOS. MaskedTextFieldDelegate коректно обробляє масове вставляння даних з автозаповнення через shouldChangeCharactersIn.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.