iOS SDK inhoud van onder het toetsenbord houden

Soms moet formulierinhoud het hele iOS-scherm vullen. Dus wat doe je als het toetsenbord je UITextField of UITextView bedekt? In deze snelle tip zal ik laten zien hoe u een UIScrollView gebruikt om te voorkomen dat uw formulierinhoud wordt verborgen wanneer het toetsenbord in beeld komt.

Volgens de officiële Apple-documentatie, de beste manier om een ​​verticaal gestapelde lijst van te besturen UITextField objecten die door een toetsenbord kunnen worden verdoezeld, moeten worden ingesloten in een UIScrollView voorwerp. Wanneer het toetsenbord wordt weergegeven, UIKeyboardDidShowNotification wordt verzonden en kan worden gebruikt om de weergegeven tekstvelden aan te passen. Wanneer u dit bericht trapt, moet u de volgende drie stappen uitvoeren:

    яя я
  1. Bepaal de toetsenbordgrootte.
  2. Werk de onderste inhoudsinzet van de inhoudsschuifweergave bij op de hoogte van het toetsenbord.
  3. Blader door de doelinhoud in weergave.

Registreer Keyboard Observers

Ten eerste moeten we twee waarnemers registreren voor de toetsenbordmeldingen. Een voor de UIKeyboardDidShowNotification en één voor de UIKeyboardWillHideNotification. We doen dit in de viewDidLoad: methode, zodat de waarnemers worden geregistreerd wanneer het beeld wordt geladen. U kunt de waarnemers toevoegen met de volgende code:

 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (keyboardWasShown :) naam: UIKeyboardDidShowNotification-object: nihil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (keyboardWillHide :) naam: UIKeyboardWillHideNotification-object: nihil];

Als u een waarnemer registreert in de viewDidLoad: methode, moet u deze ook verwijderen in de viewDidUnload: en de dealloc: methoden. Dus voeg de volgende code toe aan beide methoden:

 [[NSNotificationCenter defaultCenter] removeObserver: self];

Voeg de KeyboardWasShown-methode toe

De keyboardWasShown: methode zal reageren op de UIKeyboardDidShowNotification: kennisgeving. In deze methode zullen we de drie stappen uitvoeren die door Apple worden aanbevolen om de inhoud te verplaatsen. Voeg de volgende code toe aan uw project:

 - (void) keyboardWasShown: (NSNotification *) notification // Stap 1: Verkrijg de grootte van het toetsenbord. CGSize-toetsenbordSize = [[[notification userInfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue] .size; // Stap 2: Pas de inhoud van de onderste inhoud van uw scrollweergave aan op de hoogte van het toetsenbord. UIEdgeInsets contentInsets = UIEdgeInsetsMake (0,0, 0,0, keyboardSize.height, 0,0); theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; // Stap 3: Blader door het doeltekstveld in weergave. CGRect aRect = self.view.frame; aRect.size.height - = keyboardSize.height; if (! CGRectContainsPoint (aRect, activeTextField.frame.origin)) CGPoint scrollPoint = CGPointMake (0.0, activeTextField.frame.origin.y - (keyboardSize.height-15)); [theScrollView setContentOffset: scrollPoint geanimeerd: YES]; 

In de eerste stap krijgen we de grootte van het toetsenbord. In de tweede stap passen we de onderste inhoudsinzet van de scrollweergave aan op de hoogte van het toetsenbord. In de derde en laatste stap maken we eerst een nieuwe rechthoek met de hoogte van het scherm minus de hoogte van het toetsenbord. Vervolgens controleren we of het actieve tekstveld zich onder het toetsenbord bevindt. Als het zich niet onder het toetsenbord bevindt, zal de scrollview de content-offset niet bijwerken. Als het actieve tekstveld zich onder het toetsenbord bevindt, werken we de inhoudsverschuiving van de scrollweergave bij. Ik heb (keyboardSize.height-15) gebruikt, dus het actieve tekstveld staat niet vlak boven het tekstveld, maar heeft nog 15 pixels ruimte tussen het veld. activeTextField is een aangepaste variabele die het actieve veld opslaat.

Voeg de KeyboardWillHide-methode toe

We moeten ook het keyboardWillHide: methode, die zal reageren op de UIKeyboardWillHideNotification. Voeg de volgende code toe aan uw project:

 - (void) keyboardWillHide: (NSNotification *) notificatie UIEdgeInsets contentInsets = UIEdgeInsetsZero; theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; 

Hier hebben we de contentInset en de scrollIndicatorInsets van de schuifweergave naar UIEdgeInsetsZero, dus er zal geen content-inzet meer zijn.

Het volgen van het actieve UITextField

Met deze methoden volgen we het actieve tekstveld:

 - (void) textFieldDidBeginEditing: (UITextField *) textField self.activeTextField = textField;  - (void) textFieldDidEndEditing: (UITextField *) textField self.activeTextField = nil; 

Wanneer we beginnen met het bewerken van de activeTextField: variabele wordt ingesteld op het actieve veld. Wanneer we het bewerken beëindigen, de activeTextField:variabele is ingesteld op nul. Merk op dat we het activeTextField eigendom met (niet-atomair, toewijzen), dus het aantal keren behouden wordt nooit verhoogd voor het actieve tekstveld door onze toewijzing.

Sluit het toetsenbord af

Voeg deze code toe om het toetsenbord te sluiten:

 - (IBAction) dismissKeyboard: (id) afzender [activeTextField resignFirstResponder]; 

Deze actie had didEndOnExit als het gebeurtenistype, dus als u op drukt terugkeer toets, het toetsenbord zal verdwijnen. U moet deze actie verbinden met elk tekstveld. Sluit ook de gemachtigde van elk tekstveld aan Bestand eigenaar.

Afronden

Bedankt voor het lezen van deze korte tip over het verplaatsen van inhoud onder het toetsenbord! Als u vragen of opmerkingen over deze zelfstudie hebt, laat ze dan in de opmerkingen hieronder staan!