Manchmal muss der Formularinhalt den gesamten iOS-Bildschirm ausfüllen. Was machen Sie also, wenn die Tastatur Ihr UITextField oder UITextView abdeckt? In diesem kurzen Tipp werde ich zeigen, wie Sie mithilfe von UIScrollView verhindern, dass Formularinhalte verborgen werden, wenn die Tastatur angezeigt wird.
Laut der offiziellen Apple-Dokumentation ist der beste Weg, eine vertikal gestapelte Liste von zu kontrollieren UITextField
Objekte, die durch eine Tastatur verdeckt werden können, sind das Einbetten in eine UIScrollView
Objekt. Wenn die Tastatur angezeigt wird, a UIKeyboardDidShowNotification
wird gesendet und kann zum Anpassen der angezeigten Textfelder verwendet werden. Wenn Sie diese Nachricht überfüllen, müssen Sie die folgenden drei Schritte ausführen:
Zunächst müssen wir zwei Beobachter für die Tastaturbenachrichtigungen registrieren. Eine für die UIKeyboardDidShowNotification
und eine für die UIKeyboardWillHideNotification
. Wir machen das im viewDidLoad:
werden die Beobachter registriert, wenn die Ansicht geladen wird. Sie können die Beobachter mit folgendem Code hinzufügen:
[[NSNotificationCenter defaultCenter] addObserver: Selbstauswahl: @selector (keyboardWasShown :) Name: UIKeyboardDidShowNotification-Objekt: nil]; [[NSNotificationCenter defaultCenter] addObserver: Selbstauswahl: @selector (keyboardWillHide :) Name: UIKeyboardWillHideNotification-Objekt: nil];
Wenn Sie einen Beobachter im registrieren viewDidLoad:
Methode, sollten Sie es auch in entfernen viewDidUnload:
und das Dealloc:
Methoden. Fügen Sie den beiden folgenden Methoden den folgenden Code hinzu:
[[NSNotificationCenter defaultCenter] removeObserver: self];
Das keyboardWasShown:
Methode reagiert auf die UIKeyboardDidShowNotification:
Benachrichtigung. Bei dieser Methode werden die drei von Apple empfohlenen Schritte zum Verschieben des Inhalts implementiert. Fügen Sie Ihrem Projekt den folgenden Code hinzu:
- (void) keyboardWasShown: (NSNotification *) Benachrichtigung // Schritt 1: Ermitteln Sie die Größe der Tastatur. CGSize keyboardSize = [[[Benachrichtigungsbenutzerinfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue] .size; // Schritt 2: Passen Sie den unteren Inhaltseintrag Ihrer Bildlaufansicht um die Höhe der Tastatur an. UIEdgeInsets contentInsets = UIEdgeInsetsMake (0.0, 0.0, keyboardSize.height, 0.0); theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets; // Schritt 3: Scrollen Sie das Zieltextfeld in die Ansicht. 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 animated: YES];
Im ersten Schritt erhalten wir die Größe der Tastatur. Im zweiten Schritt passen wir den unteren Inhalt der Bildlaufansicht um die Tastaturhöhe an. Im dritten und letzten Schritt erstellen wir zuerst ein neues Rechteck mit der Höhe des Bildschirms minus der Höhe der Tastatur. Dann prüfen wir, ob sich das aktive Textfeld unter der Tastatur befindet. Wenn es sich nicht unter der Tastatur befindet, wird der Inhaltsoffset nicht von der Bildlaufansicht aktualisiert. Wenn sich das aktive Textfeld unter der Tastatur befindet, aktualisieren wir den Inhaltsversatz der Bildlaufansicht. Ich habe (keyboardSize.height-15) verwendet, sodass sich das aktive Textfeld nicht direkt über dem Textfeld befindet, sondern einen zusätzlichen Abstand von 15 Pixeln hat. activeTextField ist eine benutzerdefinierte Variable, die das aktive Feld speichert.
Wir müssen auch das hinzufügen keyboardWillHide:
Methode, die auf die reagiert UIKeyboardWillHideNotification
. Fügen Sie Ihrem Projekt den folgenden Code hinzu:
- (void) keyboardWillHide: (NSNotification *) Benachrichtigung UIEdgeInsets contentInsets = UIEdgeInsetsZero; theScrollView.contentInset = contentInsets; theScrollView.scrollIndicatorInsets = contentInsets;
Hier setzen wir die contentInset
und das scrollIndicatorInsets
von der Bildlaufansicht zu UIEdgeInsetsZero
, es wird also kein Inhaltsinsert mehr geben.
Mit diesen Methoden verfolgen wir das aktive Textfeld:
- (void) textFieldDidBeginEditing: (UITextField *) textField self.activeTextField = textField; - (void) textFieldDidEndEditing: (UITextField *) textField self.activeTextField = nil;
Wenn wir mit der Bearbeitung beginnen activeTextField:
Variable wird auf das aktive Feld gesetzt. Wenn wir die Bearbeitung beenden, wird die activeTextField:
Variable ist auf Null gesetzt. Beachten Sie, dass wir das deklariert haben activeTextField
Eigentum mit (nichtatomisch, zuordnen)
, Daher wird der Retain-Count für das aktive Textfeld durch unsere Zuweisung nie inkrementiert.
Fügen Sie diesen Code hinzu, um die Tastatur zu schließen:
- (IBAction) dismissKeyboard: (id) Sender [activeTextField resignFirstResponder];
Diese Aktion hatte didEndOnExit
als Ereignistyp, wenn Sie also die Taste drücken Rückkehr Taste wird die Tastatur verworfen. Sie müssen diese Aktion mit jedem Textfeld verknüpfen. Verbinden Sie auch den Delegaten von jedem Textfeld mit Eigentümer der Datei.
Vielen Dank, dass Sie diesen kurzen Tipp zum Verschieben von Inhalten unter der Tastatur gelesen haben. Wenn Sie Fragen oder Kommentare zu diesem Tutorial haben, lassen Sie sie in den Kommentaren weiter unten!