【问题标题】:UIViewController custom transition stuck on iOS13UIViewController 自定义过渡卡在 iOS13 上
【发布时间】: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


【解决方案1】:

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) 的结果也为零。

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

这个问题的另一个表现似乎是finalFrame(for:) 方法在被问及这个视图控制器的最终帧应该是什么时返回一个不正确的CGRect。在我的测试中,它返回一个全屏矩形,即使正确的视图更小。

一种解决方法是使用viewController(forKey:) 方法返回的视图控制器的根视图控制器,尽管the documentation 明确不鼓励这样做:“此方法返回的视图可能是也可能不是相应视图控制器的根视图。”

【讨论】:

  • Xcode 11.0, iOS 13.1 (17A5837a),bug依然存在。我稍后会尝试最新的iOS并更新评论
  • iOS 13.1 和 iOS 13.1.2,Xcode 11.1,我尝试使用相同的动画器同时使用 transitionContext.view(forKey: .from) 和 transitionContext.view(forKey: .from),toView 和 fromView 是正确返回和过渡可以加快执行。雷达的状态是打开的,但是这个问题似乎已经解决了。
  • 这个错误破坏了我的自定义过渡,感谢 Apple。
【解决方案2】:

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

viewController.modalPresentationStyle = .fullScreen

现在我必须检查我的整个项目并检查所有模态演示,如果它们看起来仍然像我需要的那样。

【讨论】:

    【解决方案3】:

    上面的答案是正确的将modalPresentationStyle设置为.fullScreen,但是还值得一提的是,如果您的视图控制器嵌入在UINavigationController中,则需要在导航控制器上进行设置:

    navigationController.modalPresentationStyle = .fullScreen
    

    【讨论】:

      【解决方案4】:

      我在 IB 中通过从一个集合 VC 拖放到另一个 VC 来设置 segue,该 VC 用于显示详细信息。

      我对这个问题有新的发现,要参考'toView'和'fromView',以下两种方法都有效

      间接方式:

      transitionContext.viewController(forKey: .to)?.view
      transitionContext.viewController(forKey: .from)?.view
      

      直接方式:

      transitionContext.view(forKey: .to)
      transitionContext.view(forKey: .from)
      

      但是当我将 segue 样式切换为“Over Full Screen”时,“toView”和“fromView”的直接方式返回“nil”,并且只能间接方式工作。

      希望这对将来的某人有所帮助。

      附:这是我在前往solve another problem 途中的发现,如果您还遇到“工作动画师”在 iOS 13 及更高版本中停止工作的问题,这可能会有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多