為了保持UI風格的一致,有時可能需要在非UINavigationController的子控制器中添加導航欄,如下圖硫嘶。
系統(tǒng)的導航欄會使狀態(tài)欄的顏色與之一致,而手動添加的導航欄則不會梧税。雖然可以通過更改視圖的背景顏色實現(xiàn)一致,但這太山寨了,既然如此第队,我為什么不直接拖兩個button和一個label做個假的navigation bar呢哮塞?
仔細觀察,不難發(fā)現(xiàn)UINavigationBar和UISearchBar的delegate都遵循一個名為
UIBarPositioningDelegate
的協(xié)議凳谦,這個協(xié)議只有一個方法忆畅,如下。
public protocol UIBarPositioningDelegate : NSObjectProtocol {
/* Implement this method on your manual bar delegate when not managed by a UIKit controller.
UINavigationBar and UISearchBar default to UIBarPositionTop, UIToolbar defaults to UIBarPositionBottom.
This message will be sent when the bar moves to a window.
*/
@available(iOS 7.0, *)
optional public func position(for bar: UIBarPositioning) -> UIBarPosition // UINavigationBarDelegate, UIToolbarDelegate, and UISearchBarDelegate all extend from this
}
我們只要給我們的導航欄或者搜索欄設(shè)置代理尸执,并在代理中實現(xiàn)這個方法就可以讓狀態(tài)欄的顏色與它們一致了家凯。
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
如下圖。
如果設(shè)置以后沒有達到預期的效果如失,請檢查:
1.是否希望使狀態(tài)欄和導航欄的backgroundColor
顏色一致绊诲。決定狀態(tài)欄顏色的是導航欄的barTintColor
屬性。
2.導航欄的isTranslucent
屬性是否為true
褪贵,如果是掂之,你怎么設(shè)置barTintColor也不會改變導航欄或狀態(tài)欄的顏色。
3.是否在storyboard中設(shè)置導航欄的顏色脆丁。如果你發(fā)現(xiàn)在storyboard中設(shè)置導航欄的顏色無效世舰,很可能是你曾經(jīng)修改過UINavigationBar.appearance
,只要在代碼適當位置(如viewDidLoad
中)直接設(shè)置導航欄的相關(guān)屬性即可槽卫。
搜索欄同理跟压。