在自定义模式解雇转换后,第一个视图控制器的生命周期方法不会被调用

时间:2018-06-13 18:43:59

标签: ios swift uicollectionview uistoryboardsegue

我有两个视图控制器:viewController1viewController2viewController1包含一个包含多个单元格的集合视图。

它们通过模态segue连接。为了在它们之间导航,我创建了两个动画制作工具,用于显示viewController2showAnimator)和解除它(dismissAnimator)。

dismissAnimator我动画fromViewviewController2的视图)和toViewviewController1的视图) 。以下是执行此操作的两种方法:

 private func animateFromViewDisappearance(fromView: UIView?, withDuration duration: TimeInterval, usingTransitionContext transitionContext: UIViewControllerContextTransitioning?) {
    guard let containerView = transitionContext?.containerView, let fromView = fromView else {return}

    UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: .curveEaseInOut, animations: {
        fromView.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
        fromView.alpha = 0.0
    }, completion: {_ in

    })
}

 private func animateToViewAppearance(toView: UIView?, withDuration duration: TimeInterval, usingTransistionContext transitionContext: UIViewControllerContextTransitioning?) {
    guard let containerView = transitionContext?.containerView, let toView = toView else {
        return}


    toView.frame = containerView.frame
    toView.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
    toView.alpha = 0.0
    containerView.addSubview(toView)

    UIView.animate(withDuration: duration, delay: 0.3, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: .curveEaseInOut, animations: {
        toView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        toView.alpha = 1.0
    }) { (success) in
        if success {
            transitionContext?.completeTransition(true)
        }
    }
}

这些方法是从animateTransition(using:)调用的。

问题是动画结束后,在集合视图的viewController1单元格中不会出现。我只是获取视图控制器和集合视图本身的视图。我已经检查过并注意到视图控制器的生命周期方法也没有被调用,但是viewDidLayoutSubviews会被调用。收集视图数据源方法也不会被调用,这就是为什么细胞不会出现。

我知道我错过了一些非常简单但却无法弄清楚的东西。我也在这里查了几个答案,但没有人帮我。

如果您知道如何解决此问题,我将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

花了一些时间后我终于找到了解决方案。正如在Apple的文档中所述,我们无法直接调用视图控制器的生命周期方法(嗯,我们可以,但不建议这样做)。要调用viewController1生命周期方法,我从animator调用beginAppearanceTransition(_:animated:)方法:

 toViewController?.beginAppearanceTransition(true, animated: true)

现在,这确实调用了视图控制器的生命周期方法,但是视图布局变得完全混乱(我认为,这是因为最初从viewController1转换时我不仅改变了它的位置,但它的规模)。

所以,最后我找到了解决这个问题的方法。为了解决这个问题,当从viewController1转换时,我没有为视图控制器本身设置动画(它的位置和比例),但我使用它的快照(动画中的以下代码用于从viewController1转换为{ {1}}):

viewController2

获得快照后,转换开始后,我将快照插入 let snapshot = UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: false) 顶部的containerView,然后从超级视图中删除viewController1。现在,我为快照设置动画,模拟viewController1

这对我来说很好。也许它适用于其他人。