要想把一个 view 设计成透明的我们一下子就会想到两种方案,设置 view 的 alpha 值为 0,或者设置 view 的 backgroundColor 为 clearColor. 但是 UINavigationBar 是一个比较特殊的视图,它是没有 alpha 属性的,那我们可以设置 opaque(不透明度)为 NO,上代码试一试
- //方案一:不透明度为NO
- navigationBar.opaque = NO;
- //方案二:背景颜色为clearColor
- navigationBar.backgroudcolor = [UIColor clearColor];
结果,然并卵,完全没用。这时候该怎么办呢?这时候我们就得来看看 UINavigationBar 这个视图的结构了,如下图。
现在笔者教大家一个小技巧。请看下面代码:
- //设置一张空的图片
- [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
- //清除边框,设置一张空的图片
- [self.navigationController.navigationBar setShadowImage:[[UIImage alloc]init]];
这时候再打开项目层次图,你会有惊人的发现
对比一下,你会发现只剩两层了。不要问为什么,这都是系统帮你做的。。。当你设置了背景图片的时候,就会出现这样的结果。
知道了上述的原理,这就好办了,现在只要监听,控制器内部的 scrollView 的滚动,就可以实现导航条渐渐透明的效果了。
分类代码
下面这个效果图是系统的 UITableViewController,以下是效果图和代码
控制器代码:
- #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.
控制器代码
来源: http://www.bubuko.com/infodetail-1946312.html