示例

所谓动态修改  意思是 在当前页面滚动的过程中 亦或 是在 触发返回事件\进入一个新的页面  导航栏的动态变化

由于系统级别的navBar 高度集成  很多自己想实现的功能 很不好弄 如果是通过继承的话,  参见 category 类别那章相对来说 更适用,自己开发一些个性自定义的方法去实现想要的功能.

参见http://www.cocoachina.com/ios/20150409/11505.html

这篇文章 就是用类别的方法 拓展了 navigationBar 的实例方法 . 甚至动用了 c 底层. 不过 使用起来还是很方便

上关键类别代码

  1. //
  2.  
  3. // UINavigationBar+MyNavBar.h
  4.  
  5. // LTNavigationBar
  6.  
  7. #import <UIKit/UIKit.h>
  8.  
  9. @interface UINavigationBar (MyNavBar)
  10.  
  11. - (void)lt_setBackgroundColor:(UIColor *)backgroundColor;
  12.  
  13. - (void)lt_setElementsAlpha:(CGFloat)alpha;
  14.  
  15. - (void)lt_setTranslationY:(CGFloat)translationY;
  16.  
  17. - (void)lt_reset;
  18.  
  19. @end
  20.  
  21. //
  22.  
  23. // UINavigationBar+Awesome.m
  24.  
  25. // LTNavigationBar
  26. #import "UINavigationBar+MyNavBar.h"
  27.  
  28. #import <objc/runtime.h>
  29.  
  30. @implementation UINavigationBar (MyNavBar)
  31.  
  32. static char overlayKey;
  33.  
  34. - (UIView *)overlay
  35.  
  36. {
  37.  
  38. return objc_getAssociatedObject(self, &overlayKey);
  39.  
  40. }
  41.  
  42. - (void)setOverlay:(UIView *)overlay
  43.  
  44. {
  45.  
  46. objc_setAssociatedObject(self, &overlayKey, overlay, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  47.  
  48. }
  49.  
  50. - (void)lt_setBackgroundColor:(UIColor *)backgroundColor
  51.  
  52. {
  53.  
  54. if (!self.overlay) {
  55.  
  56. [self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  57.  
  58. self.overlay = [[UIView alloc] initWithFrame:CGRectMake(, -, [UIScreen mainScreen].bounds.size.width, CGRectGetHeight(self.bounds) + )];
  59.  
  60. self.overlay.userInteractionEnabled = NO;
  61.  
  62. self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
  63.  
  64. [self insertSubview:self.overlay atIndex:];
  65.  
  66. }
  67.  
  68. self.overlay.backgroundColor = backgroundColor;
  69.  
  70. }
  71.  
  72. - (void)lt_setTranslationY:(CGFloat)translationY
  73.  
  74. {
  75.  
  76. self.transform = CGAffineTransformMakeTranslation(, translationY);
  77.  
  78. }
  79.  
  80. - (void)lt_setElementsAlpha:(CGFloat)alpha
  81.  
  82. {
  83.  
  84. [[self valueForKey:@"_leftViews"] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger i, BOOL *stop) {
  85.  
  86. view.alpha = alpha;
  87.  
  88. }];
  89.  
  90. [[self valueForKey:@"_rightViews"] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger i, BOOL *stop) {
  91.  
  92. view.alpha = alpha;
  93.  
  94. }];
  95.  
  96. UIView *titleView = [self valueForKey:@"_titleView"];
  97.  
  98. titleView.alpha = alpha;
  99.  
  100. // when viewController first load, the titleView maybe nil
  101.  
  102. [[self subviews] enumerateObjectsUsingBlock:^(UIView *obj, NSUInteger idx, BOOL *stop) {
  103.  
  104. if ([obj isKindOfClass:NSClassFromString(@"UINavigationItemView")]) {
  105.  
  106. obj.alpha = alpha;
  107.  
  108. *stop = YES;
  109.  
  110. }
  111.  
  112. }];
  113.  
  114. }
  115.  
  116. - (void)lt_reset
  117.  
  118. {
  119.  
  120. [self setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
  121.  
  122. [self.overlay removeFromSuperview];
  123.  
  124. self.overlay = nil;
  125.  
  126. }
  127.  
  128. @end

调用示例  这个效果 透明度的更改也是仿淘宝 展示 具体商品页面的滑动效果  可以去查看

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. self.tableView.dataSource = self;
  4. [self.navigationController.navigationBar lt_setBackgroundColor:[UIColor clearColor]];
    [self setBackButtonStyleLight:YES];
  5. }
  6.  
  7. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  8. {
  9. UIColor * color = [UIColor colorWithRed:/255.0 green:/255.0 blue:/255.0 alpha:];
  10. CGFloat offsetY = scrollView.contentOffset.y;
  11. if (offsetY > NAVBAR_CHANGE_POINT) {
  12. CGFloat alpha = MIN(, - ((NAVBAR_CHANGE_POINT + - offsetY) / )); // NAVBAR_CHANGE_POINT 和 64 这两个参数 都是 看效果需求可酌情更改 就是 透明度变化的时机 系数
  13. [self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:alpha]];

[self setBackButtonStyleLight:NO alpha:alpha];

  1. } else {
  2. [self.navigationController.navigationBar lt_setBackgroundColor:[color colorWithAlphaComponent:]];

[self setTitle:@""];

[self setBackButtonStyleLight:YES];

  1. }
  2. }
  1. - (void)setBackButtonStyleLight:(BOOL)isLight
  2. {
  3. [self setBackButtonStyleLight:isLight alpha:];
  4. }
  5.  
  6. - (void)setBackButtonStyleLight:(BOOL)isLight alpha:(CGFloat)alpha
  7. {
  8. if(isLight){
  9. [titleLabel setAlpha:];//导航标题
  10. [backButton setAlpha:];//返回按钮
  11. [titleLabel setText:@""];
  12. UIImage *image = backButton.imageView.image;
  13. UIImage *targetImage = [UIImage imageNamed:@"icon_fanhi"];
  14. if(image != targetImage){
  15. [backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateNormal];
  16. [backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateHighlighted];
  17. }
  18. }else{
  19. if(alpha < 0.5){
  20. [titleLabel setText:@""];
  21. UIImage *image = backButton.imageView.image;
  22. UIImage *targetImage = [UIImage imageNamed:@"icon_fanhi"];
  23. if(image != targetImage){
  24. [backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateNormal];
  25. [backButton setImage:[UIImage imageNamed:@"icon_fanhi"] forState:UIControlStateHighlighted];
  26. }
  27. //先是之前的消失
  28. [backButton setAlpha:(0.5 - alpha) * ];
  29. }else{
  30. UIImage *image = backButton.imageView.image;
  31. UIImage *targetImage = [UIImage imageNamed:@"icon_fanhihei"];
  32. if(image != targetImage){
  33. [backButton setImage:[UIImage imageNamed:@"icon_fanhihei"] forState:UIControlStateNormal];
  34. [backButton setImage:[UIImage imageNamed:@"icon_fanhihei"] forState:UIControlStateHighlighted];
  35. }
  36. [titleLabel setText:foodItemModel.foodName];
  37. //将返回和分享慢慢出现
  38. CGFloat showAlpha = (alpha - 0.5) * ;
  39. [titleLabel setAlpha:showAlpha];
  40. [backButton setAlpha:showAlpha];
  41. }
  42. }
  43. }
  1.  
  1. - (void)viewWillAppear:(BOOL)animated
  2. {
  3. [super viewWillAppear:YES];
  4. [self initScrollNav];
  5. }
  6.  
  7. - (void)viewWillDisappear:(BOOL)animated
  8. {
  9. [super viewWillDisappear:animated];
  10. //self.tableView.delegate = nil;//废弃代码
  11. [self.navigationController.navigationBar lt_reset];//页面消失时候要 恢复 正常导航栏模式
  12. }
  13.  
  14. - (void)initScrollNav
  15. {
  16. self.tableView.delegate = self;
  17. [self scrollViewDidScroll:self.tableView];
  18. [self.tableView reloadData];
  19. [self.navigationController.navigationBar setShadowImage:[UIImage new]];
  20. }
  21.  
  22. - (void)dealloc
  23. {
  24. self.tableView.delegate = nil;//不能在 viewWilldisappear 里nil 这时候 仍然会触发 scrollViewDidLoad 导致崩溃 需要卸写在这里
  25. }

