场景: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共用NC的NavigationBar(注意,VC自己默认是不带NavigationBar的),在NC执行push或pop操作时,会调用将要显示的VC的navigationItem属性,将其内容填入NavigationBar,这里就是利用这个机制修改NavigationBar的内容的。
titleView就是NavigationBar显示标题的位置,默认值为空。当其为空时,NavigationBar会根据title属性是否存在,在此处添加文字或什么都不添加;当其不为空时,无论title是否存在,NavigationBar都会在此处添加一个自定义控件。
注意不要试图用navigationController?.navigationBar.addSubview(自定义控件)
这种方法添加自定义控件,除非你想这个控件一直保留在NavigationBar上,因为这个控件不会随navigationItem改变,除非你调用navigationController?.navigationBar.removeSubview(自定义控件)
。
20171020更新
升级到iOS11后,titleView的尺寸需要用Auto Layout控制,为titleView加上width和height约束即可,不需要添加位置约束。需要注意的是,要区分iOS版本,分别设置,即iOS10即以下设置frame,iOS11设置约束。
网友评论