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

Remove gap between cell and navbar

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

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

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

所以我用navbar的高度替换了64的高度:

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 中的代码出现以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

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

self.automaticallyAdjustsScrollViewInsets = true

那什么也没做。

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

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

最后,你需要在旋转后应用table侧视图的contentInset,所以你需要观察UIDeviceOrientationDidChangeNotification通知。

这就是 MyNavigationController class 应该如何工作:

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")
    }

}