首先我们来看下效果

一开始当我们什么只设置了一张图片作为它的头部视图的时候,它是这样的

  1. 首当其冲的,我们先得把导航栏弄透明

那么我们首先得知道,设置navigationBar的BackgroundColor为Clear是没用的,你可以试着设置它的clear,但是没用,原因一会儿我们就知道了

而对于把导航栏设置为透明,网上大多数的方法是

[self.navigationController.navigationBar setBackgroundImage:[UIImage new]

forBarMetrics:UIBarMetricsDefault];

self.navigationController.navigationBar.shadowImage = [UIImage new];

你可以运行这两句话到你的程序,你会发现这样确实是可以的,那么我们可以从中得到几个信息

  1. 我们设置的是BackgroundImage,说明也许在我们的navigationBar上有一个ImageView的子视图,而我们的看到的导航栏实际上看到的就是这个图片,因此设置它为无图片我们就可以看到透明,而设置backgroundColor却不行

  2. 我们还设置了shadowImage为无图,它其实就是导航栏下面的那根细线,如果你不写第二句话你则会看到一根线

我们来看一下navigationBar的结构图

从图中我们可以很清楚的看到,NavigationBar他背后是有一张类型为_UINavigationBarBackground(UIImageView的子类)的视图,我们平时看到的大部分其实都是它,第二个箭头那里的ImageView就是那根细线,他是加在我们背景的ImageView上面的,我们设置BackgroundImage其实就是设置_UINavigationBarBackground的image

运行效果如图

2.还得让它不仅仅是透明

这,怎么整?我们有几种方案

  1. 设置渐变图片

    根据上面设置为透明的方法,我们最直接能想到的还是setBackgroundImage,根据滑动距离去设置 图片 的alpha,是的,我们是去设置图片,而不是设置UIView,这样的话就需要你不停的去生成新图片赋给BackgroundImage,这样感觉是不是会不太好?

  2. 运行时动态绑定

    我们可以在运行时动态绑定他的背景视图,然后设置他的背景透明度,网上有一个通过类别方式动态绑定实现导航栏颜色渐变的三方框架,感兴趣的朋友可以自行去研究研究LTNavigation

  3. 直接获取那张ImageView,然后设置他的透明度

    其实我们从结构图中可以看出来,他是NavigationBar的子视图,我们可以通过for…in循环遍历navigationBar.subviews,然后获得这个view.

当然,更简单的,它其实就在subviews的第一个,即,我们可以这样

barImageView = self.navigationController.navigationBar.subviews.firstObject

我们可以用一个全局的imageView引用他,以免我们每次都要写一长串

3.其实已经可以了

我们还需要做什么?没错,最后一步,我们仅仅只需要在scrollViewDidScroll里面,根据偏移量来动态改变barImageView的背景颜色(或者透明度)就行了

例如我们需要在-64(默认的最小偏移量)到200之间变化

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

CGFloat minAlphaOffset = - 64;

CGFloat maxAlphaOffset = 200;

CGFloat offset = scrollView.contentOffset.y;

CGFloat alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset);

_barImageView.alpha = alpha;

}

就这样你就可以实现我在文章一开始那个图片的效果了(其实并不是,tintColor和satusBarStyle还没变)

Tips

1.你也可以动态的更改的状态栏和标题的颜色以和导航栏更匹配

//状态栏

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

//标题颜色

self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [UIColor someColor]}

//导航栏子控件颜色

self.navigationController.navigationBar.tintColor = [UIColor someColor];

2.注意释放tableView 的 delegate(不然你进进出出时候会发现哪里好像不太对)

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

self.tableView.delegate = self;

}

- (void)viewWillDisappear:(BOOL)animated {

[super viewWillDisappear:animated];

self.tableView.delegate = nil;

}

3.导航栏是公有的

所以你可能需要在ViewWillDisappear里面再把导航栏设置为你需要的样子

还有一件事情(This word Learn from Steve jobs)

我自己封装了一些导航栏变化效果,使用简单,欢迎大家尝试MXNavigationBarManager

https://github.com/cwxatlm/MXNavigationBarManager

转载于:https://www.cnblogs.com/fengmin/p/5562717.html

