Keyboard Avoidance — istota, metody implementacji i przesunięcie interfejsu

Autor: IT Sectr Opublikowano: 2026-07-09 Czas czytania: 9 min

Keyboard Avoidance — to technika adaptacji interfejsu aplikacji iOS po pojawieniu się klawiatury systemowej, która może zasłonić pola tekstowe i inne elementy interaktywne. Bez implementacji tego mechanizmu użytkownik fizycznie nie widzi, co wpisuje, co prowadzi do błędów i pogorszenia doświadczenia. Według Apple Developer Documentation (2026), od iOS 15 zaleca się używanie UIScrollView w połączeniu z UIScrollView.keyboardLayoutGuide do automatycznego zarządzania przesunięciem treści.

Najważniejsze

  • Keyboard Avoidance — przesunięcie treści w górę po pojawieniu się klawiatury, aby aktywne pole tekstowe pozostało widoczne.
  • UIKeyboardWillShowNotification i UIKeyboardWillHideNotification dostarczają rozmiar i animację klawiatury do adaptacji layoutu.
  • UIScrollView.keyboardLayoutGuide (iOS 15+) automatycznie zarządza odstępami przy pojawianiu się i ukrywaniu klawiatury.
  • IQKeyboardManager — popularna biblioteka zewnętrzna do automatycznego Keyboard Avoidance bez ręcznego kodu.
  • UITextFieldDelegate pozwala śledzić początek i koniec edycji w celu precyzyjnego zarządzania przesunięciem.

Co to jest Keyboard Avoidance

Keyboard Avoidance — to zbiór technik zapewniających widoczność aktywnego pola wprowadzania po pojawieniu się klawiatury systemowej na iOS. Podstawowy problem: klawiatura zajmuje do 50% ekranu i zasłania dolną połowę interfejsu, w tym pola tekstowe, przyciski wysyłania i inne elementy.

Istnieją trzy główne podejścia do implementacji: ręczne zarządzanie przez Keyboard Notifications (klasyczna metoda, działa od iOS 3.0), użycie UIScrollView z automatycznym przewijaniem (zalecane przez Apple) oraz Keyboard Layout Guide (nowoczesna metoda od iOS 15+). Wybór zależy od minimalnej obsługiwanej wersji iOS i złożoności interfejsu.

Według Apple, brak Keyboard Avoidance jest jedną z najczęstszych przyczyn odrzucania aplikacji podczas recenzji, jeśli pola tekstowe są całkowicie zasłonięte przez klawiaturę. Wytyczne App Store wyraźnie wymagają, aby wszystkie elementy interaktywne pozostały dostępne podczas aktywnego wprowadzania.

Dlaczego iOS nie robi tego automatycznie

iOS nie może automatycznie określić, który element powinien pozostać widoczny, ponieważ nie zna semantyki interfejsu. W prostym formularzu z jednym polem tekstowym wystarczy przesunąć cały ekran. W złożonym interfejsie z niestandardowymi panelami, pływającymi przyciskami i wieloma sekcjami wymagana jest inna logika zachowania.

Ponadto niektóre aplikacje celowo nie przesuwają treści — na przykład kalkulatory klawiaturowe lub edytory, gdzie klawiatura jest częścią obszaru roboczego. iOS pozostawia decyzję programiście, dostarczając elastyczne API dla każdego scenariusza.

Keyboard Frame Notifications

UIKeyboardWillShowNotification — podstawowe powiadomienie, które iOS wysyła przed pojawieniem się klawiatury. Zawiera CGRect z końcową pozycją klawiatury w słowniku UIResponder.keyboardFrameEndUserInfoKey, a także czas trwania animacji w UIResponder.keyboardAnimationDurationUserInfoKey.

Handler powiadomienia powinien obliczyć nakładanie między aktywnym polem tekstowym a klawiaturą, a następnie zmienić dolny odstęp (contentInset lub frame) kontenera. Jeśli pole znajduje się poniżej górnej krawędzi klawiatury, treść przesuwa się w górę o wielkość nakładania. Przy ukrywaniu klawiatury odstęp wraca do pierwotnej wartości.

swift
@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
}

