来源:HelloYeah

链接:http://www.jianshu.com/p/b8b70afeda81

下面这个界面有没有觉得很眼熟。打开你手里的App仔细观察,你会发现很多都有实现这个功能。比如美团外卖的首页模块,新浪微博的个人详情页面。要怎么样才能快速的实现这个功能呢!那下面由笔者来告诉你如何三行代码,集成这个功能。。。

原理介绍:

要想把一个view设计成透明的我们一下子就会想到两种方案,设置view的alpha值为0,或者设置view的backgroundColor为clearColor.但是UINavigationBar是一个比较特殊的视图,它是没有alpha属性的,那我们可以设置opaque(不透明度)为NO,上代码试一试

//方案一:不透明度为NO

navigationBar.opaque = NO;

//方案二:背景颜色为clearColor

navigationBar.backgroudcolor = [UIColor clearColor];

结果,然并卵,完全没用。这时候该怎么办呢?这时候我们就得来看看UINavigationBar这个视图的结构了,如下图。

NavgationBar.png

现在笔者教大家一个小技巧。请看下面代码:

//设置一张空的图片

[self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];

//清除边框,设置一张空的图片

[self.navigationController.navigationBar setShadowImage:[[UIImage alloc]init]];

这时候再打开项目层次图,你会有惊人的发现

对比一下,你会发现只剩两层了。不要问为什么,这都是系统帮你做的。。。当你设置了背景图片的时候,就会出现这样的结果。

知道了上述的原理,这就好办了,现在只要监听,控制器内部的scrollView 的滚动,就可以实现导航条渐渐透明的效果了。

  • 业务逻辑,功能实现其实都不是很难。但是也需要花费一些时间,笔者在这给大家分享一下自己写的一个分类。导入这个分类,你只需要调用两三个接口就可以实现这个功能了。

    首先看一下分类提供的接口

Snip20160326_2.png

分类介绍

  • 我写的这个分类不仅可以在系统的UITableViewController 和UICollectionViewController中使用,(系统的只需调用分类中两个方法即可)。而且当你的UIViewController中有1个或多个可以垂直滚动的scrollView都可以使用。(需要告诉控制器需要监听哪个scrollView的滚动,即设置keyScrollView).

  • 重要的是,这个分类的代码侵入性非常低,使用简单方便。当不需要这些功能的时候,你只需要注释掉几行代码即可。对原控制器没有任何影响,无需更改控制器内的其他代码结构。

分类代码

分类接口

#import <UIKit/UIKit.h>

typedef struct {

BOOL isLeftAlpha;

BOOL isTitleAlpha;

BOOL isRightAlpha;

}HYBarItemAlphaControl;

@interface UIViewController (NavBarHidden)

/** 当你的控制器里有多个scrollView的时候,设置需要监听的keyScrollView */

@property (nonatomic,weak) UIScrollView * keyScrollView;

/** 设置导航条上的标签是否需要跟着隐藏  */

- (void)setBarItemAlphaControl:(HYBarItemAlphaControl)isBarItemAlphaControl;

/**

*      在控制器ViewWillAppear.ViewWillDisappear需要调用的接口

*      避免push到下一个控制器,消除对其他控制器导航条的影响

*/

- (void)setInViewWillAppear;

- (void)setInViewWillDisappear;

/** rate将决定颜色变化程度,值越大,颜色变化越明显,rate的取值范围是0.01 - 0.999999 */

- (void)scrollControlRate:(CGFloat)height colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue ;

@end


下面这个效果图是系统的UITableViewController,以下是效果图和代码

2.gif

控制器代码:

#import "TestViewController.h"

#import "UIViewController+NavBarHidden.h"

@implementation TestViewController

- (void)viewDidLoad{

[super viewDidLoad];

//设置当有导航栏自动添加64的高度的属性为NO

self.automaticallyAdjustsScrollViewInsets = NO;

//设置tableView的头部视图

UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 0, 250)];

imageView.image = [UIImage imageNamed:@"1.jpg"];

self.tableView.tableHeaderView = imageView;

}

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

[self scrollControlRate:0.5 colorWithRed:0.0 green:1.0 blue:0.0 ];

}

- (void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

[self setInViewWillAppear];

}

- (void)viewWillDisappear:(BOOL)animated{

[super viewWillDisappear:animated];

[self setInViewWillDisappear];

}

@end


下面这个效果图是一个ViewController中含有自己创建的一个CollectionView.

1.gif

控制器代码

@implementation TestCollectionController

-(void)viewDidLoad{

[super viewDidLoad];

//1.设置当有导航栏自动添加64的高度的属性为NO

self.automaticallyAdjustsScrollViewInsets = NO;

//2.设置导航条内容

[self setUpNavBar];

//3.导航条上的自定义的子标签是否需要跟着隐藏,只对自定义的view有效果.对系统默认的无效

[self  setBarItemAlphaControl:(HYBarItemAlphaControl){0,1,1}];

//4.设置collectionView

[self setUpCollectionView];

//5.告诉程序是根据哪个scrollView的滚动来控制状态栏的变化

self.keyScrollView = self.collectionView;

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

}

