您的位置:首页 > 产品设计 > UI/UE

动态修改UINavigationBar的背景色

2017-11-01 16:19 423 查看
http://tech.glowing.com/cn/change-uinavigationbar-backgroundcolor-dynamically/

这是我们最终想要得到的效果:



思路

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];
}
}


结果却是。。。

仔细观察,会发现navigationBar的高度是44,它的上方是statusBar,而且,navigationBar的上面还有一个未知的View。。。到底Apple是怎么实现UINavigationBar的呢,让我们一探究竟!

在xcode的顶部菜单栏找到Debug > View Debugging > Capture View Hierarchy:




原来UINavigationBar上有一个_UIBackDropView,正是它决定了navigationBar的背景色。

那么我们是不是可以修改它的颜色呢,赶紧打开UINavigationBar.h,找了一圈,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: