Uneori, formularul de conținut trebuie să umple întregul ecran iOS. Ce faceți atunci când tastatura acoperă UITextField sau UITextView? În acest sfat rapid vă voi demonstra cum să utilizați un UIScrollView pentru a păstra ascunse conținutul formularului atunci când tastatura se află în vedere.
Conform documentației oficiale Apple, cel mai bun mod de a controla o listă verticală stivuită din UITextField
obiecte care pot fi ascunse de o tastatură este de a le încorpora într-o UIScrollView
obiect. Când se afișează tastatura, a UIKeyboardDidShowNotification
este trimis și poate fi utilizat pentru a ajusta câmpurile text afișate. Când captați acest mesaj, trebuie să urmați următorii trei pași:
În primul rând, trebuie să înregistrați doi observatori pentru notificările tastaturii. Unul pentru UIKeyboardDidShowNotification
și una pentru UIKeyboardWillHideNotification
. Noi facem asta în viewDidLoad:
, astfel încât observatorii vor fi înregistrați atunci când vizualizarea este încărcată. Puteți adăuga observatorii cu următorul cod:
[[NSNotificationCenter defaultCenter] addObserver: selector auto: @selector (tastaturăWasShown :) nume: obiect UIKeyboardDidShowNotification: nil]; [[NSNotificationCenter defaultCenter] addObserver: selector auto: @selector (tastaturăWillHide :) nume: obiect UIKeyboardWillHideNotification: nil];
Dacă înregistrați un observator în viewDidLoad:
metoda, ar trebui să o eliminați și în viewDidUnload:
si dealloc:
metode. Deci, adăugați următorul cod la ambele metode:
[[NSNotificationCenter defaultCenter] removeObserver: auto];
keyboardWasShown:
metoda va răspunde la UIKeyboardDidShowNotification:
notificare. În această metodă, vom implementa cele trei pași recomandate de Apple pentru a muta conținutul. Adăugați în proiect codul următor:
- (void) keyboardWasShown: (NSNotification *) notificare // Pasul 1: Obțineți dimensiunea tastaturii. CGSize tastaturăSize = [[[notification userInfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue] .size; // Pasul 2: Ajustați partea de jos a conținutului din vizualizarea dvs. de defilare la înălțimea tastaturii. UIEdgeInsets contentInsets = UIEdgeInsetsMake (0.0, 0.0, tastaturaSize.height, 0.0); theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; // Pasul 3: Derulați câmpul de text țintă în vizualizare. CGRect aRect = auto.view.frame; aRect.size.height - = keyboardSize.height; dacă (! CGRectContainsPoint (aRect, activeTextField.frame.origin)) CGPoint scrollPoint = CGPointMake (0.0, activeTextField.frame.origin.y - (keyboardSize.height-15)); [theScrollView setContentOffset: scrollPoint animat: YES];
În primul pas ajungem la dimensiunea tastaturii. În cel de-al doilea pas, ajustăm partea de jos a conținutului din ecranul de derulare la înălțimea tastaturii. În cel de-al treilea și ultimul pas, vom crea mai întâi o nouă rectă cu înălțimea ecranului minus înălțimea tastaturii. Apoi verificăm dacă câmpul de text activ este sub tastatură. Dacă nu este sub tastatură, vizualizarea scroll nu va actualiza decalajul conținutului. Dacă câmpul de text activ este sub tastatură, actualizăm conținutul ecranului de derulare. Am folosit (keyboardSize.height-15), astfel că câmpul de text activ nu va fi chiar deasupra câmpului de text, dar va avea un interval suplimentar de 15 pixeli între el. activeTextField este o variabilă personalizată care stochează câmpul activ.
Trebuie, de asemenea, să adăugăm keyboardWillHide:
, care va răspunde la UIKeyboardWillHideNotification
. Adăugați în proiect codul următor:
- (void) tastaWillHide: (NSNotification *) notificare UIEdgeInsets contentInsets = UIEdgeInsetsZero; theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets;
Aici am setat contentInset
si scrollIndicatorInsets
din vizualizarea parcurgerii paginii UIEdgeInsetsZero
, astfel încât nu va mai exista o insetă de conținut.
Cu aceste metode urmărim câmpul de text activ:
- (void) textFieldDidBeginEditing: (UITextField *) textField auto.activTextField = textField; - (void) textFieldDidEndEditing: (UITextField *) textField auto.activTextField = nil;
Când începem editarea activeTextField:
este setată în câmpul activ. Când terminăm editarea, activeTextField:
variabila este setată la zero. Rețineți că am declarat activeTextField
proprietate cu (nonatomic, atribuiți)
, astfel încât numărul de retinere nu este niciodată incrementat pentru câmpul de text activ prin atribuirea noastră.
Adăugați acest cod pentru a renunța la tastatură:
- (IBAction) dismissKeyboard: (id) expeditorul [activeTextField resignFirstResponder];
Această acțiune a avut loc didEndOnExit
ca tip de eveniment, deci dacă apăsați pe întoarcere cheie, tastatura va fi respinsă. Trebuie să conectați această acțiune la fiecare câmp de text. De asemenea, conectați delegatul de la fiecare câmp de text la Proprietarul dosarului.
Vă mulțumim că ați citit acest sfat rapid despre mutarea conținutului de sub tastatură! Dacă aveți întrebări sau comentarii cu privire la acest tutorial, lăsați-le în secțiunea de comentarii de mai jos!