UIViewController自定义过渡卡在iOS13上

Luk*_*ger 11 uiviewcontroller ios swift ios13

我已经在我的iOS应用中实现了两个视图控制器之间的自定义过渡,并且在iOS 10、11和12上运行良好。

现在,我想使用Xcode 11 beta 6和iOS 13 beta 8为iOS 13做好准备,但是过渡很困难。

自定义过渡应将第一个视图控制器向上移动并移出屏幕,第二个视图控制器从下向上移出。但是现在它又回到了iOS13的默认呈现样式pageSheet,只是将第一个视图控制器缩小了一点,并添加了暗淡的叠加层。但是第二个视图没有出现。

我发现,在该方法animatePresentation(context: UIViewControllerContextTransitioning)context不“从”视图返回,这样context.view(forKey: .from)的回报nil

没有“从”角度看,我该怎么办?

FlyUpTransition.swift

class FlyUpTransition: NSObject, UIViewControllerAnimatedTransitioning {

    var mode: Mode = .present

    enum Mode {
        case present
        case dismiss
    }

    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return TimeInterval(0.45)
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        switch mode {
        case .present:
            animatePresentation(context: transitionContext)
        case .dismiss:
            animateDismissal(context: transitionContext)
        }
    }

    func animatePresentation(context: UIViewControllerContextTransitioning) {
        guard let fromView = context.view(forKey: .from), let toView = context.view(forKey: .to) else { return }
        ...
    }

    func animateDismissal(context: UIViewControllerContextTransitioning) {
        guard let fromView = context.view(forKey: .from), let toView = context.view(forKey: .to) else { return }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*lli 11

TL; DR

这是iOS中的错误,但您可以将其context.viewController(forKey:.from).view用作解决方法。

详细资料

这似乎是iOS 13.0中的错误。自iOS 13.1 beta 3起,它仍然存在。http://www.openradar.me/radar?id=4999313432248320

view(forKey:)在某些情况下,过渡上下文的方法错误地返回nil。看来这是view(forKey: .from)在非视图方式呈现视图控制器时发生的。当从非模态视图控制器中消除最初显示的视图控制器时,的结果view(forKey: .to)也是nil。

我不仅在iPhone上的新工作表样式演示中观察到了这种情况,还在iPad上的普通表单和弹出窗口中观察到了这一点。

此问题的另一种表现似乎是,当系统询问该视图控制器的最终框架应该是什么时,该finalFrame(for:)方法返回了不正确的信息CGRect。在我的测试中,即使正确的视图较小,它也会返回全屏矩形。

一种解决方法是使用viewController(forKey:)方法返回的视图控制器的根视图控制器,尽管文档明确建议:“此方法返回的视图可能是也可能不是相应视图控制器的根视图。”


Luk*_*ger 7

好的,这很容易,尽管这是Apple的一项重大API更改。

viewController.modalPresentationStyle = .fullScreen
Run Code Online (Sandbox Code Playgroud)

现在,我必须遍历整个项目,并检查所有模态演示是否仍按我的需要。