上代码,看实现:
/**
navigation全透明实现方法
@param currentNav 当前全透明的NavigationController
*/
+ (void)transparentFullyWith:(UINavigationController *)currentNav{
UIView *barBack = currentNav.navigationBar.subviews[0];
[barBack setAlpha:0];
UIView *line = [barBack valueForKeyPath:@"_shadowView"];
[line setHidden:YES];
if (@available(iOS 11.0,*)) {
[barBack.subviews setValue:@(0) forKeyPath:@"alpha"];
}
//设置标题字体颜色为白色
[currentNav.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
}
需要注意的是,因为navigationController是共用的,在当前页面消失的时候,需要重新将navigation的属性进行复位处理,这样才能在其他页面保持正常,避免出现没有底部线条的情况。
+ (void)transparentRecoverWith:(UINavigationController *)currentNav{
UIView *barBack = currentNav.navigationBar.subviews[0];
[barBack setAlpha:1.0];
UIView *line = [barBack valueForKeyPath:@"_shadowView"];
[line setHidden:NO];
if (@available(iOS 11.0,*)) {
[barBack.subviews setValue:@(1) forKeyPath:@"alpha"];
}
[currentNav.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor blackColor]}];
}
授人以鱼不如授人以渔!总结这个方法的核心在于对 keyPath的使用,可以用这样的方法访问并且操作很多苹果没有暴露出来的对象和属性。
例如,barBack是这样的样子: