Ios 使用转换委托时将显示触发器视图

Ios 使用转换委托时将显示触发器视图,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,我想展示一个视图控制器: 模态 使用自定义转换 同时,我想确保当它被解除时,它后面的视图控制器意识到被推到前台 我的基本想法是尝试一些不同的配置,看看哪种配置会导致在后面的视图控制器上调用viewwillbeen 尝试1 presentedViewController.modalPresentationStyle = .Custom presentedViewController.transitioningDelegate = someTransitioningDelegate 这种方法的

我想展示一个视图控制器:

  • 模态
  • 使用自定义转换
  • 同时,我想确保当它被解除时,它后面的视图控制器意识到被推到前台
我的基本想法是尝试一些不同的配置,看看哪种配置会导致在后面的视图控制器上调用
viewwillbeen

尝试1

presentedViewController.modalPresentationStyle = .Custom
presentedViewController.transitioningDelegate = someTransitioningDelegate
这种方法的结果是:

  • 自定义转换工作得非常好
  • 视图将出现
    当我调用
    presentedViewController时,是否
    presentedViewController后面的视图控制器上被调用
我确实希望在要取消的视图控制器下面的视图控制器上调用
viewwillbeen
,所以我这样做了:

尝试2

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.transitioningDelegate = someTransitioningDelegate

这种方法的结果是:

  • view将出现
    在解除
    presentedViewController
    时,在
    presentedViewController后面的视图控制器上被调用
  • 显示视图控制器时,转换按预期进行
  • 解除视图控制器时,过渡期间的背景为黑色,这是不需要的
似乎
.FullScreen
会导致
presentedViewController
后面的视图控制器从显示层次结构中删除-这很好,因为这可能是触发
视图将出现
调用的原因

尝试3次

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
其结果是:

  • 视图将出现
    presentedViewController
    后面的视图控制器上被调用
  • 转换过程中的背景是位于所需的presentedViewController后面的视图控制器
  • 没有自定义转换

我正在从事的项目的结构使得使用委派(这似乎是建议的答案)变得困难。使用
NSNotificationCenter
是另一种选择,它允许我调用应该由
视图调用的代码,但在尝试3中,我希望有一种更优雅的方法来实现所有这些:

  • 触发器
    视图将出现
  • 使用自定义转换
  • 请参见过渡动画期间在背景中显示的视图控制器

  • 我在过去实现这一点的方法是从transition animator中调用ViewWillDisplay和ViewDidDisplay。下面是一个简化的示例:

    public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    
        let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
        let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
    
        fromVC.viewWillDisappear(true)
        toVC.viewWillAppear(true)
    
        UIView.animateWithDuration(0.3, animations: {
    
                //Animations here
    
                }, completion: { (success) in
                    toVC.viewDidAppear(success)
                    fromVC.viewDidDisappear(success)
                    transitionContext.completeTransition(true)
            })
    
    }
    

    在我制作动画之前,我会调用“will”方法,而完成之后的“did”方法似乎苹果认为调用
    viewwillbeen
    等是一种不道德的行为,但是调用
    beginAppearanceTransition
    endAppearanceTransition
    也没关系。我同意这个

    public func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    
        let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
        let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
    
        fromVC.viewWillDisappear(true)
        toVC.viewWillAppear(true)
    
        UIView.animateWithDuration(0.3, animations: {
    
                //Animations here
    
                }, completion: { (success) in
                    toVC.viewDidAppear(success)
                    fromVC.viewDidDisappear(success)
                    transitionContext.completeTransition(true)
            })
    
    }