2016-06-22 4 views
0

Je souhaite fermer mon UIAlertViewController en tapant à l'extérieur du contrôleur UIAlertView, en tapant sur l'espace de l'écran noir. J'ai essayé ceci:Quitter UIAlertViewController en tapant à l'extérieur

self.presentViewController(alertViewController, animated: true, completion:{ 
     alertViewController.view.superview?.userInteractionEnabled = true 
     alertViewController.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.alertClose(_:)))) 
    }) 

mais il se ferme juste si j'ai tapé sur UIAlertViewController. Mais je veux à l'extérieur, où l'écran demi-noir a tapé.

Est-ce possible?

MISE À JOUR

@IBAction func shareButtonTapped(sender: UIButton) { 
    let alertViewController = UIAlertController(title: "Share on social networks", message: "Where do you want to share?", preferredStyle: .ActionSheet) 

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissAlertView:") 
    self.view.addGestureRecognizer(tapGestureRecognizer) 

    let facebookAction = UIAlertAction(title: "Facebook", style: .Default) { (alert: UIAlertAction) -> Void in 

    } 

    let twitterAction = UIAlertAction(title: "Twitter", style: .Default) { (alert: UIAlertAction) -> Void in 

    } 

    let cancelAction = UIAlertAction(title: "Cancel", style: .Destructive) { (alert: UIAlertAction) -> Void in 

    } 

    alertViewController.addAction(facebookAction) 
    alertViewController.addAction(twitterAction) 
    alertViewController.addAction(cancelAction) 

    self.presentViewController(alertViewController, animated: true, completion:{ 
     alertViewController.view.superview?.userInteractionEnabled = true 
     alertViewController.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.alertClose(_:)))) 
    }) 
} 

fonction AlertClose:

func alertClose(gesture: UITapGestureRecognizer) { 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 
+0

Déposez votre 'alertClose' fonction. – Code

+0

Je présume que vous voulez dire UIAlertController? Vous devrez peut-être sous-classer UIAlertController, définissez le délégué GestureRecognizer sur self, de sorte que vous puissiez ensuite redéfinir shouldReceiveTouches :. De cette façon, vous pouvez retourner false lorsque le toucher est sur la fenêtre principale. Cela devrait vous donner l'effet désiré. – aronspring

+0

@Code terminé! J'ai ajouté d'autres parties de mon code – John

Répondre

0
  1. Essayez d'ajouter UITapGestureRecognizer à votre classe UIWindow comme view.window.addGestureRecognizer()

  2. implémenter la méthode UIGestureRecognizerDelegate shouldReceiveTouch et vérifiez votre point de vue taraudée

Hope this aide

1

Si vous utilisez le style ActionSheet il n'y a pas besoin de le faire. Parce que lorsque vous appuyez sur le contrôleur de vue d'écran demi-noirci automatiquement sera rejeté.

Mais si vous voulez utiliser avec le style d'alerte ne suit (sans: alertViewController.view.superview .userInteractionEnabled = true?):

 self.presentViewController(alertViewController, animated: true, completion: { 

      let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.alertClose(_:))) 
      alertViewController?.view.superview?.addGestureRecognizer(tapGestureRecognizer) 


     })