[英]UIViewController custom transition stuck on 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 }
...
}
}
TL; 博士
这是 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)
的结果也为零。
我不仅在 iPhone 上的新表单样式演示中观察到了这一点,而且在 iPad 上的正常表单和弹出窗口中也观察到了这一点。
这个问题的另一个表现似乎是当被问及这个视图控制器的最终帧应该是什么时, finalFrame(for:)
方法返回一个不正确的CGRect
。 在我的测试中,即使正确的视图较小,它也会返回全屏矩形。
一种解决方法是使用viewController(forKey:)
方法返回的视图控制器的根视图控制器,尽管文档明确反对:“此方法返回的视图可能是也可能不是相应视图控制器的根视图。”
好吧,这很容易,尽管这是 Apple 的一个重大 API 更改。
viewController.modalPresentationStyle = .fullScreen
现在我必须完成我的整个项目并检查所有模态演示是否仍然符合我的需要。
上面的答案是将modalPresentationStyle
设置为.fullScreen
是正确的,但是还值得一提的是,如果您的视图控制器嵌入在UINavigationController
,则需要在导航控制器上设置它:
navigationController.modalPresentationStyle = .fullScreen
我通过从一个集合 VC 拖放到另一个 VC 来设置 IB 中的 segue,用于显示详细信息。
我对这个问题有了新的发现,参考'toView'和'fromView',下面两种方法都可以
间接方式:
transitionContext.viewController(forKey: .to)?.view
transitionContext.viewController(forKey: .from)?.view
直接方式:
transitionContext.view(forKey: .to)
transitionContext.view(forKey: .from)
但是,当我将 segue 样式切换为“全屏显示”时,“toView”和“fromView”的直接方式返回“nil”,并且仅间接方式起作用。
希望这会对将来的某人有所帮助。
PS这是我在解决另一个问题的过程中的发现,如果您还遇到“工作动画师”在iOS 13及更高版本中停止工作的问题,这可能会有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.