iOS SDK păstrarea conținutului de sub tastatură

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:

    яя я
  1. Determinați dimensiunea tastaturii.
  2. Actualizați conținutul inferior al conținutului din ecranul de derulare a conținutului până la înălțimea tastaturii.
  3. Derulați conținutul țintă în vizualizare.

Înregistrați observatori de la tastatură

Î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];

Adăugați metoda KeyboardWasShown

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.

Adăugați metoda KeyboardWillHide

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.

Urmărirea Active UITextField

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ă.

Renunțați la tastatură

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.

Învelire

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!

Cod