iOS11.0設置導航欄self.navigationItem.titleView居中

前言 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之后就不能這么做了,達不到效果,因為導航欄層級發生變化了,具體可以參考:App界面適配iOS11(包括iPhoneX的奇葩尺寸。

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,這邊就懶惰些,不討論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容