Przy użyciu powiadomień ważne jest synchronizowanie animacji z systemową klawiaturą. iOS przekazuje krzywą animacji (UIResponder.keyboardAnimationCurveUserInfoKey) i czas trwania. Użyj UIView.animate z tymi parametrami, aby treść przesuwała się płynnie, jednocześnie z pojawieniem się klawiatury.

Keyboard Layout Guide w iOS 15+

UIScrollView.keyboardLayoutGuide — to nowoczesne API do Keyboard Avoidance, wprowadzone w iOS 15. Automatycznie śledzi pozycję klawiatury i aktualizuje ograniczenia Auto Layout, łączące dolną część interfejsu z górną krawędzią klawiatury.

Do użycia wystarczy aktywować layout guide w UIScrollView lub UIStackView i przypiąć do niego dolne ograniczenie treści. Żadnej ręcznej pracy z powiadomieniami, obliczaniem wysokości i animacją — system robi wszystko automatycznie, synchronizując animację z pojawianiem się i ukrywaniem klawiatury.

swift
// Włącz Keyboard Layout Guide (iOS 15+)
scrollView.keyboardLayoutGuide.followsUndockedKeyboard = true

// Przypnij dolne ograniczenie do góry klawiatury
contentView.bottomAnchor.constraint(
    equalTo: scrollView.keyboardLayoutGuide.topAnchor
).isActive = true

followsUndockedKeyboard — właściwość określająca, czy guide ma reagować na klawiaturę, która może być odłączona od dolnej krawędzi (na iPadzie). Ustaw true, tylko jeśli interfejs działa poprawnie z pływającą klawiaturą. Dla iPhone ta właściwość jest ignorowana — klawiatura jest zawsze przymocowana do dolnej krawędzi.

UIScrollView i klawiatura

UIScrollView — to kontener, który Apple zaleca używać jako podstawę dla Keyboard Avoidance. Kiedy klawiatura się pojawia, scroll view zwiększa swój contentInset.bottom, umożliwiając przewinięcie treści w górę i uczynienie aktywnego pola widocznym.

Kluczowa metoda — scrollRectToVisible, która programowo przewija scroll view tak, aby określony prostokąt (aktywne pole tekstowe) znalazł się w widocznym obszarze. Łącząc zmianę contentInset z wywołaniem scrollRectToVisible, gwarantujesz, że pole nie tylko nie jest zasłonięte, ale znajduje się w górnej części widocznego obszaru.

swift
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
        )
    }
}

Dla UIViewController z UITableView Apple zaleca używanie UITableViewController, który automatycznie koryguje contentInset po pojawieniu się klawiatury. Jeśli używasz UIViewController z dodaną tabelą, musisz zaimplementować Keyboard Avoidance ręcznie — UITableViewController nie zapewnia tego zachowania dla niestandardowych kontrolerów.

Auto Layout i Keyboard Avoidance

Auto Layout pozwala zaimplementować Keyboard Avoidance bez programowania animacji — wystarczy zmienić aktywność (isActive) określonego ograniczenia lub zaktualizować jego stałą w odpowiedzi na powiadomienie klawiatury.

Typowy schemat: utwórz IBOutlet NSLayoutConstraint dla dolnego odstępu scroll view lub treści, a w handlerze keyboardWillShow ustaw constraint.constant = keyboardHeight, a w keyboardWillHide — zresetuj do 0. Zaktualizuj layout przez layoutIfNeeded wewnątrz bloku animate dla płynnego przejścia.

PodejścieWersja iOSZłożonośćZalecenie
Keyboard NotificationsiOS 3.0+ŚredniaDla wsparcia starszych wersji
UIScrollView + contentInsetiOS 2.0+NiskaUniwersalna metoda, Apple zaleca
Keyboard Layout GuideiOS 15+MinimalnaNowoczesna metoda (iOS 15+)
IQKeyboardManageriOS 8.0+ZerowaSzybkie rozwiązanie, popularna biblioteka

Przy użyciu UIStackView zmiany ograniczeń dolnego odstępu również działają: stack view automatycznie rozdziela elementy potomne. Jeśli jednak stack view znajduje się wewnątrz UIScrollView, lepiej zarządzać contentInset samego scroll view, a nie ograniczeniami wewnątrz niego.