#warning 监听滚动,调用框架接口

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

//rate将决定颜色变化程度,值越大,颜色变化越明显,rate的取值范围是0.01 - 0.999999

[self scrollControlRate:0.5 colorWithRed:1.0 green:0.0 blue:0.0 ];

}

- (void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

[self setInViewWillAppear];

}

- (void)viewWillDisappear:(BOOL)animated{

[super viewWillDisappear:animated];

[self setInViewWillDisappear];

}

项目源码分享,希望大家喜欢,下载的时候顺便star一下,好人多福。https://github.com/newyeliang/HYNavBarHidden.git

iOS导航条渐变透明的更多相关文章

  1. iOS 导航栏 不透明

    UINavigationBar.appearance().translucent = false UINavigationBar.appearance().barStyle = UIBarStyle. ...

  2. iOS 导航条的影响

    如果是push出来的控制器,self.view的(0,0)点从状态栏下面开始: 如果有present出来的控制器,self.view的(0,0)点包含状态栏:

  3. iOS:导航条滚动透明度随着tableView的滚动而变化

    来源:HelloYeah 链接:http://www.jianshu.com/p/b8b70afeda81 下面这个界面有没有觉得很眼熟.打开你手里的App仔细观察,你会发现很多都有实现这个功能.比如 ...

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

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

  5. ios 修改导航条返回按钮

    ios 修改导航条返回按钮 方式一:使用系统的:可以更改系统的文字:以及通过设置导航条的颜色来达到预期的效果 UIBarButtonItem *backBtns = [[UIBarButtonItem ...

  6. iOS改变UINavigationBar导航条标题颜色和字体

    转自:http://www.2cto.com/kf/201311/260409.html iOS 5 以后 UINavigationController 可以 改变UINavigationBar导航条 ...

  7. iOS 状态栏和导航条配置

    iOS 状态栏和导航条配置 一:隐藏: [self.navigationController setNavigationBarHidden:YES animated:YES]; [[UIApplica ...

  8. iOS下简单实现滑动导航条

    功能介绍 最近在做一款ios的app,其中有一个页面需要分成三个版块,版块之间可以通过左右滑动来进行切换,也可以通过点击上方的按钮来切换,好像在android中可以用过ViewPager + Frag ...

  9. IOS 滑动指示导航栏 渐变

    关于导航栏渐变,本人在写APP的时候,发现了各路大神各现其通,其实我觉得这个是个很简单的问题,不需要搞得那么麻烦,对个项目要求整齐来说,一般会建一个工具类,自定义View,各个同事需要的时候,直接调用 ...

随机推荐

  1. 2768: [JLOI2010]冠军调查( 最小割 )

    最小割... 怎么乱搞都可以 -------------------------------------------------------------------------------- #inc ...

  2. centos 挂载windows共享目录

    su (获取root权限) yum install samba 安装samba (其实我们只用到samba里面的winbind以便我们能够用windows机器的名称找到该机器的网络地址,在下面叙述的过 ...

  3. Vim键盘布局

     Vim键盘布局 用Linux的朋友一定会使用到Vim这个文本编辑器,它是由Vi发展而来的编辑器,其具有代码补齐.编译.错误跳转等丰富的功能,非常适合编程.对于修改Linux配置文件它更是你不二的选择 ...

  4. Java Web 入门(一)使用 Intellij IDEA 14.1.5 创建 Maven Web项目

    1.基础配置 1.1 安装 JDK1.7,配置系统变量:JAVA_HOME 和 Path 1.2 安装 Tomcat 7.0 1.3 安装  Intellij IDEA 14.1.5 1.4 Mave ...

  5. 怪兽z主机标准版视频测试。

    我的淘宝店很早就开张了,但是一直没有好好打理,这次给大家带来的是本店所售一款主机的视频测试. CPU:AMD -A10 6700 主板:映泰Hi-Fi A88S3E 内存条:正品金士顿骇客游戏神条 机 ...

  6. A Brief Introduction to Multiset[STL]

    基础 multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存 ...

  7. python开发_大小写转换,首字母大写,去除特殊字符

    这篇blog主要是总结我们在平常开发过程中对字符串的一些操作: #字母大小写转换 #首字母转大写 #去除字符串中特殊字符(如:'_','.',',',';'),然后再把去除后的字符串连接起来 #去除' ...

  8. Android 4.4及以上系统下应用的状态栏颜色渐变效果的实现

    上一篇转载的博文里讲到了怎么开启状态栏透明的效果,不过如果在有ActionBar的情况下,会出现状态栏透明而ActionBar横亘在状态栏和内容之间的丑陋情况,如下图: 通过百度之后,发现了GitHu ...

  9. hadoop权威指南 chapter1 Meet Hadoop

    Meet Hadoop 1.1 Data!(数据) Most of the data is locked up in the largest web properties (like search e ...

  10. openstack安装配置

    openstack:1.控制节点安装所有,计算节点只有nova-compute:2.网络选择: nova-network还是neutron: nova-network比较简单, neutron功能强大 ...