場景: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自己默認是不帶NavigationBar的)模她,在NC執(zhí)行push或pop操作時,會調(diào)用將要顯示的VC的navigationItem屬性诽偷,將其內(nèi)容填入NavigationBar,這里就是利用這個機制修改NavigationBar的內(nèi)容的疯坤。
titleView就是NavigationBar顯示標(biāo)題的位置报慕,默認值為空。當(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è)置約束。