Keyboard Avoidance — je technika přizpůsobení rozhraní iOS aplikace při zobrazení systémové klávesnice, která může překrýt textová pole a další interaktivní prvky. Bez implementace tohoto mechanismu uživatel fyzicky nevidí, co zadává, což vede k chybám a zhoršení uživatelského zážitku. Podle Apple Developer Documentation (2026) se od iOS 15 doporučuje používat UIScrollView v kombinaci s UIScrollView.keyboardLayoutGuide pro automatické řízení posunu obsahu.
Hlavní body
Keyboard Avoidance — je soubor technik zajišťujících viditelnost aktivního vstupního pole při zobrazení systémové klávesnice na iOS. Základní problém: klávesnice zabírá až 50 % obrazovky a překrývá spodní polovinu rozhraní, včetně textových polí, tlačítek odeslání a dalších prvků.
Existují tři hlavní přístupy k implementaci: ruční správa prostřednictvím Keyboard Notifications (klasická metoda, funguje od iOS 3.0), použití UIScrollView s automatickým posouváním (doporučeno Apple) a Keyboard Layout Guide (moderní metoda od iOS 15+). Volba závisí na minimální podporované verzi iOS a složitosti rozhraní.
Podle Apple je absence Keyboard Avoidance jedním z nejčastějších důvodů zamítnutí aplikací při recenzi, pokud jsou textová pole zcela zakryta klávesnicí. Pokyny App Store výslovně vyžadují, aby všechny interaktivní prvky zůstaly přístupné během aktivního zadávání.
iOS nemůže automaticky určit, který prvek by měl zůstat viditelný, protože nezná sémantiku rozhraní. V jednoduchém formuláři s jedním textovým polem stačí posunout celou obrazovku. Ve složitém rozhraní s vlastními panely, plovoucími tlačítky a více sekcemi je vyžadována jiná logika chování.
Kromě toho některé aplikace záměrně neposouvají obsah — například kalkulačky s klávesnicí nebo editory, kde je klávesnice součástí pracovní oblasti. Apple ponechává rozhodnutí na vývojáři a poskytuje flexibilní API pro každý scénář.
UIKeyboardWillShowNotification — hlavní oznámení, které iOS odesílá před zobrazením klávesnice. Obsahuje CGRect s konečnou polohou klávesnice ve slovníku UIResponder.keyboardFrameEndUserInfoKey a také dobu trvání animace v UIResponder.keyboardAnimationDurationUserInfoKey.
Obslužná rutina oznámení musí vypočítat překrytí mezi aktivním textovým polem a klávesnicí, poté změnit spodní okraj (contentInset nebo frame) kontejneru. Pokud je pole pod horním okrajem klávesnice, obsah se posune nahoru o hodnotu překrytí. Při skrytí klávesnice se okraj vrátí na původní hodnotu.
@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
}
Při používání oznámení je důležité synchronizovat animaci se systémovou klávesnicí. iOS předává křivku animace (UIResponder.keyboardAnimationCurveUserInfoKey) a dobu trvání. Použijte UIView.animate s těmito parametry, aby se obsah posouval plynule, současně se zobrazením klávesnice.
UIScrollView.keyboardLayoutGuide — je moderní API pro Keyboard Avoidance, představené v iOS 15. Automaticky sleduje polohu klávesnice a aktualizuje omezení Auto Layout, která spojují spodní část rozhraní s horním okrajem klávesnice.
Pro použití stačí aktivovat layout guide v UIScrollView nebo UIStackView a připojit k němu spodní omezení obsahu. Žádná ruční práce s oznámeními, výpočtem výšky a animací není vyžadována — systém dělá vše automaticky, synchronizuje animaci se zobrazením a skrytím klávesnice.
// Povolit Keyboard Layout Guide (iOS 15+)
scrollView.keyboardLayoutGuide.followsUndockedKeyboard = true
// Připojit spodní omezení k horní části klávesnice
contentView.bottomAnchor.constraint(
equalTo: scrollView.keyboardLayoutGuide.topAnchor
).isActive = true
followsUndockedKeyboard — vlastnost, která určuje, zda má guide reagovat na klávesnici, která může být odpojena od spodního okraje (na iPadu). Nastavte na true pouze pokud rozhraní funguje správně s plovoucí klávesnicí. Pro iPhone je tato vlastnost ignorována — klávesnice je vždy připevněna ke spodnímu okraji.
UIScrollView — je kontejner, který Apple doporučuje jako základ pro Keyboard Avoidance. Když se klávesnice objeví, scroll view zvýší svůj contentInset.bottom, což umožní posunout obsah nahoru a zpřístupnit aktivní pole.
Klíčová metoda — scrollRectToVisible, která programově posouvá scroll view tak, aby se zadaný obdélník (aktivní textové pole) nacházel ve viditelné oblasti. Kombinací změny contentInset s voláním scrollRectToVisible zaručíte, že pole není pouze nezakryté, ale nachází se v horní části viditelné oblasti.
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
)
}
}
Pro UIViewController s UITableView Apple doporučuje použití UITableViewController, který automaticky upravuje contentInset při zobrazení klávesnice. Pokud používáte UIViewController s přidanou tabulkou, musíte implementovat Keyboard Avoidance ručně — UITableViewController neposkytuje toto chování pro vlastní kontrolery.
Auto Layout umožňuje implementovat Keyboard Avoidance bez programování animací — stačí změnit aktivitu (isActive) určitého omezení nebo aktualizovat jeho konstantu jako odpověď na oznámení klávesnice.
Typické schéma: vytvořte IBOutlet NSLayoutConstraint pro spodní okraj scroll view nebo obsahu a v obsluze keyboardWillShow nastavte constraint.constant = keyboardHeight, a v keyboardWillHide resetujte na 0. Aktualizujte rozvržení pomocí layoutIfNeeded uvnitř bloku animate pro plynulý přechod.
| Přístup | Verze iOS | Složitost | Doporučení |
|---|---|---|---|
| Keyboard Notifications | iOS 3.0+ | Střední | Pro podporu starých verzí |
| UIScrollView + contentInset | iOS 2.0+ | Nízká | Univerzální metoda, Apple doporučuje |
| Keyboard Layout Guide | iOS 15+ | Minimální | Moderní metoda (iOS 15+) |
| IQKeyboardManager | iOS 8.0+ | Nulová | Rychlé řešení, populární knihovna |
Při použití UIStackView změny omezení spodního okraje také fungují: stack view automaticky přerozděluje podřízené prvky. Pokud se však stack view nachází uvnitř UIScrollView, je vhodnější spravovat contentInset samotného scroll view, nikoli omezení uvnitř něj.
IQKeyboardManager — nejoblíbenější knihovna (více než 16 000 hvězdiček na GitHubu), která implementuje automatické Keyboard Avoidance bez jediného řádku kódu v kontroleru. Používá method swizzling pro sledování textových polí a automaticky zvedá obsah při zobrazení klávesnice.
Knihovna poskytuje flexibilní nastavení: můžete určit vzdálenost mezi polem a klávesnicí, zapnout/vypnout pro jednotlivé kontrolery, nakonfigurovat chování pro UITextView a vlastní vstupní zobrazení. Method swizzling však může kolidovat s jinými knihovnami a Apple tento přístup nedoporučuje pro produkční kód kvůli nepředvídatelným vedlejším účinkům.
Alternativy zahrnují TPKeyboardAvoiding (odlehčená knihovna, ~2000 hvězdiček) a KeyboardManager od komunity. Pro moderní projekty Apple doporučuje používat vestavěné nástroje iOS 15+ a pro projekty s nižší minimální verzí — UIScrollView s contentInset, což je nejspolehlivější vestavěné řešení.
Často kladené otázky
Keyboard Avoidance — je technika posunu rozhraní při zobrazení klávesnice, aby aktivní textové pole zůstalo viditelné. Implementuje se pomocí UIScrollView, Keyboard Notifications nebo Keyboard Layout Guide iOS 15+ pro automatické přizpůsobení rozvržení.
Můžete změnit frame hlavního zobrazení při zobrazení klávesnice, zmenšením jeho výšky o výšku klávesnice. Použijte UIKeyboardWillShowNotification a UIKeyboardWillHideNotification k aktualizaci frame v bloku animace s parametry z userInfo oznámení.
keyboardLayoutGuide — je UILayoutGuide, který se přidává k UIScrollView (iOS 15+). Automaticky sleduje horní okraj klávesnice a aktualizuje svá NSLayoutConstraint omezení při jejím zobrazení a skrytí, synchronizuje animaci se systémovou klávesnicí.
IQKeyboardManager — nejoblíbenější, nevyžaduje kód. TPKeyboardAvoiding — odlehčená alternativa. Pro nové projekty jsou preferovány vestavěné nástroje iOS 15+, protože knihovny třetích stran používají method swizzling, který Apple nedoporučuje.
Pokud používáte IQKeyboardManager, zavolejte enabled = false pro konkrétní UIViewController. Pro ruční implementaci se jednoduše nepřihlaste k odběru oznámení klávesnice na této obrazovce nebo resetujte contentInset na nulu při zobrazení klávesnice.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také