[英]Dismissal completion callback is executed after custom view controller transition is cancelled
[英]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
確實會被調用。 集合視圖數據源方法也不會被調用,因此這就是為什么不顯示單元格的原因。
我知道我缺少一些非常簡單的東西,但無法弄清楚是什么。 我還在這里檢查了一些答案,但沒有一個對我有幫助。
如果您知道如何解決此問題,將不勝感激。
花了一些時間后,我終於找到了解決方案。 正如蘋果文檔中所說的那樣,我們不能直接調用視圖控制器的生命周期方法(當然,可以,但是不建議這樣做)。 要調用viewController1
生命周期方法,請從動畫師調用beginAppearanceTransition(_:animated:)
方法:
toViewController?.beginAppearanceTransition(true, animated: true)
現在,這確實調用了視圖控制器的生命周期方法,但是視圖布局變得一團糟(我認為,這是因為最初從viewController1
過渡時,我不僅更改了其位置,還更改了其比例)。
因此,最后我也找到了解決該問題的方法。 為了解決這個問題,從viewController1
過渡時,我不對視圖控制器本身(位置和比例)進行動畫處理,而是使用其快照(以下動畫代碼在動畫中,用於從viewController1
過渡到viewController2
):
let snapshot = UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: false)
具有快照后,只要轉變開始我插入快照到containerView
上的頂部viewController1
,並刪除viewController1
從上海華。 現在,我為快照制作動畫,該快照模仿viewController1
。
這對我來說很好。 也許它將對其他人有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.