簡體   English   中英

自定義模式解雇過渡后,不會調用第一個視圖控制器的生命周期方法

[英]After custom modal dismissal transition the first view controller's lifecycle methods don't get called

我有兩個視圖控制器: viewController1viewController2 viewController1包含具有多個單元格的集合視圖。

它們通過模態搜索連接。 為了在它們之間導航,我創建了兩個動畫器以顯示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確實會被調用。 集合視圖數據源方法也不會被調用,因此這就是為什么不顯示單元格的原因。

我知道我缺少一些非常簡單的東西,但無法弄清楚是什么。 我還在這里檢查了一些答案,但沒有一個對我有幫助。

如果您知道如何解決此問題,將不勝感激。

花了一些時間后,我終於找到了解決方案。 正如蘋果文檔中所說的那樣,我們不能直接調用視圖控制器的生命周期方法(當然,可以,但是不建議這樣做)。 要調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM