Très bien, j'ai un couple de UITextFields
et UITextViews
dans un UIScrollView
, et j'aimerais que le clavier disparaisse chaque fois que vous touchez ou faites défiler la scrollview
(sauf lorsque vous appuyez dans le champ/la vue, bien sûr).
Ma tentative actuelle consiste à remplacer la UIScrollView
par une sous-classe et à la définir pour appeler une fonction removeKeyboard (définie dans le contrôleur de la vue principale) dans la méthode touchesBegan . Cependant, cela ne supprime le clavier que pour un toucher normal, pas lorsque la vue est simplement défilée. Alors, quel est le meilleur moyen de supprimer le clavier dans une UIScrollView
?
Merci d'avance pour votre aide.
Voici le moyen le plus propre d’y parvenir dans iOS 7.0 et versions ultérieures.
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
Ou
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
Rapide:
scrollView.keyboardDismissMode = .onDrag
Ou
scrollView.keyboardDismissMode = .interactive
Un peu en retard, mais si quelqu'un d'autre cherche une réponse à ce problème, voici comment j'ai résolu ce problème:
1) Créez un outil de reconnaissance des gestes tactiles avec une méthode de rappel cible pour ignorer votre clavier à l'aide de resignFirstResponder sur tous vos champs.
2) Ajoutez le geste de toucher à la vue de défilement.
Voici un exemple:
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = NO;
[pageScrollView addGestureRecognizer:tapGesture];
[tapGesture release];
...
// method to hide keyboard when user taps on a scrollview
-(void)hideKeyboard
{
[myTextFieldInScrollView resignFirstResponder];
}
Bien que l'essence soit la même, je préfère moins de code.
Définition du clavier pour qu'il disparaisse lorsque scrollView défile dans l'inspecteur Attributs:
Puis disparaît du clavier lorsque vous appuyez sur scrollView:
scrollView.endEditing(true)
. Si vous utilisez Objective-C, [self.scrollView endEditing: YES];
Dans Swift :
Un peu en retard, mais si quelqu'un d'autre cherche une réponse à ce problème, voici comment j'ai résolu ce problème:
1) Créez un outil de reconnaissance des gestes tactiles avec une méthode de rappel cible pour ignorer votre clavier à l'aide de resignFirstResponder sur tous vos champs.
2) Ajoutez le geste de toucher à la vue de défilement.
Voici un exemple:
import UIKit
class ViewController: UIViewController {
@IBOutlet var t1: UITextField!
@IBOutlet var t2: UITextField!
@IBOutlet var t3: UITextField!
@IBOutlet var t4: UITextField!
@IBOutlet var srcScrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideKeyboard")
// prevents the scroll view from swallowing up the touch event of child buttons
tapGesture.cancelsTouchesInView = false
srcScrollView.addGestureRecognizer(tapGesture)
}
func hideKeyboard() {
t1.resignFirstResponder()
t2.resignFirstResponder()
t3.resignFirstResponder()
t4.resignFirstResponder()
}
}
Regardez keyboardDismissMode propriété de UIScrollView.
// will hide keyboard when your text field is about to go beyond the keyboard.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
// will hide keyboard instantly once the scroll view started scrolling by user.
vwScrollView.keyboardDismissMode = UIScrollViewKeyboardDismissOnDrag;
// If you need to hide keyboard on tap of scroll view,consider adding a tap gesture or sub class and override touchesbegan: method.
vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
Essaye ça
[self.selectedViewController.view endEditing:YES]
;
Créez une classe d'extension pour cacher le clavier lorsque vous touchez scrollview/view n'importe
extension UIViewController {
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
}
@objc func dismissKeyboard() {
view.endEditing(true)
}
}
Et appelez cette méthode dans viewDidLoad comme
override func viewDidLoad() {
super.viewDidLoad()
self.hideKeyboardWhenTappedAround()
}
Un peu tard mais si quelqu'un cherche une réponse à ce problème avec Swift 3 :
func scrollViewDidScroll(_ scrollView: UIScrollView) {
view.endEditing(true)
}
Lorsque j'ai ajouté le geste à une sous-classe de UIScrollView
, je rencontrais des problèmes d'interférence entre les différents gestes de mon arbre de visualisation, tels que le fait de cliquer sur les sous-vues, de faire défiler la vue et de faire en sorte que le clavier disparaisse. Je suis venu avec cette solution, qui peut être configurée à partir d'une super-classe de UIScrollView
ou à partir d'une UIViewController
.
La classe DismissKeyboardTapGesture
utilise ARC, fonctionne avec tous les champs de texte situés sous la vue et ne prend en charge aucun clic provenant de sous-vues, comme des boutons. Profite également de l'effet de défilement iOS7 pour supprimer le clavier.
Configuration depuis la super-classe UISScrollView:
_dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self];
ou de UIViewController:
_dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self.view];
Voici la classe:
@interface DismissKeyboardTapGesture : NSObject <UIGestureRecognizerDelegate>
@end
@implementation DismissKeyboardTapGesture
- (id)initWithView:(UIView *)view
{
self = [super init];
if (self) {
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTap.cancelsTouchesInView = NO;
singleTap.delegate = self;
[view addGestureRecognizer:singleTap];
if ([view respondsToSelector:@selector(setKeyboardDismissMode:)]) {
// Bonus effect to dismiss keyboard by scrolling
((UIScrollView *)view).keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
}
}
return self;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Don't stop any existing gestures in our view from working
if (otherGestureRecognizer.view == gestureRecognizer.view) {
return YES;
}
return NO;
}
- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer
{
// Close keyboard for any text edit views that are children of the main view
[gestureRecognizer.view endEditing:YES];
}
@end
extension UIView{
//Set tag via storyboard
func keyboardDissmissInteractiveMode(_ tag:Int){
if let scrollView = self.viewWithTag(tag) as? UIScrollView{
scrollView.keyboardDismissMode = .interactive
}
if let tableview = self.viewWithTag(tag) as? UITableView{
tableview.keyboardDismissMode = .interactive
}
}
func keyboardDissmissOnDragMode(_ tag:Int){
if let scrollView = self.viewWithTag(tag) as? UIScrollView{
scrollView.keyboardDismissMode = .onDrag
}
if let tableview = self.viewWithTag(tag) as? UITableView{
tableview.keyboardDismissMode = .onDrag
}
}
func keyboardDissmissInteractiveMode(_ view:UIView){
if let scrollView = view as? UIScrollView{
scrollView.keyboardDismissMode = .interactive
}
if let tableview = view as? UITableView{
tableview.keyboardDismissMode = .interactive
}
}
func keyboardDissmissOnDragMode(_ view:UIView){
if let scrollView = view as? UIScrollView{
scrollView.keyboardDismissMode = .onDrag
}
if let tableview = view as? UITableView{
tableview.keyboardDismissMode = .onDrag
}
}
}
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
Essayez cette méthode de délégation de vue par défilement -
lier le délégué dans IB pour faire défiler la vue, puis copier ce code (modifiez-le selon vos besoins).
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
//sample code
[challengeABallotComponent.voterNameTextField resignFirstResponder];
[challengeABallotComponent.ballotNumberTextField resignFirstResponder];
[locationInformation.pollingLocation resignFirstResponder];
}
Cela devrait marcher. Vous pouvez aussi essayer d’autres méthodes de délégation, comme
-(void)scrollViewDidScroll: (UIScrollView *)scrollView
{
//do your stuff
}