【问题标题】:How to Push a ViewController with a ModalView?如何使用 ModalView 推送 ViewController?
【发布时间】:2018-10-17 11:34:16
【问题描述】:

如何将呈现模态视图 (MV) 的 UIViewController (VC) 推送到具有单个从左到右过渡动画的屏幕?

我试过了:

  • 设置MV的模态过渡风格,然后将两个控制器都添加到导航控制器的viewControllers中。然而,这导致 MV 只是一个控制器,就像堆栈中的任何其他控制器一样被解雇。

  • 我曾尝试从 VC 中呈现 MV,但没有动画,然后将 VC 添加到 viewControllers 并呈现如上所示的堆栈。这导致当开始向 VC 过渡时,MV 会立即呈现,而 VC 本身会按预期动画到屏幕上。例如。 MV滑入时不跟随VC。

  • 我曾尝试在启用动画的情况下从 VC 呈现 MV,但这会导致两个过渡:首先 VC 动画到屏幕,然后 VC 向上滑动。

我没有想法,但我想要一个原生且干净的解决方案:当 VC 完全被 MV 覆盖时,如何通过一次正常的从左到右推动转换到 VC?

关键是MV和VC一起做动画; MV 会出现并表现得像一个全屏子视图,但是当它被关闭时,它会像任何其他模态视图控制器一样在屏幕外显示动画。

【问题讨论】:

  • 您是否尝试使用自定义动画“present()”VC,而不是“自下而上”动画?还是带有通常执行“从右到左”动画的导航控制器的“push()”?
  • 根据 Apple 文档,有两种显示 VC 的方法:呈现或嵌入。我相信嵌入不会允许我使用 UIKit 动画来关闭视图;我将不得不自己动手(这不是真正的问题,只是我觉得不太干净的解决方案)。所以我需要以这样一种方式呈现的视图,它可以像任何模态视图一样被关闭,但与它的呈现视图控制器一起显示和动画。

标签: ios swift xcode navigation uikit


【解决方案1】:

这个问题有很多解决方案。我认为 UIPresentationController 可以提供一个重要的线索。

我试图在这里尽可能简单地回答。您可以根据需要更改参数甚至子类 UIPresentationController 来实现完整的动画。

         import UIKit


        //Green
        class TransViewController: UIViewController {

            // MARK: - Navigation


            override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                // Get the new view controller using segue.destination.
                // Pass the selected object to the new view controller.
               let dest = segue.destination
               let nextVC = storyboard?.instantiateViewController(withIdentifier: "modelViewController")
                if let myPresenter = dest.presentationController{
                    myPresenter.presentedView!.addSubview(nextVC!.view)
                    nextVC!.view.center = CGPoint.init(x: nextVC!.view.center.x + nextVC!.view.frame.width , y: nextVC!.view.center.y)
                    UIView.animate(withDuration: 0.5, animations: {
                         nextVC!.view.center = self.view.center
                    }) { (success) in
                        dest.present(nextVC!, animated: false, completion: nil)
                    }
                }
            }
        }


        //Yellow  ; "modelViewController"

        class ModelViewController: UIViewController {
            @IBAction func click(_ sender : UIButton){
              self.dismiss(animated: true, completion: nil)
            }
        }

【讨论】:

  • 我非常感谢您的努力,谢谢。但是,除非我在 IB 中设置错误,否则这并不是我想要的。我看到了两个过渡;红色到黄色。此外,导航栏最初显示,然后在显示 ModelVC(黄色)后隐藏。这也是你看到的吗?
  • 是的。您可以更改偏移量或子类以获得您真正想要的。我的观点是使用 uipresentationcontroller 是实现您想要的快速方法。
  • 好的,我明白了。我会深入研究一下。
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 2011-03-01
  • 2020-07-10
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多