Ich hatte auch große Probleme mit dem UIScrollView
Komponieren 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 UIScrollView
nicht richtig scrollen.
1) Stellen Sie sicher, dass Ihre contentSize größer als die UIScrollView
Frame-Größe ist. Der Weg zu verstehen UIScrollViews
ist, dass das UIScrollView
wie ein Anzeigefenster für den in contentSize definierten Inhalt ist. Wenn also UIScrollview
irgendwo 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 UIScrollView
es 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 UIScrollView
Fenster haben, wenn die Tastatur vorhanden ist Größe nur auf die ursprüngliche UIScrollView
Rahmengröß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 CGRect
das bearbeitete Textfeld abrufen und die UIScrollView's
scrollRecToVisible-Methode aufrufen. Ich habe die UITextFieldDelegate
Methode textFieldDidBeginEditing
mit dem Aufruf der scrollRecToVisible
Methode 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 textFieldDidBeginEditing
Delegate-Methode auskommentiert und alles funktioniert !! (???). Wie sich herausstellte, glaube ich, dass das UIScrollView
tatsächlich implizit das aktuell bearbeitete UITextField
implizit in das sichtbare Fenster bringt . Meine Implementierung der UITextFieldDelegate
Methode und der anschließende Aufruf von scrollRecToVisible
war redundant und war die Ursache für die seltsame Nebenwirkung.
So sind hier die Schritte , um richtig Ihre blättern UITextField
in einem UIScrollView
an 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
contentSize
eingestellt und größer als Ihr UIScrollView
at istviewDidLoad
- Verkleinern Sie das,
UIScrollView
wenn die Tastatur vorhanden ist
- Wieder zurück das ,
UIScrollView
wenn 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
UITextField
Registerkarte angezeigt wird, auch wenn die Tastatur bereits vorhanden ist, um ein Verkleinern der Tastatur zu vermeiden, UIScrollView
wenn sie bereits verkleinert ist
Eine Sache zu beachten ist, dass das UIKeyboardWillShowNotification
wird 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, UIScrollView
wenn die Tastatur bereits auf dem Bildschirm angezeigt wird. Eine versehentliche Größenänderung, UIScrollView
wenn die Tastatur bereits vorhanden ist, wäre katastrophal!
Hoffe, dieser Code erspart einigen von Ihnen viel Kopfschmerzen.