几句话实现导航栏透明渐变 – iOS相关推荐

  1. 微信小程序----导航栏透明渐变一(MUI导航栏透明渐变)

    效果体验二维码 如果文章对你有帮助的话,请打开微信扫一下二维码,点击一下广告,支持一下作者!谢谢! DEMO下载 导航栏透明渐变效果 实现原理 利用position:absolute在导航下定位一个v ...

  2. 微信小程序----导航栏透明渐变二(MUI导航栏透明渐变)

    效果体验二维码 如果文章对你有帮助的话,请打开微信扫一下二维码,点击一下广告,支持一下作者!谢谢! 导航栏透明渐变效果 实现原理 给page-group设置的背景颜色采用rgba; 通过改变rgba其 ...

  3. 基于 vue2 导航栏透明渐变

    在移动或者app 中经常会用,顶部导航栏固定,但是随着页面向上滚动,导航栏的透明度发生变化. 做法为: 1.首先给要滚动变化的导航添加 :style="style" <mt- ...

  4. mui案例:导航栏 颜色渐变

    mui导航栏 · 滚动渐变 · 代码参考 代码: <!DOCTYPE html> <html><head><meta charset="utf-8& ...

  5. 导航栏-滚动渐变 - 封装版

    导航栏-滚动渐变 (已封装插件,任意调用) 样式采用mui框架的样式(无须在意) <!DOCTYPE html> <html><head><meta char ...

  6. Android状态栏和导航栏透明和沉浸式模式

    最近在App上需要对状态栏进行相关的设置,在网上看了些文章,像郭神的沉浸式那篇博客对我启发蛮大,但是对状态栏的设置,包括隐藏,透明,颜色设置等,并没有比较系统的概念,实现方式不止一种,有操作Windo ...

  7. uni-app 导航栏透明设置

    uni-app 导航栏透明设置 1.pages.json的style中配置 {"path": "pages/shop/shop","style&quo ...

  8. 导航栏透明度渐变; 下拉头视图拉伸效果;勾号动画; 一段文字中点击部分可响应不同事件...

    之前通过设置navigationBar的barTintColor设置导航栏颜色,然后拿到self.navigationController.navigationBar.subviews.firstOb ...

  9. 微信小程序中自定义背景导航栏透明背景设置

    首先确定好自己要在哪个页面中使用自定义头部导航栏样式 在该页面中找到xxx.json文件中添加上 "navigationStyle":''custom" 这样在页面中头部 ...

最新文章

  1. 在内网中使用maven_maven构建docker镜像三部曲之三:推送到远程仓库(内网和阿里云)-Go语言中文社区...
  2. Windows 10全新分支版本曝光!专门优化高配置PC
  3. idea、eclipse常用快捷键
  4. 南京工程学院 数据库复习(数据库系统概论复习 及 数据库原理与应用样题)
  5. JavaFX技巧4:总结
  6. Excel太丑、敲代码太烦,这才是老板最喜欢看的神仙报表
  7. 解决MySQL 8.0 设置简单密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy require...
  8. Atitit api design Usability simple 易用性之简单化设计 目录 1. 理论原则 2 1.1. 概念简单 2 1.2. 切换到了“write less, do more
  9. 抖音无水印视频批量下载助手
  10. 我的深圳真实驾考经历
  11. 安全站点导航(感谢backlion整理)
  12. **任务一 WEB学习 笔记**
  13. java图片去掉水印
  14. 论如何在网页中插入一张图片
  15. 【Cocos Creator 游戏开发】开发日志-前言
  16. 解析电源设计1-储能元件-电容
  17. 福禄克DTX-1800线缆认证测试仪,为什么福禄克建议1年校准1次?
  18. 篮球队编程题(Java)
  19. 软件项目管理指南:定义、5大过程、估算及进度管理方法等
  20. 样本均值和方差对总体均值和方差的无偏估计证明、样本方差的方差

热门文章

  1. Java API —— ArrayList类 Vector类 LinkList类
  2. vxworks源码剖析- 数据结构篇一(双向链表)-转
  3. cms的html调用,工作笔记三,phpcms几中HTML标签的调用
  4. [Python] L1-047 装睡-PAT团体程序设计天梯赛GPLT
  5. 【离散数学】单向连通和弱连通的区别
  6. 【解释】对用户透明=对用户隐蔽:关系模型的存取路径对用户透明
  7. 可以声明一个抽象类类型变量_TypeScript系列(二)变量声明和数据类型
  8. 判断用户 小程序_解读微信小程序用户运营四部曲
  9. Perl Redis 连接测试脚本,获取list长度
  10. python3爬虫-通过requests爬取图虫网