我在 iOS 应用程序中实现了两个视图控制器之间的自定义转换,并且它在 iOS 10、11 和 12 上运行良好。
现在我想使用 Xcode 11 beta 6 和 iOS 13 beta 8 为 iOS 13 做好准备,但转换被卡住了。
自定义转换应将第一个视图控制器向上移出屏幕,第二个视图控制器从下向上移动。但现在又回到了iOS13默认的呈现风格pageSheet
,只需将第一个视图控制器缩小一点并添加一个暗淡的覆盖层。但第二个视图没有出现。
我发现在方法中animatePresentation(context: UIViewControllerContextTransitioning)
the 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;DR
这是 iOS 中的一个错误,但你可以使用context.viewController(forKey:.from).view
作为解决方法。
详细信息
这似乎是 iOS 13.0 中的一个错误。从 iOS 13.1 beta 3 开始,它仍然存在。http://www.openradar.me/radar?id=4999313432248320 http://www.openradar.me/radar?id=4999313432248320
转换上下文的view(forKey:)
在某些情况下,方法会错误地返回 nil。看来这种情况正在发生view(forKey: .from)
当呈现视图控制器以非模态方式呈现时。当解除最初从非模态视图控制器呈现的视图控制器时,以下结果view(forKey: .to)
也为零。
我不仅在 iPhone 上的新工作表样式演示中观察到了这一点,而且还在 iPad 上的普通表单工作表和弹出窗口中观察到了这一点。
这个问题的另一个表现似乎是finalFrame(for:)
方法返回错误CGRect
当被问及此视图控制器的最终框架应该是什么时。在我的测试中,它返回一个全屏矩形,即使正确的视图较小。
解决方法是使用视图控制器返回的根视图控制器viewController(forKey:)
方法,虽然文档 https://developer.apple.com/documentation/uikit/uiviewcontrollercontexttransitioning/1622055-view明确不鼓励:“此方法返回的视图可能是也可能不是相应视图控制器的根视图。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)