消除单元格和导航栏之间的间隙
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
,而不是menuTableViewController
的variable
。非常感谢你!!我一直在努力解决这个问题!
只有 1 个问题:将 self.navigationBar.frame.origin.y
添加到 insets y 位置有什么意义?它不会一直是 0 吗?
纵向时,导航栏不是从屏幕顶部开始,而是从状态栏上方开始。所以基本上你在那里做的是添加状态栏高度+导航栏高度以上是关于消除单元格和导航栏之间的间隙的主要内容,如果未能解决你的问题,请参考以下文章