Segue 动画不能完全正常工作

Segue animation isn't fully working

所以我有 2 个视图控制器和一个导航控制器。单击屏幕时,第 1 个 VC 转至第 2 个 VC,并且有一个后退按钮用于转回第一个 VC。

我不喜欢 segues 的垂直动画,所以(在一些帮助下)我创建了自定义的水平动画。

第一个 VC 非常适合从右向左滑动的动画。但是一旦完成,第二个 VC 就不想放松(第二个 VC 应该从左到右)。

我收到这个警告..

警告:尝试在 TestApp.HomeViewController 上呈现 UINavigationController:0x7fce2082b000:0x7fce20410030 其视图不在 window 层次结构中!

此外,如果我从第一个 VC segue 中获取脚本,那么我可以从第二个 VC 开始使用适当的动画来放松。

这是转场的代码:

第一VC

@IBAction func performSegue(_ sender: Any) {

    if shouldPerformSegue(withIdentifier: "segue", sender: Any?.self) {

        performSegue(withIdentifier: "segue", sender: nil)
    }
}

@IBAction func unwindToHomeView(segue: UIStoryboardSegue) {

}

override func unwind(for unwindSegue: UIStoryboardSegue, towardsViewController subsequentVC: UIViewController) {
    let segue = SegueFromLeft(identifier: unwindSegue.identifier, source: unwindSegue.source, destination: unwindSegue.destination)
    segue.perform()
}

从右到左动画

    let dst = self.destination
    let src = self.source

    let containerView = src.view.superview

    dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)

    containerView?.addSubview(dst.view)

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
        dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
    }, completion: { success in
        src.present(dst, animated: false, completion: nil)
    })

从左到右动画

    let dst = self.destination
    let src = self.source

    src.view.superview?.insertSubview(dst.view, at: 0)

    UIView.animate(withDuration: 0.25, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: {
        src.view.transform = CGAffineTransform(translationX: -src.view.frame.size.width, y: 0)
    }, completion: { success in
        src.dismiss(animated: false, completion: nil)
    })

如有任何帮助,我们将不胜感激。

您可以简单地将 viewcontroller 推送到不需要显式处理左右动画的导航控制器。在 VC1 中,navigationController?.pushViewController(VC2, animated: true) 将使用方便的后退按钮简单地从右到左为 VC2 设置动画,该按钮可用于为 VC2 从左到右显示 VC1 设置动画。

对于我的解决方案,我实际上取消了任何 "custom" 动画,主要是通过将导航控制器作为初始控制器移动到 VC1 来解决我的问题。

从那里我只是推送到下一个视图 (VC2),然后使用 unwind segue 返回(到 VC1)。

推送基本代码:

let vcName = "Main"
let viewController = storyboard?.instantiateViewController(withIdentifier: vcName)
self.navigationController?.pushViewController(viewController!, animated: true)