有时候APP为追求一种视觉效果上的通透性,除返回按钮,会将导航条透明化,如图所示:
我现在用到的办法,将导航条的背景图设置一张透明的图,然后去掉导航条下方黑线的方法是从网上找的
// 是否改为透明
@property (assign, nonatomic) BOOL changeTransparency;
// 向上滚动的距离
@property (nonatomic, assign) CGFloat distance;
// 导航条透明度
@property (nonatomic, assign) double navAlpha;
- (void)viewDidLoad {
[super viewDidLoad];
navBarHairlineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
if (!(self.navAlpha == 0)) { //进入其他页面前,透明度不为0,再回来需要判断,要不然导航条透明度与之前不一致
// 导航条显示“关于某某”
self.titleLabel.text = [@"关于" stringByAppendingString:self.userName];
// 去掉导航栏透明化后 导航栏底部显现的黑线
- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
return (UIImageView *)view;
}
for (UIView *subview in view.subviews) {
UIImageView *imageView = [self findHairlineImageViewUnder:subview];
if (imageView) {
return imageView;
}
}
return nil;
}
self.navigationController.navigationBar.alpha = self.navAlpha;
} else {
self.titleLabel.text = @"";
}
if (self.distance <= 0) {// 导航栏为透明状态时,进入其他页面再返回,若不做处理,返回按钮会消失
navBarHairlineImageView.hidden = YES;
self.changeTransparency = YES;
[self changeNavigationBarTransparencyWithDefaultValue:self.changeTransparency];
} else {
self.titleLabel.text = [@"关于" stringByAppendingString:self.userName];
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// 不论该页面的导航条透明度是多少,离开此页面一律为1,不可影响其他页面
self.navigationController.navigationBar.alpha = 1;
[self changeNavigationBarTransparencyWithDefaultValue:self.changeTransparency];
}
- (void)changeNavigationBarTransparencyWithDefaultValue:(BOOL)defaultValue{
if (self.changeTransparency) {
UIImage *image = [LTUtils LTImageNamed:@"bk_clear"];
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsCompact];
self.changeTransparency = NO;
}else {
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsCompact];
}
}
至于随着屏幕上划渐渐变非透明,利用offsetY就好
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offsetY = self.sendTopicsTableView.contentOffset.y;
self.distance = offsetY - personHeader_height;
if (self.distance >= 0) {
self.titleLabel.text = [@"关于" stringByAppendingString:self.userName];
self.titleLabel.font = navItem_Font;
[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsCompact];
self.navAlpha = self.distance / 64.0;
self.navigationController.navigationBar.alpha = self.distance <= 64 ? self.navAlpha : 1;
} else {
self.titleLabel.text = @"";
UIImage *image = [LTUtils LTImageNamed:@"bk_clear"];
self.navigationController.navigationBar.alpha = 1;
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsCompact];
self.changeTransparency = NO;
}
}
还有些问题总结,基本都写在代码片上了,有必要时再总结。
至此,小马述一家之言。