还有一种情况 就是滚动过程中 导航栏消失 保留状态栏  这种情况 一些产品比较青睐  我个人特别不喜欢  一直坚信 ios7以后 苹果就是倡导 状态栏 导航栏一体化 所以留个状态栏 你以为是安卓吗? 丑爆了  然并卵  开发者只有提建议的权利 没有决定权 怎么实现 还是要会的 是吧

示例:

  1. - (void)viewDidLoad {
  2. [super viewDidLoad];
  3. self.tableView.delegate = self;
  4. self.tableView.dataSource = self;
  5. [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
  6. }
  7.  
  8. - (void)scrollViewDidScroll:(UIScrollView *)scrollView
  9. {
  10. CGFloat offsetY = scrollView.contentOffset.y;
  11. if (offsetY > ) {
  12. if (offsetY >= ) {
  13. [self setNavigationBarTransformProgress:];
  14. } else {
  15. [self setNavigationBarTransformProgress:(offsetY / )];
  16. }
  17. } else {
  18. [self setNavigationBarTransformProgress:];
  19. self.navigationController.navigationBar.backIndicatorImage = [UIImage new];
  20. }
  21. }
  22.  
  23. - (void)setNavigationBarTransformProgress:(CGFloat)progress
  24. {
  25. [self.navigationController.navigationBar lt_setTranslationY:(- * progress)];
  26. [self.navigationController.navigationBar lt_setElementsAlpha:(-progress)];
  27. }
  28.  
  29. - (void)viewWillAppear:(BOOL)animated
  30. {
  31. [super viewWillAppear:YES];//保留状态栏的那种情况
  32. }
  33.  
  34. - (void)viewWillDisappear:(BOOL)animated
  35. {
  36. [super viewWillDisappear:animated];
  37. [self.navigationController.navigationBar lt_reset];
  38. }

iOS 动态修改导航栏颜色 UINavigationBar的更多相关文章

  1. uniapp动态修改导航栏

    1.修改导航栏buttons 如图动态修改角标 <template> <view> </view> </template> <script> ...

  2. uni-app nvue页面动态修改导航栏按钮

    话不多说上代码 let pages = getCurrentPages() let page = pages[pages.length - 1]; let currentWebview = page. ...

  3. IOS 导航栏颜色 标题

    修改导航栏颜 #define COLOR_TOMATO    [UIColor colorWithRed:255/255.0f green:99/255.0f blue:71/255.0f alpha ...

  4. iOS系统中导航栏的转场解决方案与最佳实践

    背景 目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美.有的方案不能满足复杂的页面跳转场景,有的方案迁移成本较大,为此我们 ...

  5. 【转】iOS中设置导航栏标题的字体颜色和大小

    原文网址:http://www.360doc.com/content/15/0417/11/20919452_463847404.shtml iOS中设置导航栏标题的字体颜色和大小,有需要的朋友可以参 ...

  6. iOS中设置导航栏标题的字体颜色和大小

    iOS中设置导航栏标题的字体颜色和大小,有需要的朋友可以参考下. 在平时开发项目的时候,难免会遇到修改导航栏字体大小和颜色的需求,一般使用自定义视图的方法,其实还存在一种方法. 方法一:(自定义视图的 ...

  7. iOS 导航栏颜色字体等的自定义

    1.设置导航栏中间文字的文字颜色和文字大小 方法一:系统方法 self.title = @"下载微课";//在有navigationController的控制器中,作用与self. ...

  8. ios 修改导航栏返回按钮的图片

    修改导航栏返回按钮的图片 方法1: [UINavigationBar appearance].backIndicatorTransitionMaskImage = [UIImage imageName ...

  9. Swift - 修改导航栏的样式(文字颜色,背景颜色,背景图片)

    默认情况,导航栏UINavigationController的样式如下,如果想要使用代码修改样式也是比较简单的. 1,修改导航栏背景色 1 2 3 //修改导航栏背景色 self.navigation ...

随机推荐

  1. spring集成PHPRPC及使用

    PHPRPC,它的商业版本是Hprose.这里仅记录其使用方法.其它相关内容可自行搜索. 对于开源的东西,建议大家看看其源码. 1.需要引入的jar包:phprpc_spring.jar,http:/ ...

  2. 操作REDIES

    import redis r=redis.Redis(host='118.XX.XX.XXX',password='XXXXXXX9*',db=1,port=6379) # 增删改查r.set('jd ...

  3. java中利用WeakHashMap实现缓存

    简介 WeakHashMap是Java集合框架里的一员,从名字可以看出它是某种 Map.它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove() ...

  4. PLSQL中显示Cursor、隐示Cursor、动态Ref Cursor差别

    一.显式cursor 显式是相对与隐式cursor而言的,就是有一个明白的声明的cursor.显式游标的声明类似例如以下(具体的语法參加plsql ref doc ): cursor cursor_n ...

  5. Junit内部解密之四: Junit单元测试最佳实践

    我们做使用Junit工具来做单页测试或接口测试时,需要注意一些问题,包括我们的编码规范,test规范,以及编写测试代码的策略,以下个人的总结. 1.为还没有实现的测试代码抛出一个异常.这就避免了该测试 ...

  6. 当客户端提交更新数据请求时,是先写入edits,然后再写入内存的

    http://blog.sina.com.cn/s/blog_6f83c7470101b7d3.html http://blog.csdn.net/slq1023/article/details/49 ...

  7. Java深入 - Java 内存分配和回收机制-转

    Java的GC机制是自动进行的,和c语言有些区别需要程序员自己保证内存的使用和回收. Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC ...

  8. linux下网卡bonding配置

    linux下网卡bonding配置   章节 bonding技术 centos7配置bonding centos6配置bonding 一.bonding技术 bonding(绑定)是一种linux系统 ...

  9. 把flask部署到服务器

    1.新建一个wsgi.py文件 # -*- coding:utf-8 -*- import sys from os.path import abspath from os.path import di ...

  10. linux用一键安装包 禅道

    ----------------1.重启apache 和 mysql /opt/zbox/zbox restart -----------------2.问题1:发现端口被占用 apache启动报错( ...