Ibland behöver formulärinnehåll fylla hela iOS-skärmen. Så vad gör du när tangentbordet täcker din UITextField eller UITextView? I det här snabba tipset kommer jag att visa hur du använder en UIScrollView för att hålla ditt formulär innehåll inte dolt när tangentbordet glider in.
Enligt den officiella Apple-dokumentationen är det bästa sättet att styra en vertikalt staplad lista över UITextField
Objekt som kan vara dolda av ett tangentbord är att bädda in dem inom a UIScrollView
objekt. När tangentbordet visas, a UIKeyboardDidShowNotification
skickas och kan användas för att justera de visade textfälten. När du tar det här meddelandet måste du ta följande tre steg:
Först måste vi registrera två observatörer för tangentbordsmeddelandena. En för UIKeyboardDidShowNotification
och en för UIKeyboardWillHideNotification
. Vi gör det här i viewDidLoad:
metod, så observatörerna kommer att registreras när vyn är laddad. Du kan lägga till observatörer med följande kod:
[[NSNotificationCenter defaultCenter] addObserver: självväljare: @selector (keyboardWasShown :) namn: UIKeyboardDidShowNotification object: nil]; [[NSNotificationCenter defaultCenter] addObserver: självväljare: @selector (keyboardWillHide :) namn: UIKeyboardWillHideNotification object: nil];
Om du registrerar en observatör i viewDidLoad:
metod, bör du också ta bort den i viewDidUnload:
och den dealloc:
metoder. Lägg till följande kod på båda dessa sätt:
[[NSNotificationCenter defaultCenter] removeObserver: self];
De keyboardWasShown:
Metoden kommer att svara på UIKeyboardDidShowNotification:
underrättelse. I den här metoden kommer vi att genomföra de tre steg som rekommenderas av Apple för att flytta innehållet. Lägg till följande kod för ditt projekt:
- (void) keyboardWasShown: (NSNotification *) notification // Steg 1: Hämta tangentbordets storlek. CGSize keyboardSize = [[[notification userInfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue] .size; // Steg 2: Justera inmatningsinställningen för din rullningsvy med hjälp av tangentbordets höjd. UIEdgeInsets contentInsets = UIEdgeInsetsMake (0.0, 0.0, keyboardSize.height, 0.0); theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; // Steg 3: Bläddra in måltextfältet till vy. CGRect aRect = self.view.frame; aRect.size.height - = keyboardSize.height; om (! CGRectContainsPoint (aRect, activeTextField.frame.origin)) CGPoint scrollPoint = CGPointMake (0.0, activeTextField.frame.origin.y - (keyboardSize.height-15)); [theScrollView setContentOffset: scrollPoint animated: YES];
I det första steget får vi tangentbordets storlek. I det andra steget justerar vi inmatningsinställningen för rullningsläget med tangentbordets höjd. I det tredje och sista steget skapar vi först en ny rekt med skärmens höjd minus tangentbordets höjd. Då kontrollerar vi om det aktiva textfältet ligger under tangentbordet. Om det inte finns under tangentbordet, uppdaterar inte rullningsläget innehållsförskjutningen. Om det aktiva textfältet ligger under tangentbordet uppdaterar vi rullningsvyens innehållsförskjutning. Jag använde (keyboardSize.height-15), så det aktiva textfältet kommer inte att ligga precis ovanför textfältet men kommer att ha ytterligare 15 pixlar avstånd mellan det. activeTextField är en anpassad variabel som lagrar det aktiva fältet.
Vi måste också lägga till keyboardWillHide:
metod som svarar på UIKeyboardWillHideNotification
. Lägg till följande kod för ditt projekt:
- (void) keyboardWillHide: (NSNotification *) notification UIEdgeInsets contentInsets = UIEdgeInsetsZero; theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets;
Här ställer vi in contentInset
och den scrollIndicatorInsets
av rullningsvy till UIEdgeInsetsZero
, så det kommer inte längre att finnas något innehållsinlägg.
Med dessa metoder spåras det aktiva textfältet:
- (void) textFieldDidBeginEditing: (UITextField *) textField self.activeTextField = textField; - (void) textFieldDidEndEditing: (UITextField *) textField self.activeTextField = nil;
När vi börjar med att redigera activeTextField:
variabel är inställd på det aktiva fältet. När vi slutar redigera, activeTextField:
variabeln är inställd på noll. Observera att vi förklarade activeTextField
egendom med (icke-atomär, tilldela)
, så behållningsräkningen ökas aldrig för det aktiva textfältet genom vårt uppdrag.
Lägg till den här koden för att avvisa tangentbordet:
- (IBAction) dismissKeyboard: (id) avsändare [activeTextField resignFirstResponder];
Denna åtgärd hade didEndOnExit
som händelsetyp, så om du trycker på lämna tillbaka tangentbordet, kommer tangentbordet att avvisas. Du måste ansluta den här åtgärden till varje textfält. Anslut också delegaten från varje textfält till Filens ägare.
Tack för att du läste det här snabba tipset om att flytta innehåll från under tangentbordet! Om du har frågor eller kommentarer om denna handledning, lämna dem i kommentarfältet nedan!