说下导航栏的透明方法:
 
很多应用需要导航栏随着向上滑动,逐渐从透明变成不透明,很炫酷,大部分应用都在使用导航栏渐变效果,现附上代码然后直接将实现,一会讲下如何来实现,这一部分直接上代码。
 
先附上代码:
 
方法声明:
 
 
#import <UIKit/UIKit.h>

@interface IDSNavBarView : UIView

- (instancetype)initWithFrame:(CGRect)frame titleImg:(UIImage *)aTitleImg;

- (UILabel *)titleLabel;

- (void)animateByOffsetY:(CGFloat)offsety;

/**
 语音房间新增方法,用于外部触发更改左右图片和标题

 @param title 标题内容
 */
- (void)changeButtonImage;

- (void)changeButtonImagelight;

- (void)changeTitleName:(NSString *)title;

@property (nonatomic, strong) NSString *backImageName;

@property (nonatomic, strong) NSString *reportImageName;

@property (nonatomic, strong) NSString *backImageName_light;

@property (nonatomic, strong) NSString *reportImageName_light;

@property (nonatomic, copy) dispatch_block_t onBackActionBlock;

@property (nonatomic, copy) dispatch_block_t onReportBlock;

@property (nonatomic, assign) BOOL enableBackBtn;

@property (nonatomic, assign) BOOL enableReportBtn;

@property (nonatomic, assign) BOOL enableTransparent;

@end

 
 
 
实现:
 
 
#import "IDSNavBarView.h"

@interfaceIDSNavBarView ()

@property (nonatomic, strong) UILabel *titleLabel;

@property (nonatomic, strong) UIImageView *titleImgView;

@property (nonatomic, strong) UIImage *titleImg;

@property (nonatomic, strong) UIButton *backBtn;

@property (nonatomic, strong) UIButton *reportBtn;

@property (nonatomic, strong) UIView *backgroundView;

@property (nonatomic, strong) UIView *maskLine;

@end

@implementation IDSNavBarView

- (instancetype)initWithFrame:(CGRect)frame
{
    return [selfinitWithFrame:frame titleImg:nil];
}

- (instancetype)initWithFrame:(CGRect)frame titleImg:(UIImage *)aTitleImg
{
    self = [superinitWithFrame:frame];
   
    if (self) {
       
        _titleImg = aTitleImg;
       
        [selfsetupViews];
       
        /// 默认不显示
        self.alpha = 1;
    }
   
    returnself;
}

//改变导航栏透明按钮时的显示状态
- (void)changeButtonImage
{
    UIImage *backImg = ImageNamed(@"ic_global_return_light");
    if (!IS_NS_STRING_EMPTY(self.backImageName)) {
        backImg = ImageNamed(self.backImageName);
    }
    [self.backBtn setImage:backImg forState:UIControlStateNormal];
    [self.backBtn setImage:backImg forState:UIControlStateHighlighted];
   
    UIImage *reportImg = ImageNamed(@"ic_navbar_point_light");
    if (!IS_NS_STRING_EMPTY(self.reportImageName)) {
        reportImg = ImageNamed(self.reportImageName);
    }
    [self.reportBtn setImage:reportImg forState:UIControlStateNormal];
    [self.reportBtn setImage:reportImg forState:UIControlStateHighlighted];
}

//改变导航栏透明按钮滑到后期改变时的显示状态(不声明代表不改变按钮状态)
- (void)changeButtonImagelight
{
    UIImage *backImg = ImageNamed(@"ic_global_return");
    if (!IS_NS_STRING_EMPTY(self.backImageName_light)) {
        backImg = ImageNamed(self.backImageName_light);
    }
    [self.backBtnsetImage:backImg forState:UIControlStateNormal];
   
    UIImage *reportImg = ImageNamed(@"ic_navbar_point_dark");
    if (!IS_NS_STRING_EMPTY(self.reportImageName_light)) {
        reportImg = ImageNamed(self.reportImageName_light);
    }
    [self.reportBtn setImage:reportImg forState:UIControlStateNormal];
}

//使用此方法自定义标题label
- (void)changeTitleName:(NSString *)title
{
    if (!IS_NS_STRING_EMPTY(title)) {
        self.titleLabel.alpha = 1;
        self.titleLabel.textColor = NF_Color_C1;
        self.titleLabel.text = title;
    }
    [self bringSubviewToFront:self.titleLabel];
}

