J'ai été aussi avoir beaucoup de problème avec un UIScrollView
de la composition de plusieurs UITextFields
, dont un ou plusieurs d'entre eux serait obscurcie par le clavier quand ils sont en cours d'édition.
Voici quelques choses à considérer si votre UIScrollView
n'est pas correctement défilement.
1) s'Assurer que votre contentSize est très supérieure à l' UIScrollView
taille de l'image. La manière de comprendre l' UIScrollViews
, c'est que l' UIScrollView
, c'est comme une fenêtre de visualisation sur le contenu défini dans la contentSize. Donc dans l'ordre pour l' UIScrollview
pour faire défiler n'importe où, le contentSize doit être supérieure à la UIScrollView
. Autre chose, il n'y a pas de défilement nécessaire que tout ce que définis dans la contentSize est déjà visible. BTW, par défaut contentSize = CGSizeZero
.
2) Maintenant que vous comprenez que l' UIScrollView
est vraiment une fenêtre sur votre "contenu", la façon de s'assurer que le clavier n'est pas obscurcir votre UIScrollView's
affichage "de la fenêtre" serait pour redimensionner l' UIScrollView
, de sorte que lorsque le clavier est présent, vous avez l' UIScrollView
de la taille de la fenêtre juste à l'original, UIScrollView
cadre.taille.hauteur moins la hauteur du clavier. Cela permettra d'assurer que votre fenêtre n'est que la petite zone visible.
3) le hic, c'est Lorsque j'ai mis en œuvre ce j'ai pensé que j'aurais à obtenir l' CGRect
de la édités textfield et appelez - UIScrollView's
scrollRecToVisible méthode. J'ai mis en place l' UITextFieldDelegate
méthode textFieldDidBeginEditing
avec l'appel à l' scrollRecToVisible
méthode. Cela fait déjà travaillé avec un étrange effet secondaire que le défilement serait composant logiciel enfichable de l' UITextField
en position. Pendant longtemps je ne pouvais pas comprendre ce que c'était. Ensuite, j'ai commenté l' textFieldDidBeginEditing
Délégué de la méthode et c'est tout le travail!!(???). Comme il s'est avéré, je crois que l' UIScrollView
fait implicitement apporte actuellement édité UITextField
dans le visible de la fenêtre implicitement. Ma mise en œuvre de l' UITextFieldDelegate
méthode et de l'appel ultérieur à l' scrollRecToVisible
était redondant, et a été la cause de l'étrange effet secondaire.
Voici donc les étapes pour bien défilement) UITextField
en UIScrollView
en place lorsque le clavier apparaît.
// 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:UIKeyboardFrameBeginUserInfoKey] 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:UIKeyboardFrameBeginUserInfoKey] 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;
}
- s'inscrire pour le clavier notifications à l'
viewDidLoad
- annuler l'inscription pour le clavier nofitications en
viewDidUnload
- s'assurer que l'
contentSize
est définie et plus grande que votre UIScrollView
à viewDidLoad
-
rétrécir l'
UIScrollView
lorsque le clavier est présent
-
revenir l'
UIScrollView
lorsque le clavier s'en va.
- utiliser un ivar pour détecter si le clavier est déjà indiqué sur l'écran depuis le clavier notifications sont envoyées à chaque fois un
UITextField
est à onglets, même si le clavier est déjà présent pour éviter le rétrécissement de l' UIScrollView
alors qu'il est déjà rétréci
Une chose à noter est que l' UIKeyboardWillShowNotification
le feu, même lorsque le clavier est déjà sur l'écran lors de l'onglet sur un autre UITextField
. J'ai pris soin de cela en utilisant un ivar pour éviter le redimensionnement de la UIScrollView
lorsque le clavier est déjà sur l'écran. Par inadvertance, le redimensionnement de la UIScrollView
lorsque le clavier est déjà là serait désastreux!
Espérons que ce code permet d'économiser de beaucoup de maux de tête.