删除单元格和导航栏之间的间隙
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")
}
}
我在我的应用程序中实现了 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")
}
}