NavigationBar中添加自定义控件

场景:UIViewController
条件:ViewController(下简称VC)嵌在NavigationController(下简称NC)中(也就是最常见的使用方法)

let 自定义控件 = 自定义控件类()
自定义控件.translatesAutoresizingMaskIntoConstraints = true  //这里用frame比用约束简单得多
自定义控件.frame = CGRect(x: 0, y: 0, width: 100, height: 44)  //height最好不要超过44
navigationItem.titleView = 自定义控件  //navigationBar会自动设置自定义控件的水平和垂直居中

对于这种嵌在NC中的VC,多个VC共用NCNavigationBar(注意,VC自己默认是不带NavigationBar的),在NC执行pushpop操作时,会调用将要显示的VCnavigationItem属性,将其内容填入NavigationBar,这里就是利用这个机制修改NavigationBar的内容的。
titleView就是NavigationBar显示标题的位置,默认值为空。当其为空时,NavigationBar会根据title属性是否存在,在此处添加文字或什么都不添加;当其不为空时,无论title是否存在,NavigationBar都会在此处添加一个自定义控件。
注意不要试图用navigationController?.navigationBar.addSubview(自定义控件)这种方法添加自定义控件,除非你想这个控件一直保留在NavigationBar上,因为这个控件不会随navigationItem改变,除非你调用navigationController?.navigationBar.removeSubview(自定义控件)

20171020更新

升级到iOS11后,titleView的尺寸需要用Auto Layout控制,为titleView加上widthheight约束即可,不需要添加位置约束。需要注意的是,要区分iOS版本,分别设置,即iOS10即以下设置frame,iOS11设置约束。

你可能感兴趣的:(NavigationBar中添加自定义控件)