吐槽
當iPhoneX
出來之后稠茂,隱藏導航欄柠偶,用自定義視圖替代的方式越來越麻煩情妖。不過,蘋果的導航欄操作實在太麻煩诱担。所以將用到過的內(nèi)容記錄一下毡证,作為備忘錄。
設置位置
一般來說蔫仙,導航欄的設置我們習慣在viewDidLoad
中做料睛,本來是沒有問題的,可是在iOS11
之后摇邦,有些設置就會不起作用恤煞。將導航欄設置代碼移動到viewWillAppear
中,就能起效果施籍。特別是導航欄的半透明效果self.navigationController.navigationBar.translucent = NO;
居扒,已經(jīng)有人發(fā)現(xiàn)這個問題了:
iOS新版本導航欄透明度設置發(fā)現(xiàn)的問題
設置方式
分為全局方式和單獨方式兩種,以設置背景圖片為例:
- 全局方式:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"圖片名字"] forBarPosition:UIBarPositionTop barMetrics:UIBarMetricsDefault];
- 單獨方式:
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"圖片名字"] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
推薦的方式:單獨方式法梯,也就是以
self.navigationController.navigationBar
為消息發(fā)送對象的方法。注意的問題:全局方式有可能不成功犀概。比如有三個tab的頁面立哑,用全局的方式設置。啟動的時候姻灶,第一個tab頁铛绰,一般是首頁,設置不成功产喉。切換到另外兩個捂掰,都是設置成功的。現(xiàn)在又切回首頁曾沈,也設置成功了这嚣,很奇怪的現(xiàn)象。
如果兩種方式一起設置塞俱,那么全局的設置很可能被覆蓋姐帚,下面的“去掉半透明效果”一節(jié)進行了這樣的對比。
結論: 用self.navigationController.navigationBar
的方式設置導航欄障涯,如果是公共部分罐旗,可以放在基類中實現(xiàn)復用。
去灰線
導航欄下面的灰色分隔線唯蝶,高度為0.5
九秀,也就是通常說的1像素線。大多數(shù)情況下粘我,這根灰線是需要的鼓蜒。不過,有些時候,需要去掉友酱。比如晴音,那種全面屏設計,導航欄和緊挨著的第一個視圖背景色一樣缔杉,這個時候多一根灰線就很難看了锤躁。
怎么去掉呢?有方法是查詢高度為0.5
的視圖或详,然后隱藏系羞。這種方法能起效果,不過總感覺不優(yōu)雅霸琴。下面這篇文章椒振,采用設置導航欄的陰影視圖為空的方法,感覺挺不錯的:
IOS 去掉導航欄(UINavigationBar)下方的橫線
這個不需要全局做梧乘,在有需要的UIViewController
中做就可以了:
// 去掉導航欄下面的黑線
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
去掉半透明效果
默認是半透明效果的
可以在故事版上修改澎迎,如圖:
把勾打掉就可以了
- 也可以在基類中用代碼修改:
self.navigationController.navigationBar.translucent = NO;
注意要加在
viewWillAppear
中,放在viewDidLoad
中可能不起作用选调。
不去掉的話夹供,布局會偏移;
不去掉的話仁堪,顏色會被自動修改掉哮洽,像下面這樣:
- 全局設置的版本,不要采用弦聂。既然放在基類中了鸟辅,相當于全局的。當然效果也是有的莺葫。
[UINavigationBar appearance].translucent = NO;
不過匪凉,要注意的是,像下面這樣設置捺檬,全局的效果會被覆蓋掉洒缀。像下面這樣設置,半透明效果還在欺冀,全局設置沒有起作用树绩。
self.navigationController.navigationBar.translucent = YES;
[UINavigationBar appearance].translucent = NO;
當然,把上面兩句話放在
viewDidLoad
中又有效果了隐轩,因為此時self.navigationController.navigationBar.translucent = YES;
被覆蓋了饺饭,這樣很混亂,不如固定用一種方式职车。
設置導航欄標題的顏色和字體
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor redColor],NSFontAttributeName:[UIFont systemFontOfSize:19.0]}];
非常不方便瘫俊,放在基類中統(tǒng)一設置一下鹊杖,一般
UI
也是希望統(tǒng)一的。
設置導航欄背景顏色
// 設置導航欄背景顏色
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
直接叫
backgroundColor
多方便扛芽,非要搞出個barTintColor
骂蓖,不知道是哪個腦殘想出來的。
設置返回按鈕旁邊的文字川尖。
默認是上一個頁面的標題登下,感覺不是很好。統(tǒng)一給一個@“返回”叮喳,或者干脆給一個@“”被芳。
// 設置返回按鈕旁邊的文字
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:(UIBarButtonItemStylePlain) target:nil action:nil];
設置左右按鈕文字顏色
// 設置導航欄左右按鈕文字的顏色
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
這個名字取的也很差,
tintColor
馍悟,什么鬼畔濒?蘋果的腦殘可真多。
自動隱藏TabBar
TabBar
只需要在第一級出現(xiàn)就可以了锣咒,內(nèi)部的頁面侵状,一般都應該隱藏掉。
默認是不隱藏的毅整,所以
TabBar
一直在趣兄,對于二三級頁面,減小了空間毛嫉,也帶來隨意切換的邏輯混亂诽俯。可以通過故事版切換妇菱,如圖:
- 通過代碼設置承粤,可以在基類中統(tǒng)一設置,關鍵是判斷是不是
rootViewController
闯团。下面的方法是判斷是不是導航欄的第一個UIViewController
// push時自動隱藏TabBar辛臊;不能是第一個;
if ([self.navigationController.viewControllers indexOfObject:self] != 0) {
self.hidesBottomBarWhenPushed = YES;
}
WRNavigationBar
這個第三方庫有2K
多的star
房交,有時間可以關注一下彻舰,能用就用起來。