最近在看刀哥讲用Swift写微博,其中要实现隐藏系统的导航栏然后自定义导航栏,然后就发现了如下图的问题(Swift4.0,ios11):
94F3CD7D-A167-4363-846B-CD3A634F514D.png代码如下:
// 先在导航控制器中隐藏默认的 NavigationBar
navigationBar.isHidden = true
class WBBaseViewController: UIViewController {
/// 自定义导航条
lazy var navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.cz_screenWidth(), height: 64))
/// 自定义的导航条目 - 以后设置导航栏内容,统一使用 navItem
lazy var navItem = UINavigationItem()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
view.backgroundColor = UIColor.green
}
/// 重写 title 的 didSet
override var title: String? {
didSet {
navItem.title = title
}
}
/// 设置界面
func setupUI() {
view.backgroundColor = UIColor.cz_random()
navigationBar.clipsToBounds = true
// 添加导航条
view.addSubview(navigationBar)
// 将 item 设置给 bar
navigationBar.items = [navItem]
}
}
后来确认了一下是ios11的问题,ios11以下就没问题,下图是ios10上:
F56E3C70-AC0A-41B4-BCA1-6B554B15B356.png因为ios11下的navigationBar上的UINavigationBarContentView的y上移到了0的位置看下图就明白了
https://stackoverflow.com/questions/45711765/how-to-correctly-set-uinavigationbar-height-in-ios-11
找到了病根问题就好解决了,只要重新设置下UINavigationBarContentView的位置就可以了,先继承一个UINavigationBar重写layoutSubviews,直接上代码:
class SecondNavigationBar: UINavigationBar {
override func layoutSubviews() {
super.layoutSubviews()
for subview in self.subviews {
let stringFromClass = NSStringFromClass(subview.classForCoder)
print("--------- \(stringFromClass)")
if stringFromClass.contains("BarBackground") {
subview.frame = self.bounds
} else if stringFromClass.contains("UINavigationBarContentView") {
subview.frame = CGRect(x: 0, y: 20, width: UIScreen.cz_screenWidth(), height: 44)
}
}
}
}
UIScreen.cz_screenWidth():是屏幕的宽度
然后把上面的
/// 自定义导航条
lazy var navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.cz_screenWidth(), height: 64))
替换成
/// 自定义导航条
lazy var navigationBar = SecondNavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.cz_screenWidth(), height: 64))
网友评论