web-dev-qa-db-fra.com

Fermer le clavier dans un UIScrollView

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.

57
Nicholas1024

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
129
Pei

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];
}
51
Zhang

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:

make keyboard disappear when scrollView is scrolled

Puis disparaît du clavier lorsque vous appuyez sur scrollView:

  1. Faites glisser un outil de reconnaissance de gestes tactiles sur votre scrollView
  2. Ctrl-Drag
  3. Make an action
  4. Une seule ligne dans l'action —— scrollView.endEditing(true). Si vous utilisez Objective-C, [self.scrollView endEditing: YES];
33
fujianjin6471

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()
    }
}
10
King-Wizard

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.

Version rapide

vwScrollView.keyboardDismissMode = .interactive
vwScrollView.keyboardDismissMode = .onDrag
5
Naresh Reddy M

Essaye ça

[self.selectedViewController.view endEditing:YES];

4
Saad Ur Rehman

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()

}
3
chandra1234

Un peu tard mais si quelqu'un cherche une réponse à ce problème avec Swift 3 :

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    view.endEditing(true)
}
2
Jorge Casariego

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
2
Skotch
    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
        }
    }
}
0
jethava yogesh
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
0
vignesh.P

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
}
0
user1140780