最近項目中遇到了要自定義導(dǎo)航欄的需求磕瓷,也不是那么復(fù)雜哮兰,但之前做這塊的時候總是一直一知半解褪猛,以至于這次實現(xiàn)自定義導(dǎo)航欄的時候差點(diǎn)撲街邑彪。接下來具體談?wù)勗趺磦€實現(xiàn)。
業(yè)務(wù)邏輯是:界面A. push-> 界面B. ?其中啤贩,界面A導(dǎo)航欄全透明求类;界面B導(dǎo)航欄半透明(在滑動界面B中tableView的時候有類似毛玻璃的效果)矫膨。
之前一直都是從 全透明界面A 到 不透明界面B狱杰。這個好處理瘦材,在界面A中設(shè)置
self.navigationController.navigationBar.translucent = YES;?
self.navigationController.navigationBar.barTintColor = [UIColor clearColor];
(其實我重寫了NavigationController)
然后在界面B控制器的viewWillAppear中設(shè)置的translucent屬性為NO,同時將barTintColor和backgroundColor改為對應(yīng)的顏色 (我的是whiteColor) 就好了仿畸。
同時需要注意的是食棕,界面B中controller的automaticallyAdjustsScrollViewInsets屬性設(shè)置為NO朗和,以避免tableView或CollectionView的frame受導(dǎo)航欄變化的影響。
這次呢簿晓,我試了好多方法眶拉,都不能達(dá)到半透明的效果,即使變成了半透明憔儿,CollectionView的frame也總是有問題忆植。在要放棄的時候,我換了個角度去想谒臼。結(jié)果成了朝刊!
navigationBar.translucent 是改變導(dǎo)航欄是不是半透明的效果。如果要半透明屋休,則YES。
navigationBar.barTintColor 是改變導(dǎo)航欄的顏色备韧。我選的白色
navigationBar.alpha 是改變導(dǎo)航欄的透明度 通過設(shè)置這個劫樟,導(dǎo)航欄的透明度才能改變。
(之前我只是將barTintColor的顏色改為了clearColor织堂,結(jié)果可想而知叠艳,一團(tuán)漆黑。因為它只改變了顏色的透明度易阳,并沒有改變navigationBar的透明度附较。)
在添加了navigationBar.backgroundColor的顏色后,然而卻是這個樣子的:
可以看到navigationBar的statusBar顏色并沒有改變潦俺。尤其在push到這個頁面的時候拒课,statusBar的缺失非常明顯。
其實事示,我們不應(yīng)該再設(shè)置navigationBar的backgroundColor早像。而是應(yīng)該設(shè)置backgroundImage來替換。
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forBarMetrics:UIBarMetricsDefault];
它會將整個navigationBar覆蓋為你想要的顏色肖爵。
如圖所示:
同時卢鹦,你的navigationBar也將具有半透明的效果。
在設(shè)置了 self.automaticallyAdjustsScrollViewInsets = NO; ?之后
也需要將對應(yīng)的tableView和collectionView的contentInset高度加上導(dǎo)航欄的高度64.f
這樣就大功告成了劝堪!
以下是參考代碼:
界面A.m
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationBar.translucent = YES;? // 半透明效果
self.navigationBar.barTintColor = [UIColor clearColor];
[self.navigationBar setBackgroundImage:ImageNamed(@"透明bg") forBarMetrics:UIBarMetricsDefault];
// 導(dǎo)航欄標(biāo)題顏色
NSDictionary *titleAttribute = [NSDictionary dictionaryWithObjectsAndKeys:DefaultFontColor,NSForegroundColorAttributeName, nil];
[[UINavigationBar appearance] setTitleTextAttributes:titleAttribute];
// 去底部黑線
[self.navigationBar setShadowImage:[UIImage new]];
[self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
}
界面B.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationController.navigationBar.barTintColor = [UIColor whiteColor];
self.navigationController.navigationBar.alpha = 0.97f;
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forBarMetrics:UIBarMetricsDefault];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
self.navigationController.navigationBar.barTintColor = COLOR_CLEAR;
self.navigationController.navigationBar.alpha = 0.f;
[self.navigationController.navigationBar setBackgroundImage:ImageNamed(@"透明bg") forBarMetrics:UIBarMetricsDefault];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.automaticallyAdjustsScrollViewInsets = NO;
self.collectionView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
}
參考鏈接:
NavigationBar設(shè)置對UICollectionView的content顯示偏移影響
iOS 關(guān)于navigationBar的一些:毛玻璃冀自、透明、動態(tài)縮放秒啦、動態(tài)隱藏
如果有錯的話熬粗,希望大家盡快提出,一起交流哈余境!