Keyboard Avoidance — је техника прилагођавања интерфејса iOS апликације при појави системске тастатуре, која може прекрити текстуална поља и друге интерактивне елементе. Без имплементације овог механизма, корисник физички не види шта уноси, што доводи до грешака и погоршања корисничког искуства. Према Apple Developer Documentation (2026), од iOS 15 препоручује се коришћење UIScrollView у комбинацији са UIScrollView.keyboardLayoutGuide за аутоматско управљање померањем садржаја.
Главне тачке
Keyboard Avoidance — је скуп техника које обезбеђују видљивост активног поља за унос при појави системске тастатуре на iOS-у. Основни проблем: тастатура заузима до 50% екрана и прекрива доњу половину интерфејса, укључујући текстуална поља, дугмад за слање и друге елементе.
Постоје три главна приступа имплементацији: ручно управљање путем Keyboard Notifications (класични метод, ради од iOS 3.0), коришћење UIScrollView са аутоматским скроловањем (препоручује Apple) и Keyboard Layout Guide (модерни метод од iOS 15+). Избор зависи од минималне подржане верзије iOS-а и сложености интерфејса.
Према Apple-у, недостатак Keyboard Avoidance-а је један од најчешћих разлога одбијања апликација при прегледу, ако су текстуална поља потпуно прекривена тастатуром. App Store смернице изричито захтевају да сви интерактивни елементи остану доступни током активног уноса.
iOS не може аутоматски да одреди који елемент треба да остане видљив, јер не познаје семантику интерфејса. У једноставној форми са једним текстуалним пољем довољно је померити цео екран. У сложеном интерфејсу са прилагођеним панелима, плутајућим дугмадима и више секција потребна је различита логика понашања.
Поред тога, неке апликације намерно не померају садржај — на пример, тастатурни калкулатори или едитори где је тастатура део радног простора. iOS оставља одлуку програмеру, пружајући флексибилне API-је за сваки сценарио.
UIKeyboardWillShowNotification — основно обавештење које iOS шаље пре појаве тастатуре. Садржи CGRect са коначном позицијом тастатуре у речнику UIResponder.keyboardFrameEndUserInfoKey, као и трајање анимације у UIResponder.keyboardAnimationDurationUserInfoKey.
Руковалац обавештења треба да израчуна преклапање између активног текстуалног поља и тастатуре, затим да промени доњу маргину (contentInset или frame) контејнера. Ако се поље налази испод горње ивице тастатуре, садржај се помера нагоре за износ преклапања. При скривању тастатуре, маргина се враћа на првобитну вредност.
@objc func keyboardWillShow(_ notification: Notification) {
guard let keyboardFrame = notification
.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]
as? CGRect else { return }
let keyboardHeight = keyboardFrame.height
scrollView.contentInset.bottom = keyboardHeight
scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
}
При коришћењу обавештења, важно је синхронизовати анимацију са системском тастатуром. iOS преноси криву анимације (UIResponder.keyboardAnimationCurveUserInfoKey) и трајање. Користите UIView.animate са овим параметрима како би се садржај померао глатко, истовремено са појавом тастатуре.
UIScrollView.keyboardLayoutGuide — је модеран API за Keyboard Avoidance, представљен у iOS 15. Аутоматски прати позицију тастатуре и ажурира Auto Layout ограничења која повезују доњи део интерфејса са горњом ивицом тастатуре.
За коришћење, довољно је активирати layout guide у UIScrollView или UIStackView и закачити доње ограничење садржаја за њега. Никакав ручни рад са обавештењима, израчунавањем висине и анимацијом није потребан — систем ради све аутоматски, синхронизујући анимацију са појавом и скривањем тастатуре.
// Омогућите Keyboard Layout Guide (iOS 15+)
scrollView.keyboardLayoutGuide.followsUndockedKeyboard = true
// Закачите доње ограничење за врх тастатуре
contentView.bottomAnchor.constraint(
equalTo: scrollView.keyboardLayoutGuide.topAnchor
).isActive = true
followsUndockedKeyboard — својство које одређује да ли guide треба да реагује на тастатуру која може бити одвојена од доње ивице (на iPad-у). Поставите true само ако интерфејс исправно ради са плутајућом тастатуром. За iPhone ово својство се игнорише — тастатура је увек причвршћена за доњу ивицу.
UIScrollView — је контејнер који Apple препоручује као основу за Keyboard Avoidance. Када се тастатура појави, scroll view повећава свој contentInset.bottom, омогућавајући скроловање садржаја нагоре и чинећи активно поље видљивим.
Кључни метод — scrollRectToVisible, који програмски скролује scroll view тако да се наведени правоугаоник (активно текстуално поље) нађе у видљивом подручју. Комбиновањем промене contentInset-а са позивом scrollRectToVisible, гарантујете да поље не само да није прекривено, већ се налази у горњем делу видљивог подручја.
func adjustScrollForKeyboard(
keyboardHeight: CGFloat,
activeField: UIView
) {
scrollView.contentInset.bottom = keyboardHeight
scrollView.verticalScrollIndicatorInsets.bottom = keyboardHeight
var visibleRect = view.frame
visibleRect.size.height -= keyboardHeight
if activeField.frame.origin.y > visibleRect.maxY {
scrollView.scrollRectToVisible(
activeField.frame, animated: true
)
}
}
За UIViewController са UITableView, Apple препоручује коришћење UITableViewController-а, који аутоматски прилагођава contentInset при појави тастатуре. Ако користите UIViewController са додатом табелом, мораћете ручно да имплементирате Keyboard Avoidance — UITableViewController не пружа ово понашање за прилагођене контролере.
Auto Layout омогућава имплементацију Keyboard Avoidance-а без програмирања анимација — довољно је променити активност (isActive) одређеног ограничења или ажурирати његову константу као одговор на обавештење тастатуре.
Типична шема: креирајте IBOutlet NSLayoutConstraint за доњу маргину scroll view-а или садржаја, и у руковаоцу keyboardWillShow поставите constraint.constant = keyboardHeight, а у keyboardWillHide ресетујте на 0. Ажурирајте layout кроз layoutIfNeeded унутар animate блока за глатку транзицију.
| Приступ | iOS верзија | Сложеност | Препорука |
|---|---|---|---|
| Keyboard Notifications | iOS 3.0+ | Средња | За подршку старих верзија |
| UIScrollView + contentInset | iOS 2.0+ | Ниска | Универзални метод, Apple препоручује |
| Keyboard Layout Guide | iOS 15+ | Минимална | Модерни метод (iOS 15+) |
| IQKeyboardManager | iOS 8.0+ | Нулта | Брзо решење, популарна библиотека |
При коришћењу UIStackView, промене ограничења доње маргине такође раде: stack view аутоматски прерасподељује дочерње елементе. Међутим, ако се stack view налази унутар UIScrollView-а, пожељније је управљати contentInset самог scroll view-а, а не ограничењима унутар њега.
IQKeyboardManager — најпопуларнија библиотека (преко 16.000 звездица на GitHub-у) која имплементира аутоматско Keyboard Avoidance без иједне линије кода у контролеру. Користи method swizzling за праћење текстуалних поља и аутоматски подиже садржај при појави тастатуре.
Библиотека пружа флексибилна подешавања: можете одредити растојање између поља и тастатуре, укључити/искључити за појединачне контролере, конфигурисати понашање за UITextView и прилагођене приказе уноса. Међутим, method swizzling може бити у конфликту са другим библиотекама, а Apple не препоручује овај приступ за продукцијски код због непредвидивих нуспојава.
Алтернативе укључују TPKeyboardAvoiding (лака библиотека, ~2000 звездица) и KeyboardManager из заједнице. За модерне пројекте, Apple препоручује коришћење уграђених алата iOS 15+, а за пројекте са нижом минималном верзијом — UIScrollView са contentInset, који је најпоузданије уграђено решење.
Често постављана питања
Keyboard Avoidance — је техника померања интерфејса при појави тастатуре, како активно текстуално поље остало видљиво. Имплементира се кроз UIScrollView, Keyboard Notifications или Keyboard Layout Guide iOS 15+ за аутоматско прилагођавање layout-а.
Може се променити frame главног view-а при појави тастатуре, смањујући његову висину за висину тастатуре. Користите UIKeyboardWillShowNotification и UIKeyboardWillHideNotification за ажурирање frame-а у блоку анимације са параметрима из userInfo обавештења.
keyboardLayoutGuide — је UILayoutGuide који се додаје на UIScrollView (iOS 15+). Аутоматски прати горњу ивицу тастатуре и ажурира своја NSLayoutConstraint ограничења при њеној појави и скривању, синхронизујући анимацију са системском тастатуром.
IQKeyboardManager — најпопуларнија, не захтева код. TPKeyboardAvoiding — лака алтернатива. За нове пројекте пожељнији су уграђени алати iOS 15+, јер библиотеке треће стране користе method swizzling, који Apple не препоручује.
Ако користите IQKeyboardManager, позовите enabled = false за одређени UIViewController. За ручну имплементацију, једноставно не претплаћујте се на обавештења тастатуре на том екрану или ресетујте contentInset на нулу при појави тастатуре.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође