导航条变透明,并随着屏幕上划渐渐变非透明

有时候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;
    }
}
还有些问题总结,基本都写在代码片上了,有必要时再总结。

至此,小马述一家之言。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值