在自定义模态解除转换后,第一个视图控制器的生命周期方法不会被调用
After custom modal dismissal transition the first view controller's lifecycle methods don't get called
我有两个视图控制器:viewController1
和 viewController2
。 viewController1
包含一个包含多个单元格的集合视图。
它们通过模态转场连接。为了在它们之间导航,我创建了两个动画师来显示 viewController2
(showAnimator
) 和关闭它 (dismissAnimator
)。
在 dismissAnimator
中,我为 fromView
(viewController2
的视图)和 toView
(viewController1
的视图)设置了动画。以下是执行此操作的两种方法:
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
确实被调用了。集合视图数据源方法也不会被调用,所以这就是单元格不会出现的原因。
我知道我遗漏了一些非常简单的东西,但无法弄清楚是什么。我在这里也检查了一些答案,但是 none 对我有帮助。
如果您知道如何解决这个问题,我将不胜感激。
我花了一些时间终于找到了解决办法。正如 Apple 文档中所说,我们不能直接调用视图控制器的生命周期方法(好吧,我们可以,但不推荐)。要调用 viewController1
生命周期方法,我从动画师调用 beginAppearanceTransition(_:animated:)
方法:
toViewController?.beginAppearanceTransition(true, animated: true)
现在,这确实调用了视图控制器的生命周期方法,但是视图布局变得一团糟(我认为,那是因为最初从 viewController1
转换时,我不仅更改了它的位置,还更改了它的比例).
所以,最后我也找到了解决该问题的方法。为了解决这个问题,当从 viewController1
过渡时,我没有为视图控制器本身(它的位置和比例)设置动画,而是使用它的快照(以下代码在动画器中用于从 viewController1
过渡到 viewController2
):
let snapshot = UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: false)
获得快照后,转换一开始,我就将快照插入 viewController1
顶部的 containerView
,并从超级视图中删除 viewController1
。现在,我为模仿 viewController1
的快照制作动画。
这对我来说很好用。也许它对其他人有用。
我有两个视图控制器:viewController1
和 viewController2
。 viewController1
包含一个包含多个单元格的集合视图。
它们通过模态转场连接。为了在它们之间导航,我创建了两个动画师来显示 viewController2
(showAnimator
) 和关闭它 (dismissAnimator
)。
在 dismissAnimator
中,我为 fromView
(viewController2
的视图)和 toView
(viewController1
的视图)设置了动画。以下是执行此操作的两种方法:
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
确实被调用了。集合视图数据源方法也不会被调用,所以这就是单元格不会出现的原因。
我知道我遗漏了一些非常简单的东西,但无法弄清楚是什么。我在这里也检查了一些答案,但是 none 对我有帮助。
如果您知道如何解决这个问题,我将不胜感激。
我花了一些时间终于找到了解决办法。正如 Apple 文档中所说,我们不能直接调用视图控制器的生命周期方法(好吧,我们可以,但不推荐)。要调用 viewController1
生命周期方法,我从动画师调用 beginAppearanceTransition(_:animated:)
方法:
toViewController?.beginAppearanceTransition(true, animated: true)
现在,这确实调用了视图控制器的生命周期方法,但是视图布局变得一团糟(我认为,那是因为最初从 viewController1
转换时,我不仅更改了它的位置,还更改了它的比例).
所以,最后我也找到了解决该问题的方法。为了解决这个问题,当从 viewController1
过渡时,我没有为视图控制器本身(它的位置和比例)设置动画,而是使用它的快照(以下代码在动画器中用于从 viewController1
过渡到 viewController2
):
let snapshot = UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: false)
获得快照后,转换一开始,我就将快照插入 viewController1
顶部的 containerView
,并从超级视图中删除 viewController1
。现在,我为模仿 viewController1
的快照制作动画。
这对我来说很好用。也许它对其他人有用。