//透明位移,按照滚动的位移使导航栏渐渐从透明到非透明状态
- (void)animateByOffsetY:(CGFloat)offsety
{
    CGFloat fitHeight = 156;
    self.alpha = 1;
    self.backgroundView.alpha = offsety/fitHeight;
    self.titleLabel.alpha = offsety/fitHeight;
    self.maskLine.alpha = offsety/fitHeight;
   
   
    if (self.backgroundView.alpha > 0.7) {
        [self changeButtonImagelight];
    }
    else {
        [self changeButtonImage];
    }
}

//导航栏左侧返回按钮按钮
- (void)doBackAction:(id)sender
{
    if (self.onBackActionBlock) {
        self.onBackActionBlock();
    }
}

//导航栏右侧按钮按钮
- (void)doReportAction:(id)sender
{
    if (self.onReportBlock) {
        self.onReportBlock();
    }
}

#pragma mark - Setup Views.

//自定义导航栏设置,若加入_enableTransparent属性,导航栏则显示透明,否则不显示透明状态
- (void)setupViews
{
    self.titleLabel.backgroundColor = [UIColorclearColor];
    self.backgroundColor = [UIColorclearColor];
    self.backgroundView = [[UIViewalloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 64)];
    self.backgroundView.backgroundColor = [UIColorwhiteColor];
    [selfaddSubview:self.backgroundView];
    //self.backgroundColor = NF_Color_C1;
   
    self.clipsToBounds = YES;
   
    if (nil == self.titleImg) {
       
        /// 添加 title.
       
        {
            [self addSubview:self.titleLabel];
            [self.titleLabelmas_makeConstraints:^(MASConstraintMaker *make) {
                make.centerX.mas_equalTo(self.mas_centerX);
                make.left.mas_equalTo(self).offset(50.0f);
                make.right.mas_equalTo(self).offset(-50.0f);
                make.centerY.mas_equalTo(self.mas_centerY).offset(5.0f);
            }];
        }
    }
    else {
       
        /// 设置image
        {
            self.titleImgView.image = self.titleImg;
            [self addSubview:self.titleImgView];
            [self.titleImgViewmas_makeConstraints:^(MASConstraintMaker *make) {
                make.size.mas_equalTo(CGSizeMake(self.width-20, self.height-10));
                make.centerX.mas_equalTo(self.mas_centerX);
                make.centerY.mas_equalTo(self.mas_centerY).mas_offset(6);
            }];
        }
    }
   
    /// 添加分割线.
    {
        _maskLine = [[UIViewalloc] init];
        _maskLine.backgroundColor = NF_Color_C9;
        self.maskLine.alpha = 0;
        [selfaddSubview:_maskLine];
       
        [_maskLinemas_makeConstraints:^(MASConstraintMaker *make) {
            make.size.mas_equalTo(CGSizeMake(self.width, 0.5f));
            make.left.with.right.with.bottom.mas_offset(0.f);
        }];
    }
   
    if(_enableTransparent) {
        self.backgroundView.alpha = 0;
        self.titleLabel.alpha = 0;
        self.maskLine.alpha = 0;
    }
    else {
        self.backgroundView.alpha = 1;
        self.titleLabel.alpha = 1;
        self.maskLine.alpha = 1;
    }
}

//用set方法声明,通过声明 BOOL 变量enableBackBtn 来表明是否需要后退按键
- (void)setEnableBackBtn:(BOOL)enableBackBtn
{
    if (![self.backBtnsuperview]) {
        [self addSubview:self.backBtn];
        [self.backBtnmas_makeConstraints:^(MASConstraintMaker *make) {
            //make.size.mas_equalTo(CGSizeMake(self.backBtn.imageView.image.size.width, self.backBtn.imageView.image.size.height));
            make.size.mas_equalTo(CGSizeMake(50, 50));
            make.left.mas_equalTo(self).mas_offset(0.f);
            make.centerY.mas_equalTo(self.mas_centerY).mas_offset(6.f);
        }];
    }
   
    if (enableBackBtn) {
        self.backBtn.hidden = NO;
    }
    else {
        self.backBtn.hidden = YES;
    }
}