Rozwiązania zewnętrzne dla Keyboard Avoidance

IQKeyboardManager — najpopularniejsza biblioteka (ponad 16 000 gwiazdek na GitHub), która implementuje automatyczny Keyboard Avoidance bez ani jednej linii kodu w kontrolerze. Używa method swizzling do śledzenia pól tekstowych i automatycznie podnosi treść po pojawieniu się klawiatury.

Biblioteka oferuje elastyczne ustawienia: można określić odległość między polem a klawiaturą, włączyć/wyłączyć dla poszczególnych kontrolerów, skonfigurować zachowanie dla UITextView i niestandardowych input view. Jednak method swizzling może kolidować z innymi bibliotekami, a Apple nie zaleca tego podejścia dla kodu produkcyjnego ze względu na nieprzewidywalne efekty uboczne.

Alternatywy obejmują TPKeyboardAvoiding (lekka biblioteka, ~2000 gwiazdek) i KeyboardManager od społeczności. Dla nowoczesnych projektów Apple zaleca używanie wbudowanych narzędzi iOS 15+, a dla projektów z niższą minimalną wersją — UIScrollView z contentInset, który jest najbardziej niezawodnym wbudowanym rozwiązaniem.

Często zadawane pytania

Co to jest Keyboard Avoidance w iOS?

Keyboard Avoidance — to technika przesuwania interfejsu po pojawieniu się klawiatury, aby aktywne pole tekstowe pozostało widoczne. Implementuje się ją przez UIScrollView, Keyboard Notifications lub Keyboard Layout Guide iOS 15+ do automatycznej adaptacji layoutu.

Jak zaimplementować Keyboard Avoidance bez UIScrollView?

Można zmienić frame głównego view po pojawieniu się klawiatury, zmniejszając jego wysokość o wysokość klawiatury. Użyj UIKeyboardWillShowNotification i UIKeyboardWillHideNotification, aby aktualizować frame w bloku animacji z parametrami z userInfo powiadomienia.

Jak działa keyboardLayoutGuide?

keyboardLayoutGuide — to UILayoutGuide, który jest dodawany do UIScrollView (iOS 15+). Automatycznie śledzi górną krawędź klawiatury i aktualizuje swoje NSLayoutConstraint po jej pojawieniu się i ukryciu, synchronizując animację z systemową klawiaturą.

Jakie są zewnętrzne biblioteki dla Keyboard Avoidance?

IQKeyboardManager — najpopularniejsza, nie wymaga kodu. TPKeyboardAvoiding — lekka alternatywa. Dla nowych projektów preferowane są wbudowane narzędzia iOS 15+, ponieważ biblioteki zewnętrzne używają method swizzling, którego Apple nie zaleca.

Jak wyłączyć Keyboard Avoidance dla konkretnego ekranu?

Jeśli używasz IQKeyboardManager, wywołaj enabled = false dla konkretnego UIViewController. Dla ręcznej implementacji po prostu nie subskrybuj powiadomień klawiatury na tym ekranie lub resetuj contentInset do zera po pojawieniu się klawiatury.

Podsumowanie

  • Keyboard Avoidance — obowiązkowa technika dla aplikacji iOS z wprowadzaniem tekstu, zapobiegająca zasłanianiu pól przez klawiaturę.
  • UIKeyboardWillShowNotification i UIKeyboardWillHideNotification — klasyczne API do ręcznego zarządzania przesunięciem treści.
  • UIScrollView z contentInset i scrollRectToVisible — uniwersalne rozwiązanie zalecane przez Apple.
  • Keyboard Layout Guide (iOS 15+) — nowoczesna metoda bez ręcznych powiadomień, używająca Auto Layout.
  • Ograniczenia Auto Layout z aktualizacją constant w bloku animacji zapewniają płynne przejście treści.
  • IQKeyboardManager — popularna biblioteka zewnętrzna do szybkiego wdrożenia, ale z ograniczeniami method swizzling.
  • Apple zaleca UIScrollView z keyboardLayoutGuide dla projektów z iOS 15+ i contentInset dla projektów ze starszymi wersjami.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również