ios开发布局

Swift自定义导航栏的问题

2017-11-01  本文已影响2038人  Breezes

最近在看刀哥讲用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

D70702D5-6F81-44D0-B290-A552A9E35C4E.png 9DCDBD50-519E-4882-8CAF-A4BA82394E0B.png

找到了病根问题就好解决了,只要重新设置下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))
上一篇下一篇

猜你喜欢

热点阅读