2016-11-11 2 views
0

J'essaie d'implémenter une popup personnalisée avec des transitions personnalisées, mais mes méthodes de délégué ne sont pas appelées du tout. Ceci est mon délégué transition:Méthodes UIViewControllerTransitioningDelegate non appelées

public final class ModalTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate { 

    public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { 
     let controller = ModalPresentationController(presentedViewController: presented, presenting: presenting) 

     return controller 
    } 

    public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return ModalAnimationPresenter() 
    } 

    public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
     return ModalAnimationDissmiser() 
    } 
} 

Ceci est mon contrôleur de vue popup:

class StopWorkoutViewController: UIViewController { 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
     commonInit() 
    } 

    func commonInit() { 

     let transitioner = ModalTransitioningDelegate() 
     modalPresentationStyle = .custom 
     transitioningDelegate = transitioner 
    } 
} 

Voici comment je présente le menu contextuel:

@IBAction func test(_ sender: Any) { 
    let popup = UIStoryboard(name: "Popups", bundle: nil).instantiateInitialViewController() as! StopWorkoutViewController 
    present(popup, animated: true, completion: nil) 
} 

Et c'est le contrôleur de vue dans IB :

Popup ViewController

La fenêtre contextuelle est présentée, mais en plein écran.

Répondre

1

Ceci est faux

func commonInit() { 

     let transitioner = ModalTransitioningDelegate() 
     modalPresentationStyle = .custom 
     transitioningDelegate = transitioner 
    } 

Puisque vous allez animer la transition de StopWorkoutViewController .Vous devez définir le délégué de transition

@IBAction func test(_ sender: Any) { 
    let transitioner = ModalTransitioningDelegate() 
    let popup = UIStoryboard(name: "Popups", bundle: nil).instantiateInitialViewController() as! StopWorkoutViewController 
    popup.transitioningDelegate = transitioner 
    present(popup, animated: true, completion: nil) 
} 
1

Le problème est que transitioningDelegate est une propriété faible, donc la classe que vous lui attribuez est libérée avant que la transition ait une chance de s'exécuter. Voir ma réponse here pour un exemple de comment attraper cela dans le débogueur.