动态修改UINavigationBar的背景色
2017-11-01 16:19
423 查看
http://tech.glowing.com/cn/change-uinavigationbar-backgroundcolor-dynamically/
这是我们最终想要得到的效果:
![](https://raw.githubusercontent.com/ltebean/LTNavigationBar/master/images/demo.gif)
在
那么我们来看看apple为我们提供了哪些API来设置navigationBar的颜色。
首先想到的是最常用的
Use the UIAppearance protocol to get the appearance proxy for a class. You can customize the appearance of instances of a class by sending appearance modification messages to the class’s appearance
proxy.
但是:
iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window,
remove the view from the view hierarchy and then put it back.
所以换一条路,直接修改
结果却是。。。
![](http://tech.glowing.com/cn/content/images/2015/04/iOS-Simulator-Screen-Shot-2015-4-4----4-16-51-1.png)
仔细观察,会发现navigationBar的高度是44,它的上方是statusBar,而且,navigationBar的上面还有一个未知的View。。。到底Apple是怎么实现UINavigationBar的呢,让我们一探究竟!
在xcode的顶部菜单栏找到Debug > View Debugging > Capture View Hierarchy:
![](http://tech.glowing.com/cn/content/images/2015/04/navigationBar-1-1.jpg)
![](http://tech.glowing.com/cn/content/images/2015/04/navigationBarBackDrop-1.jpg)
原来UINavigationBar上有一个_UIBackDropView,正是它决定了navigationBar的背景色。
那么我们是不是可以修改它的颜色呢,赶紧打开UINavigationBar.h,找了一圈,
这是我们最终想要得到的效果:
![](https://raw.githubusercontent.com/ltebean/LTNavigationBar/master/images/demo.gif)
思路
在UISrollView的delegate方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView中根据当前的contentOffset更新navigationBar的backgroundColor即可,so easy~
开动
那么我们来看看apple为我们提供了哪些API来设置navigationBar的颜色。首先想到的是最常用的
[UINavigationBar appearance],我们一般会在AppDelegate中使用它对navigationBar进行统一的设置。但是如果试一下,会发现在scrollViewDidScrollView中调用它并不能动态地改变navigationBar的颜色,原因可以看一下Apple的doc:
Use the UIAppearance protocol to get the appearance proxy for a class. You can customize the appearance of instances of a class by sending appearance modification messages to the class’s appearance
proxy.
但是:
iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window,
remove the view from the view hierarchy and then put it back.
所以换一条路,直接修改
UINavigationBar的backgroudColor:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { UIColor *color = [UIColor blueColor]; CGFloat offsetY = scrollView.contentOffset.y; if (offsetY > 0) { CGFloat alpha = 1 - ((64 - offsetY) / 64); self.navigationController.navigationBar.backgroundColor = [color colorWithAlphaComponent:alpha]; } else { self.navigationController.navigationBar.backgroundColor = [color colorWithAlphaComponent:0]; } }
结果却是。。。
![](http://tech.glowing.com/cn/content/images/2015/04/iOS-Simulator-Screen-Shot-2015-4-4----4-16-51-1.png)
仔细观察,会发现navigationBar的高度是44,它的上方是statusBar,而且,navigationBar的上面还有一个未知的View。。。到底Apple是怎么实现UINavigationBar的呢,让我们一探究竟!
在xcode的顶部菜单栏找到Debug > View Debugging > Capture View Hierarchy:
![](http://tech.glowing.com/cn/content/images/2015/04/navigationBar-1-1.jpg)
![](http://tech.glowing.com/cn/content/images/2015/04/navigationBarBackDrop-1.jpg)
原来UINavigationBar上有一个_UIBackDropView,正是它决定了navigationBar的背景色。
那么我们是不是可以修改它的颜色呢,赶紧打开UINavigationBar.h,找了一圈,
相关文章推荐
- 动态修改UINavigationBar的背景色
- 根据页面滚动动态修改UINavigationBar的背景色
- iOS 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色--by-胡旭
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- 动态修改UINavigationBar的背景色
- iOS 动态修改导航栏颜色 UINavigationBar
- 动态修改UINavigationBar背景
- IOS动态修改导航栏颜色 UINavigationBar
- UIToolBar,UINavigationBar 修改背景色
- 动态修改UINavigationBar背景