Ich hatte auch große Probleme mit dem UIScrollViewKomponieren von mehreren UITextFields, von denen einer oder mehrere von ihnen durch die Tastatur verdeckt werden, wenn sie bearbeitet werden.
Hier sind einige Dinge zu beachten, wenn Sie UIScrollViewnicht richtig scrollen.
1) Stellen Sie sicher, dass Ihre contentSize größer als die UIScrollViewFrame-Größe ist. Der Weg zu verstehen UIScrollViewsist, dass das UIScrollViewwie ein Anzeigefenster für den in contentSize definierten Inhalt ist. Wenn also UIScrollviewirgendwo gescrollt werden soll, 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, default contentSize =CGSizeZero .
2) Nachdem Sie nun verstanden haben, dass UIScrollViewes sich tatsächlich um ein Fenster in Ihrem "Inhalt" handelt, können Sie sicherstellen, dass die Tastatur Ihr UIScrollView's"Anzeigefenster" nicht verdeckt UIScrollView, indem Sie die Größe ändern , damit Sie das UIScrollViewFenster haben, wenn die Tastatur vorhanden ist Größe nur auf die ursprüngliche UIScrollViewRahmengröße. Höhe abzüglich der Höhe der Tastatur. Dadurch wird sichergestellt, dass Ihr Fenster nur diesen kleinen sichtbaren Bereich aufweist.
3) Hier ist der Haken: Als ich dies zum ersten Mal implementierte, dachte ich, ich müsste CGRectdas bearbeitete Textfeld abrufen und die UIScrollView'sscrollRecToVisible-Methode aufrufen. Ich habe die UITextFieldDelegateMethode textFieldDidBeginEditingmit dem Aufruf der scrollRecToVisibleMethode implementiert . Dies funktionierte tatsächlich mit einem seltsamen Nebeneffekt, dass das Scrollen die Position einrasten ließUITextField . Am längsten konnte ich nicht herausfinden, was es war. Dann habe ich die textFieldDidBeginEditingDelegate-Methode auskommentiert und alles funktioniert !! (???). Wie sich herausstellte, glaube ich, dass das UIScrollViewtatsächlich implizit das aktuell bearbeitete UITextFieldimplizit in das sichtbare Fenster bringt . Meine Implementierung der UITextFieldDelegateMethode und der anschließende Aufruf von scrollRecToVisiblewar redundant und war die Ursache für die seltsame Nebenwirkung.
So sind hier die Schritte , um richtig Ihre blättern UITextFieldin einem UIScrollViewan Ort und Stelle , 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 Tastaturbenachrichtigungen bei auf
viewDidUnload
- Stellen Sie sicher, dass das
contentSizeeingestellt und größer als Ihr UIScrollViewat istviewDidLoad
- Verkleinern Sie das,
UIScrollViewwenn die Tastatur vorhanden ist
- Wieder zurück das ,
UIScrollViewwenn die Tastatur weg geht.
- Verwenden Sie ein ivar, um festzustellen, ob die Tastatur bereits auf dem Bildschirm angezeigt wird, da die Tastaturbenachrichtigungen jedes Mal gesendet werden, wenn eine
UITextFieldRegisterkarte angezeigt wird, auch wenn die Tastatur bereits vorhanden ist, um ein Verkleinern der Tastatur zu vermeiden, UIScrollViewwenn sie bereits verkleinert ist
Eine Sache zu beachten ist, dass das UIKeyboardWillShowNotificationwird auch dann ausgelöst, wenn die Tastatur bereits auf dem Bildschirm angezeigt wird, wenn Sie auf eine andere tippen UITextField. Ich habe mich darum gekümmert, indem ich einen Ivar verwendet habe, um die Größe nicht zu ändern, UIScrollViewwenn die Tastatur bereits auf dem Bildschirm angezeigt wird. Eine versehentliche Größenänderung, UIScrollViewwenn die Tastatur bereits vorhanden ist, wäre katastrophal!
Hoffe, dieser Code erspart einigen von Ihnen viel Kopfschmerzen.