//用set方法声明,通过声明 BOOL 变量透明来表明是否需要后退按键
- (void)setEnableTransparent:(BOOL)enableTransparent
{
    if (enableTransparent) {
        self.backgroundView.alpha = 0;
        self.titleLabel.alpha = 0;
        self.maskLine.alpha = 0;
    }
    else {
        self.backgroundView.alpha = 1;
        self.titleLabel.alpha = 1;
        self.maskLine.alpha = 1;
    }
}

//用set方法声明,是否需要右键
- (void)setEnableReportBtn:(BOOL)enableReportBtn
{
    if (![self.reportBtnsuperview]) {
        [self addSubview:self.reportBtn];
        [self.reportBtnmas_makeConstraints:^(MASConstraintMaker *make) {
            //CGSize imgSize = self.reportBtn.imageView.image.size;
            //make.size.mas_equalTo(CGSizeMake(imgSize.width, imgSize.height));
            make.size.mas_equalTo(CGSizeMake(50, 50));
            make.right.mas_equalTo(self).mas_offset(-0.f);
            make.centerY.mas_equalTo(self.mas_centerY).mas_offset(6.f);
        }];
    }
   
    if (enableReportBtn) {
        self.reportBtn.hidden = NO;
    }
    else {
        self.reportBtn.hidden = YES;
    }
}

#pragma mark - Setter & Getter.

- (UILabel *)titleLabel
{
    if (nil == _titleLabel) {
        _titleLabel = [[UILabelalloc] init];
    }
    _titleLabel.font = [UIFontboldSystemFontOfSize:Near_Final_Font_T7];
    _titleLabel.textAlignment = NSTextAlignmentCenter;
    _titleLabel.numberOfLines = 1;
   
    return_titleLabel;
}

- (UIImageView *)titleImgView
{
    if (nil == _titleImgView) {
        _titleImgView = [[UIImageViewalloc] init];
        _titleImgView.contentMode = UIViewContentModeScaleAspectFit;
    }
   
    return_titleImgView;
}

- (UIButton *)backBtn
{
    if (nil == _backBtn) {
        _backBtn = [UIButtonbuttonWithType:UIButtonTypeCustom];
        UIImage *norImg = ImageNamed(@"ic_global_return_light");
        if (!IS_NS_STRING_EMPTY(self.backImageName)) {
            norImg = ImageNamed(self.backImageName);
        }
        UIImage *highImg = [norImg cl_imageByApplyingAlpha:0.3f];
        [_backBtn setImage:norImg forState:UIControlStateNormal];
        [_backBtn setImage:highImg forState:UIControlStateHighlighted];
        [_backBtn addTarget:selfaction:@selector(doBackAction:) forControlEvents:UIControlEventTouchUpInside];
    }
   
    return_backBtn;
}

- (UIButton *)reportBtn
{
    if (nil == _reportBtn) {
        _reportBtn = [UIButtonbuttonWithType:UIButtonTypeCustom];
        UIImage *norImg = ImageNamed(@"ic_navbar_point_light");
        if (!IS_NS_STRING_EMPTY(self.reportImageName)) {
            norImg = ImageNamed(self.reportImageName);
        }
        UIImage *highImg = [norImg cl_imageByApplyingAlpha:0.3f];
        [_reportBtn setImage:norImg forState:UIControlStateNormal];
        [_reportBtn setImage:highImg forState:UIControlStateHighlighted];
        [_reportBtn addTarget:selfaction:@selector(doReportAction:) forControlEvents:UIControlEventTouchUpInside];
    }
   
    return _reportBtn;

@end

 
引用的文件需要加入以下代码:
 
导航栏自定义声明:
 
 
    CGRect barFrame = CGRectMake(0, 0, SCREEN_WIDTH, 64);
    _barView = [[IDSNavBarViewalloc] initWithFrame:barFrame];
    self.barView.enableBackBtn = YES;
    self.barView.enableTransparent = YES;
    @weakify(self);
    self.barView.onBackActionBlock = ^{
        @strongify(self);
        [self goBack];//返回操作,上个章节有讲解
    };
   
    self.barView.enableReportBtn = YES;
    self.barView.enableReportBtn = NO;

    self.barView.onReportBlock = ^{
        @strongify(self);
        [self moreButtonAction]; //导航栏右侧按钮的点击方法
    };

 
 
 
 
 
在声明周期当中添加代码如下:
 
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:YES animated:NO];
}
 
 
 
