需要在導(dǎo)航欄做高斯模糊效果,想把navigationBar設(shè)置透明,然后在navigationBar后面加個(gè)UIVisualEffectView,而不用改動(dòng)title和左右button及其他VC里面的布局, 結(jié)果發(fā)現(xiàn)navigationBar總有一層白色的View, 看了下層級(jí)發(fā)現(xiàn)是個(gè)_UIBarBackground類的View,設(shè)置backgroundColor也不頂用. 于是將其取出來(lái)隱藏了.
整理了下要將導(dǎo)航欄設(shè)置透明的兩種情況:
界面從(0,0)開(kāi)始布局, [navigationBar setTranslucent:YES];
將navigationBar里的顏色及子view的顏色設(shè)置為透明即可,
1. setBackgroundColor:UIColor.clearColor
2. setBarTintColor:UIColor.clearColor
3. setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]
4. setShadowImage:[UIImage new] size:CGSizeMake(SCREEN_WIDTH, 0.01f)]-
界面從(0,44)開(kāi)始布局 [navigationBar setTranslucent:NO];
只進(jìn)行上述操作不夠, 因?yàn)橄到y(tǒng)會(huì)加一個(gè)frame為(0,0,SCREEN_WIDTH,44)
的白色View作為遮擋, 而且在iOS 10版本與iOS 10之前的版本兩種情況下,這個(gè)view的類還不一樣.
iOS 10 :_UIBarBackground
iOS 10之前: _UINavigationBarBackground
把這個(gè)類的view設(shè)置hidden即可實(shí)現(xiàn)從(0,44)開(kāi)始布局且導(dǎo)航欄全透明.
代碼:[self.navigationBar.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:NSClassFromString(@"_UIBarBackground")]||[obj isKindOfClass:NSClassFromString(@"_UINavigationBarBackground")]) { obj.hidden = YES; } }];