消除单元格和导航栏之间的间隙

Posted

技术标签:

【中文标题】消除单元格和导航栏之间的间隙【英文标题】:Remove gap between cell and navbar 【发布时间】:2015-09-10 17:59:54 【问题描述】:

我在我的应用程序中实现了ENSwiftSideMenu,(你可以使用它提供的示例项目,因为它有同样的问题,)当我将iPhone旋转到纵向模式时,菜单tableView之间有一个间隙导航栏和单元格

我发现了问题。它位于以下文件中:MyMenuTableViewController.swift

tableView.contentInset = UIEdgeInsetsMake(64.0, 0, 0, 0)

所以我把64的高度换成了navbar的高度:

override func viewDidLoad() 
    super.viewDidLoad()
     tableView.contentInset = UIEdgeInsetsMake(self.navigationController!.navigationBar.frame.height, 0, 0, 0) // Error


override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
    tableView.contentInset = UIEdgeInsetsMake(self.navigationController!.navigationBar.frame.height, 0, 0, 0)

当我运行应用程序时,viewDidLoad 中的代码出现以下错误:

致命错误:在展开可选值时意外发现 nil

加载第一页之前的错误(在初始屏幕上)。我能做些什么来解决这个问题?或者如果有更好的方法来消除差距,请告诉我。我已经尝试在viewDidLoad 中添加以下内容:

self.automaticallyAdjustsScrollViewInsets = true

这没有任何作用。

【问题讨论】:

如果删除contentInset 行会怎样? 菜单/tableView 一直在顶部,隐藏在navbar 后面 【参考方案1】:

好的,我一直在研究 ENSwiftSideMenu 的工作原理。看起来你的侧边菜单没有添加到导航堆栈中,所以如果你调用 self.navigationController,它总是返回 nil。

此外,ENSwiftSideMenu 使用自定义导航控制器:ENSideMenuNavigationController,它有一个名为 sideMenu 的属性,不幸的是,它继承自 NSObject(而不是 UIViewController)。所以基本上,我要做的是更改MyNavigationController 类,使其包含对用作侧边菜单的MyMenuTableViewController 的引用,并根据ENSideMenuNavigationController 的导航栏大小将内容插入应用到它的tableview。

最后,你需要在旋转完成后应用side table view的contentInset,所以你需要观察UIDeviceOrientationDidChangeNotification的通知。

MyNavigationController 类应该是这样工作的:

class MyNavigationController: ENSideMenuNavigationController, ENSideMenuDelegate 

    private let menuTableViewController = MyMenuTableViewController()

    override func viewDidLoad() 
        super.viewDidLoad()
        sideMenu = ENSideMenu(sourceView: self.view, menuViewController: menuTableViewController, menuPosition:.Left)
        //sideMenu?.delegate = self //optional
        sideMenu?.menuWidth = 180.0 // optional, default is 160
        //sideMenu?.bouncingEnabled = false

        // make navigation bar showing over side menu
        view.bringSubviewToFront(navigationBar)

        menuTableViewController.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.height + self.navigationBar.frame.origin.y, 0, 0, 0)
    

    override func viewWillAppear(animated: Bool) 
        super.viewWillAppear(animated)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotated", name: UIDeviceOrientationDidChangeNotification, object: nil)
    

    override func viewWillDisappear(animated: Bool) 
        super.viewWillDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceOrientationDidChangeNotification, object: nil)
    

    func rotated() 
        menuTableViewController.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.height + self.navigationBar.frame.origin.y, 0, 0, 0)
    

    // MARK: - ENSideMenu Delegate
    func sideMenuWillOpen() 
        println("sideMenuWillOpen")
    

    func sideMenuWillClose() 
        println("sideMenuWillClose")
    

    func sideMenuDidClose() 
        println("sideMenuDidClose")
    

    func sideMenuDidOpen() 
        println("sideMenuDidOpen")
    


【讨论】:

感谢您的详细解答!我试过了,但它对它没有任何影响。它是否适用于示例项目? 是的,它在那里工作。请检查您在其他来源中没有任何更改。我刚刚再次下载了该示例并复制粘贴了我的MyNavigationController 实现以检查它是否有效,并且有效:) 非常感谢!!!它终于奏效了!!发生的事情是在viewDidLoad sideMenu = ENSideMenu... for menuViewController 我将其设置为class,而不是menuTableViewControllervariable。非常感谢你!!我一直在努力解决这个问题! 只有 1 个问题:将 self.navigationBar.frame.origin.y 添加到 insets y 位置有什么意义?它不会一直是 0 吗? 纵向时,导航栏不是从屏幕顶部开始,而是从状态栏上方开始。所以基本上你在那里做的是添加状态栏高度+导航栏高度

以上是关于消除单元格和导航栏之间的间隙的主要内容,如果未能解决你的问题,请参考以下文章

隐藏导航栏会导致其下方和上方的空间

为啥我的标志和导航栏之间有巨大的可点击间隙以及如何摆脱它?

结合标签栏控制器和导航控制器

UITableView 没有正确对齐

iPhone Mini 中的导航栏间隙问题

导航菜单不粘,有白色间隙[重复]