iOS SDK Håller innehåll från under tangentbordet

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:

    яя я
  1. Bestäm tangentbordets storlek.
  2. Uppdatera innehållsinmatningsinställningen för innehållsrullvisningen med höjden på tangentbordet.
  3. Bläddra in målinnehållet i vy.

Registrera tangentbordsobservatörer

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

Lägg till KeyboardWasShown-metoden

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.

Lägg till KeyboardWillHide-metoden

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.

Spårning av Active UITextField

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.

Avvisa tangentbordet

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.

Sammanfatta

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!