摘自:https://www.jianshu.com/p/d0a523659f08
感谢原作者
根据偏移量,动态修改状态栏的颜色
码代码到现在,刚刚做了个小需求,根据偏移量动态修改状态栏的颜色。
刚开始我是这样想的,根据偏移量,直接修改状态栏的颜色就好了。
于是,便有了下面的代码。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y <= -20) {
self.navigationController.navigationBar.barStyle = UIStatusBarStyleDefault;
} else {
self.navigationController.navigationBar.barStyle = UIStatusBarStyleLightContent;
}
}
写完一运行,貌似并没有起作用啊。谷歌上百度了一下,没有看到相关动态修改状态栏颜色的东西,有可能是手法不对。还有就是这个问题太low,没有人问过。想了一下,其实最主要的还是修改状态栏的颜色。可能因为每个项目自身的一些情况,修改状态栏颜色的方法不一定都起作用。接下来我定义了一个全局的属性记录偏移量,然后在滚动的代理方法中赋值并且调用UIViewController
的- (void)setNeedsStatusBarAppearanceUpdate
方法。然后重写系统的- (UIStatusBarStyle)preferredStatusBarStyle
方法。在这个方法中去改变状态栏的颜色。代码如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
self.offset = scrollView.contentOffset.y;
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle {
if (self.offset <= -20) {
return UIStatusBarStyleDefault;
}
return UIStatusBarStyleLightContent;
}
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {
return UIStatusBarAnimationFade;
}
如果不是经过导航栏包装的控制器的话,到这里就可以实现根据偏移量修改状态栏的颜色了。如果你的控制器是经过导航控制器包装的,你需要自定义一个导航控制器继承自UINavigationController
,重写
- (UIViewController *)childViewControllerForStatusBarStyle
方法
- (UIViewController *)childViewControllerForStatusBarStyle {
return self.topViewController;
}
让状态栏的颜色由控制器自己去决定。
虽然都是一些简单的小东西,在日常开发中也不太会注意这些细节。遇到了就记下来,希望能帮助到需要的人。也加深自己的印象。写完收工。睡醒了再继续coding。。。最后补一张效果图就滚去睡觉了!