web-dev-qa-db-fra.com

IOS - Comment masquer une vue en touchant n'importe où en dehors de celle-ci

Je suis nouveau dans la programmation de IOS, j'affiche une vue lorsqu'un bouton est cliqué, en utilisant le code suivant dans la méthode du bouton.

 @IBAction func moreButton(_ sender: Any)
    {
        self.helpView.isHidden = false
    }

initialement, le self.helpView.isHidden est défini sur true dans la méthode viewDidLoad pour masquer la vue. Maintenant, comment puis-je écarter cette vue en touchant n'importe où en dehors de la vue. D'après les recherches, j'ai trouvé que cela peut être fait en créant un bouton transparent qui convient à tout le viewController. Alors, en cliquant sur le bouton, nous pouvons faire en sorte que la vue disparaisse. Quelqu'un peut-il me donner le code dans Swift 3 pour créer un tel bouton.

Ou, s’il existe un autre meilleur moyen de masquer une vue, celle-ci est la bienvenue.

J'utilise Xcode 8.2, Swift 3.0

Merci d'avance.

11
Tester

En contact a commencé, vous devriez écrire comme

override func touchesBegan(_ touches: Set<AnyHashable>, withEvent event: UIEvent) {
    var touch: UITouch? = touches.first
    //location is relative to the current view
    // do something with the touched point
    if touch?.view != yourView {
        yourView.isHidden = true
    }
}
30

Vous pouvez utiliser la méthode touchesBegan pour cela:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    self.helpView.isHidden = true
}
4
Dharmesh

Dans Swift 4

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     let touch = touches.first
     if touch?.view == self.view {
        commentsTxtView.resignFirstResponder()
    }
}
1
Hanny

À l'intérieur du moreButton sélectionné, vous pouvez faire quelque chose comme ceci

 @IBAction func moreButton(_ sender: Any)
    {
        self.helpView.isHidden = false
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissView))
        view.addGestureRecognizer(tap)
    }

    func dismissView() {
        self.helpView.isHidden = true
        self.view.removeGestureRecognizer(tap)
    }
1
Clinton D'Souza

Vous pouvez réaliser ce que vous voulez en procédant comme suit (testé avec Swift 4.1 et Xcode 9.3):

class ViewController: UIViewController {

    ...

    private var dismissViewTap: UITapGestureRecognizer?

    override func viewDidLoad() {

        super.viewDidLoad()

        dismissViewTap = UITapGestureRecognizer(target: self, action: #selector(dismissView))

        if let tap = dismissViewTap {

            view.addGestureRecognizer(tap)

        } // if let

    } // viewDidLoad

    @objc private func dismissView() {

        guard let tap = dismissViewTap else {

            return

        } // guard

        guard helpView.isHidden == false else {

            return

        } // guard

        helpView.isHidden = true

        view.removeGestureRecognizer(tap)

    } // dismissView

    ...

} // ViewController

Si vous souhaitez conserver le programme de reconnaissance de mouvements (peut-être parce que vous avez ouvert plusieurs fois helpView), remplacez la commandeView par cette version:

...

@objc private func dismissView() {

    guard helpView.isHidden == false else {

        return

    } // guard

    helpView.isHidden = true

} // dismissView

...

C'est tout...!

0
josuevhn

Vous pouvez utiliser cette méthode dans Swift 4. 

ajoutez le tag number au uiview que vous voulez ajouter

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
{
    if touches.first?.view?.tag == 10{
        dismiss(animated: true, completion: nil)
        super.touchesEnded(touches , with: event)
    }
}
0
Akhil Clement

Vous pouvez créer un autre bouton transparent ou votre vue de base (en supposant qu'il s'agisse d'une vue unique en dessous du bouton) peut alors aborder ce que vous essayez de faire. Tout d'abord, vous devez le rendre exploitable. Ensuite, vous voulez gérer la logique de ce qui se passe lorsque vous exploitez ou non. 

0
mrabins