Ios 从UIViewController推送UINavigationController

Ios 从UIViewController推送UINavigationController,ios,swift,uinavigationcontroller,uinavigationbar,Ios,Swift,Uinavigationcontroller,Uinavigationbar,我会按iOS Safari中显示收藏夹/书签文件夹的方式推送UINavigationController: 我已经尝试使用单个UINavigationController,设置navigationController?。设置NavigationBarHidden(true,动画:false)在视图中将出现第一个视图,但我无法获得所需的行为:当按下子ViewController时,我会让导航栏滑入,当返回到rootViewController时,导航栏滑出 有什么建议吗?我正在使用Swift 4

我会按iOS Safari中显示收藏夹/书签文件夹的方式推送UINavigationController:

我已经尝试使用单个UINavigationController,设置
navigationController?。设置NavigationBarHidden(true,动画:false)
视图中将出现第一个视图
,但我无法获得所需的行为:当按下子ViewController时,我会让导航栏滑入,当返回到rootViewController时,导航栏滑出

有什么建议吗?我正在使用Swift 4.0.3开发目标iOS 11,提前感谢

编辑 我试图通过嵌套两个UINavigationController来实现所需的行为:

mainNavController: UINavigationController           // with hidden NavigationBar
  - firstFavoritePage: UIViewController             // as rootViewController
  - wrapper: UIViewController                       // a containerViewController
    - nestedNavController: UINavigationController
      - blankPageWithTitleAll: UIViewController     // as rootViewController
      - folderPage: UIViewController
我添加了一个包装容器ViewController,因为两个uinavigationcontroller在直接嵌套时被合并(以使UISplitViewController按预期工作),并且我在内部导航控制器中添加了一个标题为“All”的空白页,以使“ 迅速:

let wrapper = UIViewController()
let blankPageWithTitleAll = UIViewController()
let folderPage = UIViewController()
let nestedNavController = UINavigationController(rootViewController: blankPageWithTitleAll
wrapper.addChildViewController(nestedNavController)
wrapper.view.addSubview(nestedNavController.view)
nestedNavController.view.anchorToSuperview(wrapper.view)
nestedNavController.didMove(toParentViewController: wrapper)
nestedNavController.pushViewController(folderPage, animated: false)
blankPageWithTitleAll.navigationItem.title = "All"
firstFavoritePage.show(wrapper, sender: self)
现在,演示动画按预期工作,但为了排除所有问题,如果活动的ViewController是nestedNavController导航堆栈的第二个或第一个控制器,我应该:

  • 防止nestedNavController交互pop转换
  • 防止nestedNavController后退按钮弹出转换
  • 当按下“
  • [可能是最难做的事情]将nestedNavController的pop UIPercentDrivenInteractiveTransition(边缘滑动以返回交互式动画)镜像到mainNavController
我甚至不知道我是否可以获得或设置动画转换的百分比值(我认为这是不可能的,但我会尝试找出是否可能)


非常感谢您使用任何其他方法(可能更简单)使其正常工作。

您可以使用嵌入式视图控制器存档此类行为。 请参见图像中的“我的视图层次结构”: 您可以将嵌入式导航控制器作为子视图

在最后一个视图中,您必须创建类似于导航栏的视图,并且必须为pop视图控制器编写代码

代码如下:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

class MainViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

class SubViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
    }
    @IBAction func onClickBack(_ sender: UIButton) {
        self.navigationController?.popViewController(animated: true)

    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
实际结果:


如果您希望导航控制器显示在第二个视图中,而不是将第一个视图嵌入导航控制器并试图将其隐藏到第二个视图中,为什么不将视图层次结构设置为“第一个视图->导航控制器->第二个视图”?@dinosaysrawr,因为显示的是UINavigationController from UIViewController将具有从底部滑动的经典模式转换,并且您不会得到“UIViewControllerInteractivateTransition,UINavigationController用于边缘弹出手势。如果您选择您建议的路径,我应该为自己编写一个UIViewControllerTransitionDelegateUIViewControllerInteractivateTransition的克隆,实现
UIViewControllerInteractivateTransitionController的转换
UIPercentDrivenInteractiveTransition
两者都有。不过我刚刚有了一个想法:带有隐藏导航栏的导航控制器和另一个导航控制器作为子视图控制器。我不完全确定弹出式交互手势是否会如预期的那样工作。我的想法是一样的:嵌套两个UINavigationController(我更新了问题)。正如您在这里所看到的()您的解决方案并不能完全解决问题,因为您正在添加构造的导航栏,而子导航控制器需要有一个真实的导航栏(所有的过渡动画都正常工作)但是,尽管如此,您的答案还是非常有用的:
self.navigationController?.InteractivePostureRecognitizer?.delegate=nil
,我不知道可以获取或设置导航控制器的PopGestureRecognitizer。参考:。没有导航栏
InteractivePostureRecognitizer
,这就是为什么我没有将其设置为nil delegate。这是我的代码:。我已修复导航问题,请检查并告知我。我已删除导航的自定义视图和附加的真实导航。因此,您现在可以享受原始的推送-弹出转换。