iOS 导航条透明(以及自定义颜色)的方法,去掉导航条底部黑线,随着tableView滚动设置导航条变色

#import <UIKit/UIKit.h>

#define NAVBAR_CHANGE_POINT30

@interface UINavigationBar (Awesome)

- (void)lt_setBackgroundColor:(UIColor *)backgroundColor;

- (void)lt_setElementsAlpha:(CGFloat)alpha;

- (void)lt_setTranslationY:(CGFloat)translationY;

- (void)lt_reset;

@end



#import "UINavigationBar+Awesome.h"

#import <objc/runtime.h

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)


@implementation UINavigationBar (Awesome)

staticchar overlayKey;


- (UIView *)overlay

{

    return objc_getAssociatedObject(self, &overlayKey);

}


- (void)setOverlay:(UIView *)overlay

{

    objc_setAssociatedObject(self, &overlayKey, overlay,OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}


- (void)lt_setBackgroundColor:(UIColor *)backgroundColor

{

    if (!self.overlay) {

        [selfsetBackgroundImage:[UIImagenew] forBarMetrics:UIBarMetricsDefault];

        self.overlay = [[UIViewalloc] initWithFrame:CGRectMake(0,0, CGRectGetWidth(self.bounds),CGRectGetHeight(self.bounds) +20)];

        self.overlay.userInteractionEnabled =NO;

        self.overlay.autoresizingMask =UIViewAutoresizingFlexibleWidth;   // Should not set `UIViewAutoresizingFlexibleHeight`

        [[self.subviewsfirstObject] insertSubview:self.overlayatIndex:0];

    }

    self.overlay.backgroundColor = backgroundColor;

}


- (void)lt_setTranslationY:(CGFloat)translationY

{

    self.transform =CGAffineTransformMakeTranslation(0, translationY);

}


- (void)lt_setElementsAlpha:(CGFloat)alpha

{

    [[selfvalueForKey:@"_leftViews"]enumerateObjectsUsingBlock:^(UIView *view,NSUInteger i, BOOL *stop) {

        view.alpha = alpha;

    }];

    

    [[selfvalueForKey:@"_rightViews"]enumerateObjectsUsingBlock:^(UIView *view,NSUInteger i, BOOL *stop) {

        view.alpha = alpha;

    }];

    

    UIView *titleView = [selfvalueForKey:@"_titleView"];

    titleView.alpha = alpha;

//    when viewController first load, the titleView maybe nil

    [[selfsubviews] enumerateObjectsUsingBlock:^(UIView *obj,NSUInteger idx, BOOL *stop) {

        if ([obj isKindOfClass:NSClassFromString(@"UINavigationItemView")]) {

            obj.alpha = alpha;

        }

        if ([obj isKindOfClass:NSClassFromString(@"_UINavigationBarBackIndicatorView")]) {

            obj.alpha = alpha;

        }

    }];

}


- (void)lt_reset

{

    [selfsetBackgroundImage:nilforBarMetrics:UIBarMetricsDefault];

    [self.overlayremoveFromSuperview];

    self.overlay =nil;

}


@end


#pragma mark ————————调用——————————

#import "UINavigationBar+Awesome.h"

@property (nonatomic,strong) UIImageView *navBarHairlineImageView;

- (void)viewDidLoad {

    [superviewDidLoad];

    // 去底部黑线

    _navBarHairlineImageView = [selffindHairlineImageViewUnder:self.navigationController.navigationBar];

}


- (void)viewWillAppear:(BOOL)animated {

    [superviewWillAppear:animated];

    self.navigationController.navigationBar.translucent = YES;

    [self.navigationController.navigationBar lt_setBackgroundColor:[UIColor clearColor]];

    _navBarHairlineImageView.hidden = YES;

    if (_tableView.contentOffset.y > 30) {

        // 导航条加颜色(不再透明)

        [self.navigationController.navigationBar lt_setBackgroundColor:[UIColor blueColor]];

        // 滑动范围下移动至导航条下从64开始(确保分区头视图贴着导航条下边缘显示)

        _tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);

    } else {

        self.navigationController.navigationBar.translucent = YES;

        // 导航条透明

        [self.navigationController.navigationBar lt_setBackgroundColor:[UIColor clearColor]];

        // 滑动范围熊0开始

        _tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);

    }

}


-(void)viewWillDisappear:(BOOL)animated {

    [superviewWillDisappear:animated];

    //导航加颜色

    [self.navigationController.navigationBarlt_setBackgroundColor:[UIColorblueColor]];

    //显示底部黑线

     _navBarHairlineImageView.hidden =NO;

}

// tableView滑动代理方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    // tableView 从屏幕最最顶端显示时,当滑动视图下移动至 y > 30

    if (scrollView.contentOffset.y > 30) {

         [UIViewanimateWithDuration:0.3animations:^{

            // 导航条加颜色(不再透明)

             [self.navigationController.navigationBarlt_setBackgroundColor:[UIColorclearColor]];

            // 滑动范围下移动至导航条下从64开始(确保分区头视图贴着导航条下边缘显示)

             scrollView.contentInset =UIEdgeInsetsMake(64,0, 0,0);

         }];

    } else {

        [UIViewanimateWithDuration:0.3animations:^{

            //导航条透明

          [self.navigationController.navigationBarlt_setBackgroundColor:[UIColorclearColor]];

            //滑动范围熊0开始

            scrollView.contentInset =UIEdgeInsetsMake(0,0, 0,0);

        }];

    }

}


//去掉导航条底部黑线

- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {

    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <=1.0) {

        return (UIImageView *)view;

    }

    for (UIView *subviewin view.subviews) {

        UIImageView *imageView = [selffindHairlineImageViewUnder:subview];

        if (imageView) {

            return imageView;

        }

    }

    return nil;

}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值