Je veux pouvoir fermer le clavier de l'iPhone lorsque l'utilisateur appuie n'importe où en dehors du clavier. Comment puis-je m'y prendre? Je sais que je dois rejeter le répondeur, mais je dois savoir comment l'implémenter lorsqu'un utilisateur tape sur l'espace clavier.
Vous devrez ajouter un UITapGestureRecogniser
et l'affecter à la vue, puis appeler resign first responder sur le champ de texte de son sélecteur.
Le code:
Dans viewDidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
Dans dismissKeyboard:
-(void)dismissKeyboard {
[aTextField resignFirstResponder];
}
(Où aTextField est le champ de texte responsable du clavier)
OPTION 2
Si vous ne pouvez pas vous permettre d'ajouter un gestureRecognizer, vous pouvez essayer ceci
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
[aTextField resignFirstResponder];
}
}
La solution la plus simple que j'ai utilisée est la suivante:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
La commande endEditing peut être utilisée sur n'importe quelle vue contenant votre champ de texte en tant que sous-vue. L'autre avantage de cette méthode est que vous n'avez pas besoin de savoir quel champ de texte a déclenché le clavier. Donc, même si vous avez plusieurs champs de texte, ajoutez simplement cette ligne à la vue d'ensemble.
Basé sur la documentation Apple, je pense que cette méthode existe spécifiquement pour résoudre ce problème.
Ajoutez un TapGesture Recognizer mais assurez-vous que annelsTouchesInView = NO
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
Vous devrez ajouter un UITapGestureRecogniser et l'affecter à la vue, puis appeler resign first responder sur le champ de texte de son sélecteur.
Le code:
In viewDidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
Dans le clavier
-(void)dismissKeyboard {
[self.view endEditing:true];
}
Vous devez ajouter un UIVIew transparent en tant que sous-vue sous le clavier et y toucher pour gérer le clavier. Le code ci-dessous est pour votre référence.
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(overlayTouched:)];
gesture.delegate = self;
[(UITapGestureRecognizer *)gesture setNumberOfTouchesRequired:1];
UIView* trans = [[UIView alloc] initWithFrame:[[delegate view] bounds]];
[trans setOpaque:NO];
[trans setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];
[trans setAlpha:0.3];
[trans setUserInteractionEnabled:YES];
trans.multipleTouchEnabled = YES;
[trans addGestureRecognizer:gesture];
[trans setBackgroundColor:[UIColor blackColor]];
[trans setTag:BLACK_SCREEN_VIEW];
Ceci est une solution Swift 4:
let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
self.view.addGestureRecognizer(tap)
Et le renvoyerClavier
@objc func dismissKeyboard() {
self.view.endEditing(true)
}
Si vous ne souhaitez pas ajouter de reconnaissance de gestes, vous pouvez également utiliser la méthode touchesBegin
Code en Swift 4
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { view.endEditing(true) }
Si vous êtes sur un UITableViewController
ou avez un UITableView
avec lequel l'utilisateur va interagir, dans votre ViewDidLoad vous pouvez simplement faire:
tableView.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;
Remarque: il s'agit de la syntaxe Xamarin.iOS.
Une autre façon de faire est simple:
Rend votre UIView as UIControl in custom class in the interface builder
, vous pouvez ensuite attacher une méthode IBAction
dans Touch up inside event
de votre UIView : UIControl
, puis vous mettez [yourTextField resignFirstResponder]
à l'intérieur de IBAction method
, comme ça:
- (IBAction) hideKeyboard: (id) sender
{
// If you have more than one textfield to dismiss, of course only can be active 1, but here you can't know who is it, because sender will be the UIView : UIControl
[alias resignFirstResponder];
[password resignFirstResponder];
}
Ensuite, vous avez une autre option et c'est de mettre dans votre champ de texte the return key of the keyboard as Done
(Cela peut être n'importe lequel de ceux que vous voulez, mais c'est bon pour cela, car retourner signifie faire une action avec le formulaire) dans le générateur d'interface, vous pouvez donc appuyer sur Done
et masquer le clavier, mais dans ce cas, vous devez attacher la méthode IBAction précédente au Did end on exit
un événement.
Et de cette façon, le clavier cachera touching outside
ou en touchant Done
depuis le clavier.
Si vous souhaitez améliorer le code, ne serait-ce que pour masquer le clavier touchant Done
du clavier, la méthode devrait être:
// Attach all textFields here on Did end on exit event, will not work if touch outside the keyboard
- (IBAction) hideKeyboard: (id) sender
{
[sender resignFirstResponder];
}