這篇文章,我主要是想提供另外一種思路蠢壹,來變更一下UINavigationController的顏色嗓违。
我們知道,調用navigationBar的setBarTintColor這個方法是可以實現改變導航欄顏色的知残,但是蘋果大神是如何實現這個效果的呢靠瞎,我們不妨來猜一下。首先我們來看一個正常的導航欄的層級視圖求妹。
再看看我們使用了setBarTintColor這個方法之后的層級視圖
神奇的來了乏盐,居然是在UIBackdropView上再加了2個View,而且是覆蓋在_UIBackdropEffectView上面,而這個_UIBackdropEffectView就是毛玻璃效果那個View,是不是覺得很神奇制恍!我TM當時也震顫了一下父能!現在也沒有想通為什么蘋果要這樣做,希望有大神解釋一下净神。
好了何吝,接來下就說一下我的思考過程,順便也記錄一下我走的彎路鹃唯。
首先爱榕,我的想法絕對不是增加一個View去覆蓋,所以我就想到了改變上面的某個View的背景色坡慌,讓navigationBar看起來像那么回事黔酥。
于是我想到了更改navigationBar的titleView。
通過各種設置洪橘,我達到了預期的效果跪者。
1.自定義一個View
@interface YHCustomTitleView : UIView
@end
@implementation YHCustomTitleView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
}
return self;
}
//解決左右各10個像素左右的空白
- (void)setFrame:(CGRect)frame {
[super setFrame:CGRectMake(0, 0, self.superview.bounds.size.width, self.superview.bounds.size.height)];
}
@end
2.替換titleView
YHCustomTitleView * view = [[YHCustomTitleView alloc] initWithFrame:(CGRectMake(0, 0, SCREEN_WIDTH, 64))];
view.backgroundColor = [UIColor orangeColor];
self.navigationItem.titleView = view;
3.發(fā)現坑了。熄求。渣玲。。弟晚。麻痹忘衍。。卿城。原來的返回按鈕點不動了J缏摹!T逖秘噪!而且當你立刻看當前的層級視圖時,根本找不到問題勉耀。
于是我就pop到這個頁面指煎,查看層級視圖,發(fā)現原來返回按鈕被覆蓋住了
4.如果還要一根筋走下去便斥,剩下的工作就是將這個自定義的titleView作為navigationBar,隱藏掉系統的返回按鈕至壤,自定義按鈕上去了。這樣一來枢纠,問題就更過多了像街,比如左劃無法pop等等。
這個時候,我發(fā)現镰绎,如果我們就改它的_UINavigationBarBackgroud這個View的背景顏色脓斩,不就行了。瀏覽一下navigationBar的.h文件畴栖,發(fā)現并沒有提供這個View,不過沒關系随静,寶寶有runtime大法!我們看看navigationBar到底藏了哪些不愿意我們改的東西吗讶!
到底是不是它燎猛!拿出來看看!
好重绷!事情發(fā)展到這一步,離結束就不遠了膜毁,改掉它的背景色后發(fā)現還有個毛玻璃效果论寨,問題不大!因為我們已經拿到了這個view,而effectView恰恰是_UIBackdropView的子視圖爽茴,另外一個子視圖是UIImageView葬凳,其實就是那條著名的陰影。影藏掉_UIBackdropView就ok了室奏,上代碼火焰。
UIView * tempview = [self.navigationController.navigationBar valueForKey:@"_backgroundView"];
tempview.backgroundColor = [UIColor redColor];
for (UIView * subView in tempview.subviews) {
if (![subView isKindOfClass:[UIImageView class]]) {
subView.hidden = YES;
}
}
目前還沒有發(fā)現這種方法會引起的bug,如果過段時間還沒有發(fā)現胧沫,我就把它搞到項目中昌简,應對產品經理搞得幺蛾子了!