Ich hatte auch eine Menge Probleme mit einer UIScrollView
Zusammenstellung von mehreren UITextFields
Die meisten davon werden bei der Bearbeitung von der Tastatur verdeckt.
Hier sind einige Dinge zu beachten, wenn Ihr UIScrollView
wird nicht richtig gescrollt.
1) Stellen Sie sicher, dass Ihre contentSize größer ist als die UIScrollView
Rahmengröße. Der Weg zum Verständnis UIScrollViews
ist, dass die UIScrollView
ist wie ein Sichtfenster auf den in contentSize definierten Inhalt. Wenn Sie also für die UIScrollview
um irgendwo zu scrollen, muss die contentSize größer sein als die UIScrollView
. Andernfalls ist kein Bildlauf erforderlich, da alles, was in contentSize definiert ist, bereits sichtbar ist. Übrigens, Standard contentSize = CGSizeZero
.
2) Da Sie nun wissen, dass die UIScrollView
ist in Wirklichkeit ein Fenster zu Ihrem "Inhalt", ein Weg, um sicherzustellen, dass die Tastatur nicht Ihren Blick verdeckt. UIScrollView's
Ansichtsfenster" wäre, die Größe des UIScrollView
so dass Sie, wenn die Tastatur vorhanden ist, die UIScrollView
Fenster nur auf die Originalgröße verkleinert UIScrollView
frame.size.height abzüglich der Höhe der Tastatur. Dadurch wird sichergestellt, dass Ihr Fenster nur diesen kleinen sichtbaren Bereich einnimmt.
3) Hier ist der Haken: Als ich dies zum ersten Mal implementierte, dachte ich, ich müsste die CGRect
des bearbeiteten Textfeldes und rufen UIScrollView's
scrollRecToVisible-Methode. Ich habe die Methode UITextFieldDelegate
Methode textFieldDidBeginEditing
mit dem Aufruf der scrollRecToVisible
Methode. Dies funktionierte tatsächlich mit einem seltsamen Nebeneffekt, dass der Bildlauf schnappen le site UITextField
in Position. Die längste Zeit konnte ich nicht herausfinden, was es war. Dann kommentierte ich die textFieldDidBeginEditing
Delegate-Methode und alles funktioniert!!!(???). Wie sich herausstellte, glaube ich, dass die UIScrollView
bringt eigentlich implizit die aktuell bearbeitete UITextField
implizit in das sichtbare Fenster. Meine Implementierung des UITextFieldDelegate
Methode und dem anschließenden Aufruf der scrollRecToVisible
überflüssig war und die Ursache für die seltsame Nebenwirkung war.
Hier sind also die Schritte, um Ihre UITextField
in einem UIScrollView
ein, wenn die Tastatur erscheint.
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:self.view.window];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:self.view.window];
keyboardIsShown = NO;
//make contentSize bigger than your scrollSize (you will need to figure out for your own use case)
CGSize scrollContentSize = CGSizeMake(320, 345);
self.scrollView.contentSize = scrollContentSize;
}
- (void)keyboardWillHide:(NSNotification *)n
{
NSDictionary* userInfo = [n userInfo];
// get the size of the keyboard
CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
// resize the scrollview
CGRect viewFrame = self.scrollView.frame;
// I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
viewFrame.size.height += (keyboardSize.height - kTabBarHeight);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[self.scrollView setFrame:viewFrame];
[UIView commitAnimations];
keyboardIsShown = NO;
}
- (void)keyboardWillShow:(NSNotification *)n
{
// This is an ivar I'm using to ensure that we do not do the frame size adjustment on the `UIScrollView` if the keyboard is already shown. This can happen if the user, after fixing editing a `UITextField`, scrolls the resized `UIScrollView` to another `UITextField` and attempts to edit the next `UITextField`. If we were to resize the `UIScrollView` again, it would be disastrous. NOTE: The keyboard notification will fire even when the keyboard is already shown.
if (keyboardIsShown) {
return;
}
NSDictionary* userInfo = [n userInfo];
// get the size of the keyboard
CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
// resize the noteView
CGRect viewFrame = self.scrollView.frame;
// I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView.
viewFrame.size.height -= (keyboardSize.height - kTabBarHeight);
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[self.scrollView setFrame:viewFrame];
[UIView commitAnimations];
keyboardIsShown = YES;
}
- Registrieren Sie sich für die Tastaturbenachrichtigungen unter
viewDidLoad
- Heben Sie die Registrierung für die Tastatureinstellungen unter
viewDidUnload
- Stellen Sie sicher, dass die
contentSize
gesetzt und größer als Ihr UIScrollView
unter viewDidLoad
- Schrumpfen le site
UIScrollView
wenn die Tastatur vorhanden ist
- Zurückkehren le site
UIScrollView
wenn die Tastatur verschwindet.
- Verwenden Sie einen Ivar, um zu erkennen, ob die Tastatur bereits auf dem Bildschirm angezeigt wird, da die Tastaturbenachrichtigungen jedes Mal gesendet werden, wenn eine
UITextField
wird auch dann mit einem Tabulator versehen, wenn die Tastatur bereits vorhanden ist, um zu vermeiden, dass Schrumpfung le site UIScrollView
wenn es bereits geschrumpft
Es ist zu beachten, dass die UIKeyboardWillShowNotification
wird auch dann ausgelöst, wenn die Tastatur bereits auf dem Bildschirm ist, wenn Sie mit der Tabulatortaste auf eine andere UITextField
. Ich habe dafür gesorgt, indem ich ein Ivar verwendet habe, um eine Größenänderung der UIScrollView
wenn die Tastatur bereits auf dem Bildschirm angezeigt wird. Versehentliches Ändern der Größe der UIScrollView
wenn die Tastatur schon da ist, wäre das katastrophal!
Ich hoffe, dieser Code erspart einigen von Ihnen eine Menge Kopfschmerzen.
0 Stimmen
Sie können das Textfeld animieren, so dass sich das Textfeld bewegt, wenn die Tastatur hochkommt
7 Stimmen
Sehen Sie sich das an. Kein Ärger für Sie. TPKeyboardVermeiden
24 Stimmen
Das ist von Apple dokumentiert, und ich denke, das ist der beste Weg: developer.apple.com/library/ios/#documentation/StringsTextFonts/
0 Stimmen
Automatisches Layout und tastaturabhängiges Layout, von ghawk.gu Der Artikel geht auch auf die Ausrichtung im Hoch- und Querformat ein.
0 Stimmen
Unter dem folgenden Link wird erklärt, wie man in einer Ansicht blättern kann, um Felder anzuzeigen, darunter UITextField versteckt durch Tastatur sehr deutlich mit klarem Code und Diagrammen Klick mich 1 Der untenstehende Git-Hub-Link enthält einen laufenden Quellcode Klick mich 2
0 Stimmen
Eine sehr gute Anleitung mit Bildern finden Sie unter: cocoawithlove.com/2008/10/
0 Stimmen
Das ist eine gute Lösung, die bei mir funktioniert hat: github.com/simonbs/BSKeyboardControls
62 Stimmen
Sie brauchen nur 1 Zeile in der Datei appdelegate.m und es funktioniert. github.com/hackiftekhar/IQKeyboardManager
10 Stimmen
Der beste Weg, den ich bisher gefunden habe, ist dieser Open Source TPKeyboardVermeiden
0 Stimmen
IQKeyboardManager funktioniert nicht im 4s-Protraitemodus
0 Stimmen
Diese Lösungen waren für mich besser: stackoverflow.com/a/15036744/1234031
0 Stimmen
UITableViewController mit UITextFields innerhalb der statischen Zellen wäre eine gute Lösung für diese Art von Anforderungen, probieren Sie es aus.
0 Stimmen
Für alle, die ein
storyboard
und versuchen, es zum Laufen zu bringen, es aber nicht können, stellen Sie einfach sicher, dassself.view
a führend , top y hintereconstraints
definiert. Andernfalls wird es wahrscheinlich nicht für IQKeyboardManager oder für die folgenden Antworten funktionieren.0 Stimmen
Sie müssen sich nicht auf die Erstellung von benutzerdefiniertem Code verlassen, um eine Ansicht nach oben zu verschieben, wenn die Tastatur angezeigt wird. Sie können einfach die Bibliothek IQKeyboardManagerSwift verwenden, die auch für Objective-C-Code verfügbar ist.
0 Stimmen
Swift 3.0 Version von Äpfeln Tastatur-Management-Code ist hier : medium.com/@abhimuralidharan/
0 Stimmen
Mögliches Duplikat von Größe des Bildschirms ändern, wenn die Tastatur erscheint
0 Stimmen
Folgen Sie dem untenstehenden Link, stackoverflow.com/questions/48922266/
0 Stimmen
Hier ist die allgemein, einfach und beliebt Lösung! stackoverflow.com/a/41808338/294884
0 Stimmen
stackoverflow.com/questions/1126726/