美文网首页
动态修改导航背景色和状态栏的颜色

动态修改导航背景色和状态栏的颜色

作者: 阶梯 | 来源:发表于2018-11-08 14:55 被阅读15次

一: 修改状态栏的颜色

定义了一个全局的属性记录偏移量,然后在滚动的代理方法中赋值并且调用UIViewController- (void)setNeedsStatusBarAppearanceUpdate方法。然后重写系统的- (UIStatusBarStyle)preferredStatusBarStyle方法。在这个方法中去改变状态栏的颜色。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    self.offset = scrollView.contentOffset.y;
    
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    
    if (self.offset > 50) {
        
        return UIStatusBarStyleDefault;
    }
    
    return UIStatusBarStyleLightContent;
}

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation {

    return UIStatusBarAnimationFade;
}

如果不是经过导航栏包装的控制器的话,到这里就可以实现根据偏移量修改状态栏的颜色了。如果你的控制器是经过导航控制器包装的,你需要自定义一个导航控制器继承自UINavigationController,重写
- (UIViewController *)childViewControllerForStatusBarStyle方法

- (UIViewController *)childViewControllerForStatusBarStyle {
    
    return self.topViewController;
}

让状态栏的颜色由控制器自己去决定。

二:修改导航栏的背景色

首先让导航栏是透明色,因此在 viewWillAppear中,

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
   
    //导航栏设置为透明
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    //去掉导航栏底部的黑线
    self.navigationController.navigationBar.shadowImage = [UIImage new];

  // 导航栏渐变色
    [self setNavBackColor:self.offset];
}

注意:在视图将要消失的时候,记得设置回来

-(void)viewWillDisappear:(BOOL)animated{
    [self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:nil];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    CGFloat offset = scrollView.contentOffset.y;
    
    self.offset = offset;
    
    [self setNavBackColor:self.offset];

}

#pragma mark --- 修改Navigation渐变色、状态栏颜色
- (void)setNavBackColor:(CGFloat)offset{
    
    CGFloat alpha = offset * 1 / 64.0;
    if (alpha >= 1) {
        alpha = 0.99;
    }
    UIColor *alphaColor = [UIColor colorWithWhite:1 alpha:alpha];
    UIImage *alphaImage = [UIImage imageWithColor:alphaColor];
    [self.navigationController.navigationBar setBackgroundImage:alphaImage forBarMetrics:UIBarMetricsDefault];
    
    // 修改状态栏的颜色
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle {
    
    if (self.offset > 50) {
        
        return UIStatusBarStyleDefault;
    }
    
    return UIStatusBarStyleLightContent;
}

最后,如果要修改状态栏的颜色,记得:
定义一个导航控制器继承自UINavigationController,重写
- (UIViewController *)childViewControllerForStatusBarStyle方法

UIImage Category

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1.0f, 1.0f);
    // 开启位图上下文
    UIGraphicsBeginImageContext(rect.size);
    // 开启上下文
    CGContextRef ref = UIGraphicsGetCurrentContext();
    // 使用color演示填充上下文
    CGContextSetFillColorWithColor(ref, color.CGColor);
    // 渲染上下文
    CGContextFillRect(ref, rect);
    // 从上下文中获取图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    // 结束上下文
    UIGraphicsEndImageContext();
    return image;
}

参考:https://www.jianshu.com/p/d0a523659f08

相关文章

  • 导航条及状态栏的设置

    // 修改导航条背景色 // 修改导航条上字体颜色及大小 // 修改状态栏字体颜色

  • 动态修改导航背景色和状态栏的颜色

    一: 修改状态栏的颜色 定义了一个全局的属性记录偏移量,然后在滚动的代理方法中赋值并且调用UIViewContro...

  • 设置UINavgationBar的背景色

    全局设置导航栏背景色: // 设置状态栏颜色[UIApplication sharedApplication].s...

  • iOS状态栏设置

    修改所有状态栏颜色 修改单个页面的状态栏颜色添加自定义View放在试图上替代状态栏。如果导航栏存在也可放在导航栏上...

  • 安卓状态栏颜色设置

    设置状态栏背景色: 通过这个设置可以修改状态栏背景色,但是如果设置黑色或者白色会有字体颜色和背景相同导致看不见文字...

  • Swift自定义UINavigationBar样式

    问题描述 App 开发中,有时候需要改变导航栏或者状态栏背景色、字体颜色,或者实现导航栏背景色渐变效果,那么,接下...

  • 设置导航栏颜色, 字体大小

    取出导航栏 设置导航栏背景色 设置标题颜色和字体大小 设置布局从导航栏下开始, 把导航栏设置为不透明 设置状态栏的...

  • 状态栏沉浸模式

    android4.4之前的版本,状态栏的背景色和字体颜色都不能修改。但是4.4以后Google增加了改变状态栏背景...

  • 透明状态栏和导航栏

    1. 4.4之前状态栏和导航栏是黑色,不能修改。4.4之后状态栏和导航栏可以透明话和设置背景颜色了。 2. 有两种...

  • iOS动态修改状态栏的颜色

    根据偏移量,动态修改状态栏的颜色 码代码到现在,刚刚做了个小需求,根据偏移量动态修改状态栏的颜色。刚开始我是这样想...

网友评论

      本文标题:动态修改导航背景色和状态栏的颜色

      本文链接:https://www.haomeiwen.com/subject/bqdwxqtx.html