使用转换委托

时间:2016-07-20 14:08:54

标签: ios swift uiviewcontroller

我想呈现一个视图控制器:

  • 模态
  • 使用自定义转换
  • 同时,我想确保当它被解除时,后面的视图控制器知道被推到前台

我的基本想法是尝试一些不同的配置,看看哪一个会导致在后面的视图控制器上调用viewWillAppear

尝试1

presentedViewController.modalPresentationStyle = .Custom
presentedViewController.transitioningDelegate = someTransitioningDelegate

这种方法的结果:

  • 自定义转换效果非常好
  • 当我致电viewWillAppear时,
  • presentedViewController会在presentedViewController.dismissViewControllerAnimated(true)后面的视图控制器上调用

我确实希望在被解雇的视图控制器上调用viewWillAppear,所以我这样做了:

尝试2

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.transitioningDelegate = someTransitioningDelegate

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
presentedViewController.transitioningDelegate = someTransitioningDelegate

这种方法的结果:

    在解除viewWillAppear 时,在presentedViewController后面的视图控制器上调用
  • presentedViewController
  • 呈现视图控制器时,转换按预期发生。
  • 解雇视图控制器时,转换期间的背景为黑色,这是不可取的。

似乎.FullScreen导致presentedViewController后面的视图控制器从显示层次结构中删除 - 这很好,因为可能是触发viewWillAppear调用的原因。

尝试3

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical

结果如下:

    viewWillAppear后面的视图控制器上调用
  • presentedViewController
  • 转换期间的背景是位于presentedViewController后面的视图控制器,这是期望的。
  • 没有自定义转换。

我正在研究的项目的结构使得难以使用委托(这似乎是建议的答案here)。使用NSNotificationCenter是另一种选择,它允许我调用应该由viewWillAppear调用的代码,但是从尝试3开始,我希望有更优雅的方法来实现所有这些:

  1. 触发viewWillAppear
  2. 使用自定义转换
  3. 查看过渡动画期间在背景中显示的视图控制器

2 个答案:

答案 0 :(得分:4)

似乎Apple认为调用viewWillAppear等是犯规行为,但可以调用beginAppearanceTransitionendAppearanceTransitionwhich in turn will invoke viewWillAppear。我要和你一起去。

答案 1 :(得分:-1)

我过去实现这一目标的方法是从过渡动画师调用viewWillAppear和viewDidAppear。这是一个简单的例子:

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

}

我打电话给"将"我做动画之前的方法,"做了#34;完成后的方法