快速滑出菜单而不滑动导航栏(以编程方式)

Posted

技术标签:

【中文标题】快速滑出菜单而不滑动导航栏(以编程方式)【英文标题】:swift slide out menu without sliding the navigationbar (programatically) 【发布时间】:2015-04-03 03:05:20 【问题描述】:

几天来,我一直在尝试制作左侧滑出式菜单。我无法让任何库与我的应用程序一起使用,所以我求助于 raywenderlich 的教程:

http://www.raywenderlich.com/78568/create-slide-out-navigation-panel-swift

但是,它并不完全符合我的要求。我的主要问题是,当我滑出菜单时,导航栏也会随之滑出。我需要我的导航栏保持原位,并且只移动它下面的内容。

我尝试了“self.view.bringSubviewToFront(navigationController.navigationBar)”但是没有用。

这是我正在尝试完成的屏幕截图。

我当前的设置是使用在我的appDelegate'sdidFinishLaunchingWithOptions 中设置的ContainerViewController 进行的:

window = UIWindow(frame: UIScreen.mainScreen().bounds)

    let containerViewController = ContainerViewController()

    window!.rootViewController = containerViewController
    window!.makeKeyAndVisible()

    return true

此 ContainerViewController 正在获取 2 个 childViewController。

CenterViewControllerController(我的内容)

CenterViewController 将正确设置 navigationController。

var centerNavigationController: NavigationController!
var centerViewController: CenterViewController!

ContainerViewControllerviewDidLoad

  override func viewDidLoad() 
    super.viewDidLoad()

    centerViewController = UIStoryboard.centerViewController()
    centerViewController.delegate = self

    // wrap the centerViewController in a navigation controller, so we can push views to it
    // and display bar button items in the navigation bar
    centerNavigationController = NavigationController(rootViewController: LandingPageVC())
    view.addSubview(centerNavigationController.view)
    addChildViewController(centerNavigationController)

    centerNavigationController.didMoveToParentViewController(self)

    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "handlePanGesture:")
    centerNavigationController.view.addGestureRecognizer(panGestureRecognizer)
  

和 SidePanelViewController(我的菜单和有问题的菜单。)

var leftViewController: SidePanelViewController?

  func addLeftPanelViewController() 
    if (leftViewController == nil) 
        leftViewController = SidePanelViewController()

        addChildSidePanelController(leftViewController!)
    
  

  func addChildSidePanelController(sidePanelController: SidePanelViewController) 
    println("addChildSidePanelController")

    view.insertSubview(sidePanelController.view, atIndex: 0)

    addChildViewController(sidePanelController)
    sidePanelController.didMoveToParentViewController(self)
  

SidePanelViewController 目前没有导航控制器。我确实尝试添加它。但这并没有达到预期的效果。

基于 cmets,我需要做的是以某种方式使 ContainerViewController 成为具有 navigationController 的那个,所以它的两个 childControllers 也应该有吗?但是我不知道如何在该级别上添加 navigationController。

任何帮助将不胜感激! (我没有使用故事板)

我尝试过的库:

ENSwiftSideMenu(做了我想做的事。但花了 2 天时间试图让它工作但没有结果)

Brian Advent youtube 教程

Dekatotoro 的 SlideMenuControllerSwift

wanaya/幻灯片菜单

Swift 中的 SWRevealViewController

【问题讨论】:

您认为需要嵌入导航控制器的是 ContainerViewController 是正确的。您只需要在应用程序委托中实例化一个导航控制器,并将 ContainerViewController 作为其 rootViewController。然后让导航控制器成为窗口的rootViewController。子控制器不应该嵌入到他们自己的导航控制器中(如果我理解你想要什么,但这取决于你在 MenuController 中选择菜单项时想要发生什么)。 顺便说一句,这条线应该做什么:centerViewController = UIStoryboard.centerViewController()? UIStoryboard 没有那个功能,而且我还以为你没有使用故事板。 @rdelmar 我会尝试看看我是否不能这样做。我想我知道我该怎么做:),至于故事板的事情。雷的文件有它们。我还没有弄清楚如何在不破坏东西的情况下完全删除他的故事板,但这不是我现在的主要问题。这些功能是他在扩展中指定的一些功能。但我不使用它们。只是从现在开始删除它们会导致错误。我还有其他几个问题。但这是唯一一个可能意味着我必须重做所有事情的人。所以我需要在其他人之前解决这个问题。 @rdelmar 我设法在ContainerViewController 级别上实现了navigationController。但是,我无法弄清楚如何使我的CenterViewController 成为LandingPage_VC()。正如您在代码中看到的那样,我曾经使用rootViewController 来做到这一点。我将如何将LandingPage_VC() 设为CenterViewController 我不确定。我真的不知道你在用 CenterViewController 做什么——我不知道你希望它如何与 LandingPageVC 相关联。这对我来说似乎过于复杂。我也不知道你是否真的希望 CenterViewController 嵌入到它自己的导航控制器中。当用户选择菜单项时,您希望发生什么? 【参考方案1】:

我会使用嵌入在导航控制器中的自定义容器控制器来执行此操作(以获取导航栏)。这个控制器将有两个容器视图,一个宽度为屏幕宽度的 80% 的左侧视图,以及一个全屏宽度的右侧视图;这些可以在情节提要中设置。添加到容器控制器视图的滑动手势识别器将允许您滑动打开和关闭菜单。下面的代码是您在容器视图控制器中打开和关闭菜单所需的全部内容。出口leftCon是左容器视图的左边缘与其父视图之间的约束,

class ViewController: UIViewController 

    @IBOutlet weak var leftCon: NSLayoutConstraint!
    @IBOutlet weak var leftContainer: UIView!


    @IBAction func closeMenu(sender: UISwipeGestureRecognizer) 
        leftCon.constant = -leftContainer.frame.size.width
        UIView.animateWithDuration(0.3)
            self.view.layoutIfNeeded()
        
    

    @IBAction func openMenu(sender: UISwipeGestureRecognizer) 
        leftCon.constant = 0
        UIView.animateWithDuration(0.3)
            self.view.layoutIfNeeded()
        
    


我有一个示例应用程序 (http://jmp.sh/5QwhYov) 演示了控制器的设置,但没有说明如何根据菜单控制器中的选择更改主控制器中的内容。有很多方法可以实现,如果你能提供更多关于你希望它如何显示的细节,我可以解决这个问题。

【讨论】:

抱歉,我忘了说明我没有使用情节提要。我一直在尝试以编程方式实现这一点,但没有任何成功。我现在设置它的方式是使用 2 个不同的视图控制器,这有很多好处。但是当然,如​​果现在可能的话,我将不得不查看单个 viewController 中的容器视图?非常感谢您花时间回答这个问题,很抱歉我未能更准确地说明我的工作方式。 以编程方式在容器左侧设置约束?用它作为你的 leftCon @milo526,我不知道你为什么要在没有情节提要的情况下这样做,这当然是更简单的方法,但可以使用自定义容器控制器 api 在代码中完成。如果您对此不熟悉,您应该阅读 Apple 的文档“创建自定义容器视图控制器”。 @Thomas,抱歉,Jump Share 有更新,该文件最终位于文件夹中,因此链接已更改。我已经更新了答案中的链接。 @rdelmar,您提到“但没有说明如何根据菜单控制器中的选择更改主控制器中的内容。有多种方法可以实现”可以你请分享实现...

以上是关于快速滑出菜单而不滑动导航栏(以编程方式)的主要内容,如果未能解决你的问题,请参考以下文章

单击不起作用的滑出菜单栏

以编程方式获取导航栏的高度

如何从左侧而不是从顶部滑动导航栏?

如何以编程方式在 ios 的滑出式侧边栏菜单中添加按钮

Foundation 滑动导航(Off-Canvas)

底部应用栏在使用片段导航时向上/向下滑动(导航架构组件)