J'ai des problèmes avec mon code. J'essaye de déplacer le UIScrollView
quand j'édite un UITextField
qui devrait être caché par le pop du clavier.
Je déplace le cadre principal en ce moment parce que je ne sais pas comment «faire défiler vers le haut» dans le code. Donc, j'ai fait un peu de code, cela fonctionne bien mais quand j'édite un champ UItext et que je passe à un autre UITextField
sans appuyer sur le bouton «retour», la vue principale va waaayyyyy trop haut.
J'ai fait un NSLog()
avec mes variables size, distance et textFieldRect.origin.y comme vous pouvez le voir ci-dessous. Quand j'en mets deux UITextField
au même endroit (origine y) et que je fais ce `` commutateur '' particulier (sans appuyer sur retour), j'obtiens les mêmes nombres, alors que mon code fonctionnait bien pour la première UITextField
édition mais pas pour la deuxième édition.
Regarde ça:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
{
int size;
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
size = textFieldRect.origin.y + textFieldRect.size.height;
if (change == FALSE)
{
size = size - distance;
}
if (size < PORTRAIT_KEYBOARD_HEIGHT)
{
distance = 0;
}
else if (size > PORTRAIT_KEYBOARD_HEIGHT)
{
distance = size - PORTRAIT_KEYBOARD_HEIGHT + 5; // +5 px for more visibility
}
NSLog(@"origin %f", textFieldRect.origin.y);
NSLog(@"size %d", size);
NSLog(@"distance %d", distance);
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
change = FALSE;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
change = TRUE;
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
Des idées ?
la source
activeField.frame
en cadre relatif car ilactiveField
n'est pas nécessaire d'en être un enfant immédiatself.view
. Le code mis à jour devrait ressembler à quelque chose comme:CGRect aRect = self.view.frame; aRect.size.height -= kbSize.height; CGRect relativeFieldFrame = [activeField convertRect:activeField.frame toView:self.view]; if (!CGRectContainsPoint(aRect, relativeFieldFrame.origin) ) { CGPoint scrollPoint = CGPointMake(0.0, relativeFieldFrame.origin.y-kbSize.height); [self.mainView.scrollView setContentOffset:scrollPoint animated:YES]; }
UIKeyboardFrameEndUserInfoKey
clé sur iOS 11 carUIKeyboardFrameBeginUserInfoKey
cela me donnait souvent une hauteur de zéro.Je viens de l'implémenter avec Swift 2.0 pour iOS9 sur Xcode 7 (beta 6), cela fonctionne bien ici.
Édité pour Swift 3
Il semble que vous ayez seulement besoin de définir le
contentInset
etscrollIndicatorInset
avec Swift 3, le scrolling / contentOffset se fait automatiquement.la source
Toutes les réponses ici semblent oublier les possibilités paysagères. Si vous souhaitez que cela fonctionne lorsque l'appareil est tourné en mode paysage, vous rencontrerez des problèmes.
L'astuce ici est que bien que la vue soit consciente de l'orientation, le clavier ne l'est pas. Cela signifie que dans Paysage, la largeur du clavier est en fait sa hauteur et vice versa.
Pour modifier la méthode recommandée par Apples pour modifier les encarts de contenu et pour qu'elle prenne en charge l'orientation paysage, je vous recommande d'utiliser ce qui suit:
La partie à prêter attention ici est la suivante:
Il détecte dans quelle orientation se trouve le périphérique. S'il s'agit d'un paysage, il «permutera» les valeurs de largeur et de hauteur de la variable keyboardSize pour garantir que les valeurs correctes sont utilisées dans chaque orientation.
la source
Solution Swift 4 :
la source
UIKeyboardFrameBeginUserInfoKey
pourUIKeyboardFrameEndUserInfoKey
UIKeyboardWillShow
,UIKeyboardWillHide
EtUIKeyboardFrameBeginUserInfoKey
ont été renommésUIResponder.keyboardWillShowNotification
,UIResponder.keyboardWillHideNotification
etUIResponder.keyboardFrameBeginUserInfoKey
.Pour ce truc, pas besoin de beaucoup de codage, c'est très simple comme le code ci-dessous: -
votre tout textfiled dans UIScrollview de plume comme cette image: -
YourViewController.h
connectez IBOutlet à partir de nib et connectez également chaque délégué de UItextfiled et le délégué scrollview de NIB
REMARQUE si le délégué textuel n'est pas connecté, aucune méthode ne fonctionne, veuillez vous assurer que tous les iBOulate et les délégués sont correctement connectés
la source
Recommandation d'Apple recodée dans Swift + Utilisation d'UIScrollView avec mise en page automatique sous iOS (en se basant sur les liens suivants: lien 1 , lien 2 , lien 3 ):
la source
La seule chose que je mettrais à jour dans le code Apple est la méthode keyboardWillBeHidden:, pour fournir une transition en douceur.
la source
Voici une réponse compatible Swift 3 , qui fonctionnera également avec les contrôleurs de vue dans un contrôleur de navigation - car ils modifieront la
contentInset.top
propriété des vues de défilement .la source
Solution Swift 4.2 qui prend en compte les hauteurs possibles de UIToolbar et UITabBar.
Et, si vous ciblez <iOS 9, vous devez désinscrire l'observateur à un moment donné (merci Joe )
la source
J'ai trouvé que les réponses ci-dessus étaient obsolètes. Pas parfait non plus lors du défilement.
Voici une version rapide.
Il défilera juste en dessous du textField, pas d'espace libre. Et il restaurera la façon dont il était comme sa première apparition.
la source
C'est ce que j'utilise. C'est simple et ça marche bien.
Utilisez l'
UITextField
appel déléguétextFieldDidBeginEditing:
pour déplacer votre vue vers le haut, et ajoutez également un observateur de notification pour revenir à la vue normale lorsque le clavier se cache:la source
Ceci est le code final avec des améliorations dans Swift
la source
L'une des solutions les plus simples consiste à utiliser le protocole suivant:
Lorsque vous souhaitez utiliser ce protocole, il vous suffit de vous y conformer et d'affecter votre vue de défilement dans votre contrôleur comme suit:
la source
Je ferais ça comme ça. C'est beaucoup de code mais cela garantit que le textField actuellement en focus est centré verticalement dans `` l'espace disponible '':
Notez que l'
- (IBAction)textFieldGotFocus:
action est liée à l'DidBeginEditing
état de chaque textField .De plus, il serait un peu préférable d'obtenir la durée de l'animation à partir de la notification du clavier et de l'utiliser pour l'animation de défilement au lieu d'une valeur fixe, mais poursuivez-moi, c'était assez bien pour moi;)
la source
Utilisez l'extension suivante si vous ne voulez pas trop calculer:
Et peut-être que vous voulez garder votre UITextField toujours visible:
la source
Essayez ce code dans Swift 3:
la source
Solution Swift 5 basée sur la solution Masa ci-dessus - changements par rapport à celle-ci:
keyboardFrameEndUserInfoKey
au lieu dekeyboardFrameBeginUserInfoKey
, carkeyboardFrameBeginUserInfoKey
peut au premier affichage renvoyer une autre valeur comme décrit par exemple ici: la hauteur du clavier varie lors de son apparitionUIResponder.keyboardWillShowNotification
/UIResponder.keyboardWillHideNotification
au lieu deNSNotification.Name.UIKeyboardDidShow
/NSNotification.Name.UIKeyboardDidHide
Code:
la source
Vous n'avez en fait pas besoin d'un UIScrollView pour ce faire. J'ai utilisé ce code et cela fonctionne pour moi:
la source
Vous pouvez faire défiler en utilisant la propriété
contentOffset
dansUIScrollView
, par exemple,Il existe également une méthode pour faire un défilement animé.
Quant à la raison pour laquelle votre deuxième édition ne défile pas correctement, c'est peut-être parce que vous semblez supposer qu'un nouveau clavier apparaîtra à chaque démarrage de l'édition. Vous pouvez essayer de vérifier si vous avez déjà ajusté la position visible du "clavier" (et de même vérifier la visibilité du clavier pour le moment avant de la rétablir).
Une meilleure solution pourrait être d'écouter la notification du clavier, par exemple:
la source
Je sais que c'est une vieille question maintenant mais j'ai pensé que cela pourrait aider les autres. Je voulais quelque chose d'un peu plus facile à implémenter pour quelques applications que j'avais, alors j'ai créé un cours pour cela. Vous pouvez le télécharger ici si vous le souhaitez: https://github.com/sdernley/iOSTextFieldHandler
C'est aussi simple que de configurer tous les UITextFields pour avoir un délégué de soi
Et puis en ajoutant ceci à votre contrôleur de vue avec le nom de votre bouton scrollView and submit
la source
Voici mes solutions qui fonctionnent (5 étapes)
Étape 1: Ajoutez un observateur pour attraper quel UITEXTFIELD ou UITEXTVIEW ShoudBeginEditing (où l'objet est initié ou ViewDidLoad.
Étape 2: Publiez une notification lorsque ..ShouldBeginEditing avec OBJECT de UITEXTFIELD ou UITEXTVIEW
Étape 3: La méthode qui (appelle l'étape 1) attribue le UITEXTFIELD ou UITEXTVIEW actuel
Étape 4: Ajouter l'observateur de clavier UIKeyboardWillShowNotification (même endroit que Step1)
et méthode:
Étape 5: Ajouter l'observateur de clavier UIKeyboardWillHideNotification (même endroit que l'étape 1)
et méthode:
N'oubliez pas de supprimer les observateurs!
la source
J'ai utilisé cette réponse fournie par Sudheer Palchuri https://stackoverflow.com/users/2873919/sudheer-palchuri https://stackoverflow.com/a/32583809/6193496
Dans ViewDidLoad, enregistrez les notifications:
Ajoutez ci-dessous les méthodes d'observateur qui effectuent le défilement automatique lorsque le clavier apparaît.
la source
Ma solution comporte 4 étapes:
- Étape 1: la fonction écoute lorsque le clavier apparaît
- Étape 2: la fonction écoute lorsque le clavier disparaît
- Étape 3: ajoutez ces fonctions au centre de notification:
- Étape 4: supprimer l'écoute lorsque le contrôleur de vue disparaît
la source