iOS 动态修改导航栏颜色 UINavigationBar
示例

所谓动态修改 意思是 在当前页面滚动的过程中 亦或 是在 触发返回事件\进入一个新的页面 导航栏的动态变化
由于系统级别的navBar 高度集成 很多自己想实现的功能 很不好弄 如果是通过继承的话, 参见 category 类别那章相对来说 更适用,自己开发一些个性自定义的方法去实现想要的功能.
参见http://www.cocoachina.com/ios/20150409/11505.html
这篇文章 就是用类别的方法 拓展了 navigationBar 的实例方法 . 甚至动用了 c 底层. 不过 使用起来还是很方便
上关键类别代码
// // UINavigationBar+MyNavBar.h // LTNavigationBar #import <UIKit/UIKit.h> @interface UINavigationBar (MyNavBar) - (void)lt_setBackgroundColor:(UIColor *)backgroundColor; - (void)lt_setElementsAlpha:(CGFloat)alpha; - (void)lt_setTranslationY:(CGFloat)translationY; - (void)lt_reset; @end // // UINavigationBar+Awesome.m // LTNavigationBar
#import "UINavigationBar+MyNavBar.h" #import <objc/runtime.h> @implementation UINavigationBar (MyNavBar) static char 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) { [self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; self.overlay = [[UIView alloc] initWithFrame:CGRectMake(, -, [UIScreen mainScreen].bounds.size.width, CGRectGetHeight(self.bounds) + )]; self.overlay.userInteractionEnabled = NO; self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; [self insertSubview:self.overlay atIndex:]; } self.overlay.backgroundColor = backgroundColor; } - (void)lt_setTranslationY:(CGFloat)translationY { self.transform = CGAffineTransformMakeTranslation(, translationY); } - (void)lt_setElementsAlpha:(CGFloat)alpha { [[self valueForKey:@"_leftViews"] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger i, BOOL *stop) { view.alpha = alpha; }]; [[self valueForKey:@"_rightViews"] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger i, BOOL *stop) { view.alpha = alpha; }]; UIView *titleView = [self valueForKey:@"_titleView"]; titleView.alpha = alpha; // when viewController first load, the titleView maybe nil [[self subviews] enumerateObjectsUsingBlock:^(UIView *obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:NSClassFromString(@"UINavigationItemView")]) { obj.alpha = alpha; *stop = YES; } }]; } - (void)lt_reset { [self setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; [self.overlay removeFromSuperview]; self.overlay = nil; } @end
调用示例 这个效果 透明度的更改也是仿淘宝 展示 具体商品页面的滑动效果 可以去查看
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.dataSource = self;
[self.navigationController.navigationBar lt_setBackgroundColor:[UIColor clearColor]];
[self setBackButtonStyleLight:YES];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
UIColor * color = [UIColor colorWithRed:/255.0 green:/255.0 blue:/255.0 alpha:];
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY > NAVBAR_CHANGE_POINT) {
CGFloat alpha = MIN(, - ((NAVBAR_CHANGE_POINT + - offsetY) / )); // NAVBAR_CHANGE_POINT 和 64 这两个参数 都是 看效果需求可酌情更改 就是 透明度变化的时机 系数
[self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:alpha]];
[self setBackButtonStyleLight:NO alpha:alpha];
} else {
[self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:]];
[self setTitle:@""];
[self setBackButtonStyleLight:YES];
}
}
- (void)setBackButtonStyleLight:(BOOL)isLight
{
[self setBackButtonStyleLight:isLight alpha:];
} - (void)setBackButtonStyleLight:(BOOL)isLight alpha:(CGFloat)alpha
{
if(isLight){
[titleLabel setAlpha:];//导航标题
[backButton setAlpha:];//返回按钮
[titleLabel setText:@""];
UIImage *image = backButton.imageView.image;
UIImage *targetImage = [UIImage imageNamed:@"icon_fanhi"];
if(image != targetImage){
[backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateNormal];
[backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateHighlighted];
}
}else{
if(alpha < 0.5){
[titleLabel setText:@""];
UIImage *image = backButton.imageView.image;
UIImage *targetImage = [UIImage imageNamed:@"icon_fanhi"];
if(image != targetImage){
[backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateNormal];
[backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateHighlighted];
}
//先是之前的消失
[backButton setAlpha:(0.5 - alpha) * ];
}else{
UIImage *image = backButton.imageView.image;
UIImage *targetImage = [UIImage imageNamed:@"icon_fanhihei"];
if(image != targetImage){
[backButton setImage:[UIImage imageNamed:@"icon_fanhihei"] forState:UIControlStateNormal];
[backButton setImage:[UIImage imageNamed:@"icon_fanhihei"] forState:UIControlStateHighlighted];
}
[titleLabel setText:foodItemModel.foodName];
//将返回和分享慢慢出现
CGFloat showAlpha = (alpha - 0.5) * ;
[titleLabel setAlpha:showAlpha];
[backButton setAlpha:showAlpha];
}
}
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
[self initScrollNav];
} - (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
//self.tableView.delegate = nil;//废弃代码
[self.navigationController.navigationBar lt_reset];//页面消失时候要 恢复 正常导航栏模式
} - (void)initScrollNav
{
self.tableView.delegate = self;
[self scrollViewDidScroll:self.tableView];
[self.tableView reloadData];
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
} - (void)dealloc
{
self.tableView.delegate = nil;//不能在 viewWilldisappear 里nil 这时候 仍然会触发 scrollViewDidLoad 导致崩溃 需要卸写在这里
}
还有一种情况 就是滚动过程中 导航栏消失 保留状态栏 这种情况 一些产品比较青睐 我个人特别不喜欢 一直坚信 ios7以后 苹果就是倡导 状态栏 导航栏一体化 所以留个状态栏 你以为是安卓吗? 丑爆了 然并卵 开发者只有提建议的权利 没有决定权 怎么实现 还是要会的 是吧
示例:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat offsetY = scrollView.contentOffset.y;
if (offsetY > ) {
if (offsetY >= ) {
[self setNavigationBarTransformProgress:];
} else {
[self setNavigationBarTransformProgress:(offsetY / )];
}
} else {
[self setNavigationBarTransformProgress:];
self.navigationController.navigationBar.backIndicatorImage = [UIImage new];
}
}
- (void)setNavigationBarTransformProgress:(CGFloat)progress
{
[self.navigationController.navigationBar lt_setTranslationY:(- * progress)];
[self.navigationController.navigationBar lt_setElementsAlpha:(-progress)];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];//保留状态栏的那种情况
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.navigationController.navigationBar lt_reset];
}
iOS 动态修改导航栏颜色 UINavigationBar的更多相关文章
- uniapp动态修改导航栏
1.修改导航栏buttons 如图动态修改角标 <template> <view> </view> </template> <script> ...
- uni-app nvue页面动态修改导航栏按钮
话不多说上代码 let pages = getCurrentPages() let page = pages[pages.length - 1]; let currentWebview = page. ...
- IOS 导航栏颜色 标题
修改导航栏颜 #define COLOR_TOMATO [UIColor colorWithRed:255/255.0f green:99/255.0f blue:71/255.0f alpha ...
- iOS系统中导航栏的转场解决方案与最佳实践
背景 目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美.有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们 ...
- 【转】iOS中设置导航栏标题的字体颜色和大小
原文网址:http://www.360doc.com/content/15/0417/11/20919452_463847404.shtml iOS中设置导航栏标题的字体颜色和大小,有需要的朋友可以参 ...
- iOS中设置导航栏标题的字体颜色和大小
iOS中设置导航栏标题的字体颜色和大小,有需要的朋友可以参考下. 在平时开发项目的时候,难免会遇到修改导航栏字体大小和颜色的需求,一般使用自定义视图的方法,其实还存在一种方法. 方法一:(自定义视图的 ...
- iOS 导航栏颜色字体等的自定义
1.设置导航栏中间文字的文字颜色和文字大小 方法一:系统方法 self.title = @"下载微课";//在有navigationController的控制器中,作用与self. ...
- ios 修改导航栏返回按钮的图片
修改导航栏返回按钮的图片 方法1: [UINavigationBar appearance].backIndicatorTransitionMaskImage = [UIImage imageName ...
- Swift - 修改导航栏的样式(文字颜色,背景颜色,背景图片)
默认情况,导航栏UINavigationController的样式如下,如果想要使用代码修改样式也是比较简单的. 1,修改导航栏背景色 1 2 3 //修改导航栏背景色 self.navigation ...
随机推荐
- 项目开发中的一些注意事项以及技巧总结 基于Repository模式设计项目架构—你可以参考的项目架构设计 Asp.Net Core中使用RSA加密 EF Core中的多对多映射如何实现? asp.net core下的如何给网站做安全设置 获取服务端https证书 Js异常捕获
项目开发中的一些注意事项以及技巧总结 1.jquery采用ajax向后端请求时,MVC框架并不能返回View的数据,也就是一般我们使用View().PartialView()等,只能返回json以 ...
- SQL Server 中树形表数据的处理总结
-- 使用函数的方法: --建立 演示环境 if object_id('tb_bookInfo') is not null drop table tb_bookInfo go ),type int) ...
- linux下拷贝隐藏文件
1.拷贝隐藏文件 把/home/u文件夹中的全部文件(包含隐藏文件)拷贝到/home/user1中 cp -a /home/u/. /home/user1 2.改动主机名: vi /e ...
- [译]NeHe教程 - 你的第一个多边形
原文: Your First Polygon 在第一节中我讲解了如何创建OpenGL窗体.本节我会讲解如何创建三角形和四边形.我们会用GL_TRIANGLES来创建三角形,用GL_GUADS创建四边形 ...
- 【深入JVM】JVM工具之JMAP
一.工具介绍 假设把java\bin文件夹配置到环境变量.在cmd输入jmap会有例如以下提示: 翻译:打印出某个java进程(使用pid)内存内的,全部'对象'的情况(如:产生那些对象,及其数量). ...
- 配置Nginx防止直接用IP訪问Webserver
看了非常多Nginx的配置,好像都忽略了ip直接訪问Web的问题.这样理论上不利于SEO优化,所以我们希望能够避免直接用IP訪问站点.而是域名訪问.详细怎么做呢.看以下. 官方文档中提供的方法: If ...
- (2) yum源配置-163
1.获取yum源文件 登录http://mirrors.163.com/.help/centos.html,查看CentOS6的链接地址(右键点击“CentOS6”,选择复制链接地址),链接地址为:h ...
- Ubuntu 18.04 初始化(server版本 )
系统安装 ubuntu 18.04 英文版,创建个人用户 初始系统 a.修改ip shell> vim /etc/network/interfaces auto ens33 iface ens3 ...
- 【JMeter4.0学习(一)】之FTP性能测试脚本开发,并实现上传下载功能
参考:<Jmeter常用脚本开发之FTP请求>感谢作者:rosa2015 一.首先,搭建FTP服务器,参考地址:<[FTP]之windows8.1上搭建FTP服务器方法> 二. ...
- 2017年Android百大框架排行榜(转)
一.榜单介绍 排行榜包括四大类: 单一框架:仅提供路由.网络层.UI层.通信层或其他单一功能的框架 混合开发框架:提供开发hybrid app.h5与webview结合能力.web app能力的框架 ...