Noen ganger må skjemainnhold fylle hele IOS-skjermen. Så hva gjør du når tastaturet dekker din UITextField eller UITextView? I dette raske tipset vil jeg demonstrere hvordan du bruker en UIScrollView for å holde skjeminnholdet ditt skjult når tastaturet glir inn.
Ifølge den offisielle Apple-dokumentasjonen, den beste måten å kontrollere en vertikalt stablet liste over UITextField
Objekter som kan være skjult av et tastatur, er å legge dem inn i en UIScrollView
gjenstand. Når tastaturet vises, a UIKeyboardDidShowNotification
er sendt og kan brukes til å justere de viste tekstfeltene. Når du treffer denne meldingen, må du ta følgende tre trinn:
Først må vi registrere to observatører for tastaturvarslene. En for UIKeyboardDidShowNotification
og en for UIKeyboardWillHideNotification
. Vi gjør dette i viewDidLoad:
metode, så observatørene vil bli registrert når visningen er lastet. Du kan legge til observatørene med følgende kode:
[[NSNotificationCenter defaultCenter] addObserver: selvvelger: @selector (keyboardWasShown :) navn: UIKeyboardDidShowNotification objekt: null]; [[NSNotificationCenter defaultCenter] addObserver: selvvelger: @selector (keyboardWillHide :) navn: UIKeyboardWillHideNotification objekt: null];
Hvis du registrerer en observatør i viewDidLoad:
metode, bør du også fjerne den i viewDidUnload:
og dealloc:
metoder. Så legg til følgende kode for begge disse metodene:
[[NSNotificationCenter defaultCenter] removeObserver: self];
De keyboardWasShown:
Metoden vil svare på UIKeyboardDidShowNotification:
melding. I denne metoden vil vi implementere de tre trinnene som Apple anbefaler for å flytte innholdet. Legg til følgende kode i prosjektet ditt:
- (void) keyboardWasShown: (NSNotification *) varsel // Trinn 1: Få størrelsen på tastaturet. CGSize keyboardSize = [[[notification userInfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue] .size; // Trinn 2: Juster bunninnholdsinnsatsen på rullevisningen ved hjelp av tastaturhøyde. UIEdgeInsets contentInsets = UIEdgeInsetsMake (0.0, 0.0, keyboardSize.height, 0.0); theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; // Trinn 3: Rull måltekstfeltet til visning. CGRect aRect = self.view.frame; aRect.size.height - = keyboardSize.height; hvis (! CGRectContainsPoint (aRect, activeTextField.frame.origin)) CGPoint scrollPoint = CGPointMake (0.0, activeTextField.frame.origin.y - (keyboardSize.height-15)); [theScrollView setContentOffset: scrollPoint animert: YES];
I første trinn får vi størrelsen på tastaturet. I det andre trinnet justerer vi bunninnholdsinnsatsen på rullevisningen ved hjelp av tastaturhøyde. I tredje og siste trinn oppretter vi først en ny rekt med skjermens høyde minus tastaturets høyde. Deretter sjekker vi om det aktive tekstfeltet er under tastaturet. Hvis det ikke er under tastaturet, vil ikke rullevisningen oppdatere innholdsforskyvningen. Hvis det aktive tekstfeltet er under tastaturet, oppdaterer vi rullevisningens innholdsforskyvning. Jeg brukte (keyboardSize.height-15), så det aktive tekstfeltet kommer ikke rett over tekstfeltet, men vil ha ytterligere 15 piksler av mellomrom mellom det. activeTextField er en tilpasset variabel som lagrer det aktive feltet.
Vi må også legge til keyboardWillHide:
metode, som vil svare på UIKeyboardWillHideNotification
. Legg til følgende kode i prosjektet ditt:
- (void) keyboardWillHide: (NSNotification *) varsel UIEdgeInsets contentInsets = UIEdgeInsetsZero; theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets;
Her setter vi contentInset
og scrollIndicatorInsets
av rullevisningen til UIEdgeInsetsZero
, så det vil ikke være et innholdsinnspill lenger.
Med disse metodene sporer vi det aktive tekstfeltet:
- (void) textFieldDidBeginEditing: (UITextField *) textField self.activeTextField = textField; - (void) textFieldDidEndEditing: (UITextField *) textField self.activeTextField = nil;
Når vi begynner med redigering av activeTextField:
variabel er satt til det aktive feltet. Når vi slutter å redigere, activeTextField:
variabel er satt til null. Legg merke til at vi erklærte activeTextField
eiendom med (ikkeatomisk, tilordne)
, så beholdningstallet økes aldri for det aktive tekstfeltet ved vårt oppdrag.
Legg til denne koden for å avvise tastaturet:
- (IBAction) dismissKeyboard: (id) avsender [activeTextField resignFirstResponder];
Denne handlingen hadde didEndOnExit
som hendelsestype, så hvis du trykker på komme tilbake tast, vil tastaturet avvise. Du må koble denne handlingen til hvert tekstfelt. Koble også delegaten fra hver tekstfelt til Filens eier.
Takk for at du leser denne raske tipsen om å flytte innhold fra under tastaturet! Hvis du har spørsmål eller kommentarer til denne opplæringen, legg dem i kommentarfeltet nedenfor!