前言 self.navigationItem.titleView的位置跟leftBarButtonItem,rightBarButtonItem的大小有關。
leftBarButtonItem,導航條中左側button。
rightBarButtonItem,導航條中右側button。
titleview,不用介紹了吧,就是標題。
titleview的起點位置和尺寸依賴于leftBarButtonItem和rightBarButtonItem的位置,所以需要先設置leftBarButtonItem和rightBarButtonItem的位置。
注意點
假設leftBarButtonItem和rightBarButtonItem之間的空白長度為emptyLength:
則當titleView的長度小于emptyLength,titleView就會居中。所以可以設置titleView到一定長度來達到居中效果。
有時候rightBarButtonItem會很長
rightBarButtonItem很長的時候會把titleView往左邊擠過去,這樣不管你怎么調titleView長度都無法居中。
這種情況可以設置rightBarButtonIte的長度和leftBarButtonItem一樣,rightBarButtonItem里面只是放一個長度和leftBarButtonItem一樣的view1,再把很長的子視圖subView1加入到這個view1中,view1設置clipsToBounds = NO(讓超出父視圖的部分也顯示)
但是如果titleView比較長會把subView1擋住,view1只顯示部分子視圖:
iOS11.0之前
在iOS11.0之前這個問題比較好解決,只要設置視圖的層級,把被擋住的subView1調整到最前面
[self.navigationController.navigationBar bringSubviewToFront:view1];
iOS11.0以后
這時候可以通過
[self.navigationController.navigationBar insertSubview:view1 aboveSubview:_titleView];
來添加右邊的導航欄按鈕了,而不是通過設置self.navigationItem.rightBarButtonItem
。這邊需要調整view1的frame到self.navigationItem.rightBarButtonItem
的位置,這樣就達到我們想要的titleView居中效果,當然這時候計算titleView的最大長度還是結合view1,還是把view1當做self.navigationItem.rightBarButtonItem
來計算處最大emptyLength值。
emptyLength
如果前面直接給定了一個比較小的titleView長度,就不需要這一步計算,titleView已經居中了,如果titleView比較長不固定,就需要計算emptyLength,并且最終設置的titleView的長度要小于emptyLength。
(1)如果只是設置了titleView,沒有設置barbutton,把titleview的寬度設置為屏幕寬度,則titleview距離屏幕的邊距,iOS11之前,在iPhone6p上是20p,在iPhone6p之前是16p;iOS11之后,在iPhone6p上是12p,在iPhone6p之前是8p。
(2)如果只是設置了barbutton,沒有設置titleview,則在iOS11里,barButton距離屏幕的邊距是20p和16p;在iOS11之前,barButton距離屏幕的邊距也是20p和16p。
(3)如果同時設置了titleView和barButton,則在iOS11之前,titleview和barbutton之間的間距是6p,在iOS11上titleview和barbutton之間無間距
居于以上,我這邊按最大值來扣除導航欄左右按鈕的間距emptyLength = self.navigationController.navigationBar.frame.size.width - (20.0 + 12.0 + 16.0 + 左右按鈕的長度)。得出emptyLength,只要設置titleView比emptyLength小即可達到居中效果。
后記
導航欄右邊按鈕可能涉及到點擊范圍問題,這個可以修改hitTest,這邊就懶惰些,不討論。
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。