iOS轻松实现导航栏透明渐变
⾸先我们来看下效果
⼀开始当我们什么只设置了⼀张图⽚作为它的头部视图的时候,它是这样的
1.⾸当其冲的,我们先得把导航栏弄透明
那么我们⾸先得知道,设置navigationBar的BackgroundColor为Clear是没⽤的,你可以试着设置它的clear,但是没⽤,原因⼀会⼉我们就知道了。
view ui框架
⽽对于把导航栏设置为透明,⽹上⼤多数的⽅法是:
[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.还得让它不仅仅是透明
这,怎么整?我们有⼏种⽅案
设置渐变图⽚
根据上⾯设置为透明的⽅法,我们最直接能想到的还是setBackgroundImage,根据滑动距离去设置图⽚的alpha。是的,我们是去设置图⽚,⽽不是设置UIView,这样的话就需要你不停的去⽣成新图⽚赋给BackgroundImage,这样感觉是不是会不太好?
运⾏时动态绑定我们可以在运⾏时动态绑定他的背景视图,然后设置他的背景透明度,⽹上有⼀个通过类别⽅式动态绑定实现导航栏颜⾊渐变的三⽅框架,感兴趣的朋友可以⾃⾏去研究研究。
直接获取那张ImageView,然后设置他的透明度。
其实我们从结构图中可以看出来,它是NavigationBar的⼦视图,我们可以通过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 = tOffset.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)
我⾃⼰封装了⼀些导航栏变化效果,使⽤简单,欢迎⼤家尝试:。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。