如何在不使用导航控制器的情况下推送 UIViewController?

Posted

技术标签:

【中文标题】如何在不使用导航控制器的情况下推送 UIViewController?【英文标题】:How to push a UIViewController without using a navigational controller? 【发布时间】:2017-06-23 09:13:45 【问题描述】:

我试图模仿SFSafariViewController 可以观察到的行为。呈现时,推送过渡动画与根 UINavigationalController 一样使用。当边缘平移向右滑动时,弹出过渡随之而来。

let url = URL(string: "http://google.com")!
let safari = SFSafariViewController(url: url)
present(safari, animated: true, completion: nil)

但是,我需要相同的过渡才能与任何其他 UIViewController 一起工作。

let storyboard = UIStoryboard(name: "Place", bundle: nil)
let controller = storyboard.instantiateInitialViewController()
present(controller!, animated: true, completion: nil)

【问题讨论】:

您始终可以使用自定义过渡呈现和关闭。看看这个tutorial,它可能会有所帮助。 【参考方案1】:

使用CATransition,您可以在呈现ViewController时更改动画方向

    let controller = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()

    let transition = CATransition()
    transition.duration = 0.5
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromRight
    view.window!.layer.add(transition, forKey: kCATransition)
    present(controller, animated: false, completion: nil)

【讨论】:

【参考方案2】:

@Fuxing,没有导航控制器就无法推送视图控制器。推送视图控制器有两种选择。

    将导航控制器添加到情节提要中的 viewController。

    创建导航控制器的对象。

    let viewToPush = YourViewController()
    let nav = UINavigationController(rootViewController: viewToPush)    
    nav.pushViewController(nav, animated: true)
    

【讨论】:

我不明白第二个选项。我当前的视图控制器没有导航控制器。 复制我的回答中提到的代码,把YourViewController换成你自己的视图控制器。

以上是关于如何在不使用导航控制器的情况下推送 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

在没有 UINavigationController 的情况下推送 Segue 动画

如何在不使用导航栏的情况下从导航堆栈中弹出控制器

在不使用导航控制器的情况下转到第二个视图时如何显示动画?

Swift:如何在不添加工具栏的情况下更改导航控制器的高度

如何在不丢失导航栏的情况下将子视图添加到 UINavigation 控制器?

在没有导航控制器的情况下推送 UIViewController