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:)方法返回的视图控制器的根视图控制器,尽管文档明确建议:“此方法返回的视图可能是也可能不是相应视图控制器的根视图。”
好的,这很容易,尽管这是Apple的一项重大API更改。
viewController.modalPresentationStyle = .fullScreen
Run Code Online (Sandbox Code Playgroud)
现在,我必须遍历整个项目,并检查所有模态演示是否仍按我的需要。