美文网首页ios开发布局
Swift自定义导航栏的问题

Swift自定义导航栏的问题

作者: Breezes | 来源:发表于2017-11-01 11:12 被阅读2038次

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

    相关文章

      网友评论

        本文标题:Swift自定义导航栏的问题

        本文链接:https://www.haomeiwen.com/subject/jrywpxtx.html