場景:UIViewController
條件:ViewController(下簡稱VC)嵌在NavigationController(下簡稱NC)中(也就是最常見的使用方法)
let 自定義控件 = 自定義控件類()
自定義控件.translatesAutoresizingMaskIntoConstraints = true //這里用frame比用約束簡單得多
自定義控件.frame = CGRect(x: 0, y: 0, width: 100, height: 44) //height最好不要超過44
navigationItem.titleView = 自定義控件 //navigationBar會自動設(shè)置自定義控件的水平和垂直居中
對于這種嵌在NC中的VC,多個VC共用NC的NavigationBar(注意,VC自己默認(rèn)是不帶NavigationBar的),在NC執(zhí)行push或pop操作時,會調(diào)用將要顯示的VC的navigationItem屬性,將其內(nèi)容填入NavigationBar,這里就是利用這個機(jī)制修改NavigationBar的內(nèi)容的。
titleView就是NavigationBar顯示標(biāo)題的位置,默認(rèn)值為空。當(dāng)其為空時,NavigationBar會根據(jù)title屬性是否存在,在此處添加文字或什么都不添加;當(dāng)其不為空時,無論title是否存在,NavigationBar都會在此處添加一個自定義控件。
注意不要試圖用navigationController?.navigationBar.addSubview(自定義控件)這種方法添加自定義控件,除非你想這個控件一直保留在NavigationBar上,因為這個控件不會隨navigationItem改變,除非你調(diào)用navigationController?.navigationBar.removeSubview(自定義控件)。
20171020更新
升級到iOS11后,titleView的尺寸需要用Auto Layout控制,為titleView加上width和height約束即可,不需要添加位置約束。需要注意的是,要區(qū)分iOS版本,分別設(shè)置,即iOS10即以下設(shè)置frame,iOS11設(shè)置約束。