在文件的scrollView 中进行导航栏处理,因为要随着滑动,导航栏从透明变成非透明状态
 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // 处理导航栏
    CGFloat distY = scrollView.contentOffset.y;
    [self.barViewanimateByOffsetY:distY];
}
 
 
 
 
 

<iOS 导航栏>第一节:导航栏透明方法实现代码的更多相关文章

  1. OATable中column栏位数据居中的实现方法及代码

    // Table column中显示居中的实现 // QpriceResultTable1 为table的名称 // noPrice 为table中的列 OATableBean table = (OA ...

  2. 【iOS开发-22】navigationBar导航栏,navigationItem建立:获取导航栏中的基本文本和button以及各种跳跃

    (1)navigationBar导航栏可以被看作是self.navigationController一个属性导航控制器,它可以由点直接表示self.navigationController.navig ...

  3. iOS开发笔记1:[转]导航栏里的"Back"按钮显示不出来

    最近项目中遇到一个问题,push过去的ViewController的Nav上面没有返回按钮,遂搜索资料,找到了以下文档.经测试i,问题解决. 原文地址:http://www.cnblogs.com/s ...

  4. iOS开发之 -- 判断tableview/scrollview的滑动方法,及导航栏渐变的实现代码

    开发的过程中,肯定会用到在视图想上滑动的时候,在导航处做一些操作,比如向上滑动的时候,做个动画,出现一个搜索框,或者其他的操作,那么我们怎么来判断它的滑动方向呢? 首先我们应该知道tableview继 ...

  5. 仿酒仙网的一款jQuery侧栏弹出导航栏特效

    仿酒仙网的一款jQuery侧栏弹出导航栏特效 一款常用于商城左侧商品导航的jquery菜单导航特效. 非常不错的一款商品分类特效.大家可以拿去研究研究 . 注意:该特效还支持挨千刀的IE6啊,之强大. ...

  6. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  7. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  8. 【iOS开发-22】navigationBar导航条和navigationItem设置:基本搞定导航条上的文字和按钮以及各种跳转

    http://blog.csdn.net/weisubao/article/details/39646739?utm_source=tuicool&utm_medium=referral (1 ...

  9. iOS仿今日头条滑动导航

    之前写了篇博客网易首页导航封装类.网易首页导航封装类优化,今天在前两个的基础上仿下今日头条. 1.网易首页导航封装类中主要解决了上面导航的ScrollView和下面的页面的ScrollView联动的问 ...

随机推荐

  1. Spring异步方法注解 @Async

    @Async 0. 介绍 在Spring 3.x之后,通过内置@Async标明异步方法,可以简化异步开发流程. @Async既可提供无返回值的调用,也可提供有返回值的调用,下文将分别介绍两种使用方式. ...

  2. An HTTP & HTTP/2 client for Android and Java applications OkHttp

    HTTP is the way modern applications network. It’s how we exchange data & media. Doing HTTP effic ...

  3. 【87.65%】【codeforces 731A】Night at the Museum

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. 【003】【Java虚拟机——对象死亡的判断】

    对象死亡! 垃圾收集器在对堆进行回收前,首先要做的事情就是要确定这些对象之中哪些还"存活"着, 哪些已经"死去" (即不可能再被不论什么途径使用的对象). 1)  引用计 ...

  5. 并行编程OpenMP基础及简单示例

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  6. WPF 3D模型的一个扩展方法

    原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...

  7. ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...

  8. C类型和存储方式的语言变量

    变量的作用域:有效射程变量 >局部变量 1.在函数中的局部变量,量在该函数结束后自己主动撤销 2.函数内的复合语句中的局部变量(比方for语句),这个变量在复合语句结束后自己主动撤销.这个变量能 ...

  9. doker基础

    去 Docker Hub 上拉取一个叫 hello-world 的集装箱docker pull hello-world然后让这个集装箱跑起来docker run hello-world查看本机所安装的 ...

  10. System.Windows.Documents.Run

    希望采用不同的方案来书写文字,可以使用多个TextBlock,也可以使用一个TextBlock+多个Run <TextBlock FontSize="12" Margin=& ...