【发布时间】:2020-01-08 04:39:57
【问题描述】:
我在我的 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 }
...
}
}
【问题讨论】:
-
这不是错误,也不是新的。非全屏演示中从未出现过视图。
-
@matt 想详细说明一下吗?为什么在非全屏演示中没有提供视图是故意的? FWIW,我可以确认我从 iPad 上的弹出窗口中获得了 iOS 12 的视图。
-
嗨@ChrisVasselli 当你做一个自定义的过渡动画时,如果你没有做一个全屏演示(比如你正在做overFullScreen或overCurrentContext),呈现的视图控制器不会移动;它的观点仍然存在。它不能被动画化,因为它不会去任何地方。它只是坐在呈现的视图控制器的视图后面。所以它不涉及动画,也没有移动到过渡上下文的世界中。
-
不,我们说的是同一件事。您的按钮 Attempt Custom Transition 会导致一个视图控制器,其 Presentation 设置为 Automatic。在 iOS 13 中,这意味着 iPad 上的 Page Sheet。那不是全屏。所以没有 From 视图,因为 From 视图不能参与任何类型的动画;它永远不能移动。这里没有错误。
-
@ChrisVasselli 我不知道你现在有什么。我下载了您的 github 示例并制作了 所有三个 视图控制器和 both 全屏并运行它,它打印“从视图确实存在”。这就是我所期望的。如果自定义演示转换中的任何一个视图不是全屏,我确实不期望 From 视图存在,因为这没有任何意义。这就是为什么我说这里没有错误。也许这个错误是在 iOS 12 及之前的版本中?
标签: ios swift uiviewcontroller ios13