自定义 UIViewController 过渡动画适用于演示,但不适用于解雇

Posted

技术标签:

【中文标题】自定义 UIViewController 过渡动画适用于演示,但不适用于解雇【英文标题】:Custom UIViewController transition animation works on presentation but not on dismissal 【发布时间】:2018-04-18 20:34:19 【问题描述】:

我有UINavigationController A,它是UISplitViewController 的“左侧”视图控制器,我在UINavigationController A 上以模态方式呈现UINavigationController B。此模态演示使用情节提要转场执行,并在 Interface Builder 中设置了以下属性:Kind = Present Modally, Presentation = Over Current Context, Transition = Default, Animates = true

UINavigationController A的根视图控制器中,我有以下属性:

let themesTransitionDelegate = ThemesTransitionDelegate()

以及prepareForSegue方法的如下实现:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    segue.destination.transitioningDelegate = themesTransitionDelegate
    segue.destination.view.frame = view.bounds

ThemesTransitionDelegate的实现如下:

class ThemesTransitionDelegate: NSObject, UIViewControllerTransitioningDelegate 

    func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? 

        return ThemesTransitionAnimator()
    

    func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? 

        // THIS IS NEVER CALLED!
        return ThemesTransitionAnimatorDismiss()
    


我的自定义动画在呈现模态时工作正常,但从未调用 animationController(forDismissed dismissed: UIViewController) 并且未使用我的自定义解除动画 - 而是使用标准模态解除动画。

我正在使用从UINavigationController B 的根视图控制器调用的dismiss(animated: true, completion: nil) 来触发所呈现模式的解除。我已经确认 UINavigationController BtransitioningDelegate 在触发解雇时不为零。

这里可能出了什么问题?

【问题讨论】:

【参考方案1】:

您在情节提要中设置了错误的modalPresentationStyle。使用UIModalPresentationCustom

override func prepare(for segue: UIStoryboardSegue, sender: Any?)         
    segue.destination.modalPresentationStyle = .custom //Custom presentation
    segue.destination.transitioningDelegate = themesTransitionDelegate
    segue.destination.view.frame = view.bounds

【讨论】:

宾果游戏。谢谢!知道为什么演示文稿有效但在这种情况下解雇没有?我的直觉是期望它们两者都起作用,或者两者都不起作用

以上是关于自定义 UIViewController 过渡动画适用于演示,但不适用于解雇的主要内容,如果未能解决你的问题,请参考以下文章

iOS:自定义后退按钮过渡动画

UIViewController 动画过渡在 iOS8 中失败

如何在将 UIViewController 呈现给自定义时更改默认转换

推送 UIViewController

带有自定义过渡的 presentViewController

UIViewController 过渡在下拉手势关闭时闪烁