首页 文章

在iOS 7中基于不同ViewControllers设置灯状态栏文本颜色的正确方法

提问于
浏览
15

我需要让 UINavigationController 中嵌入的特定ViewController具有光状态栏文本颜色(但其他 ViewController s表现不同) . 我知道至少有3种方法,但无论如何都不适用于我的情况 .

  • How to change Status Bar text color in iOS 7,方法主要是:

  • 在plist中将 UIViewControllerBasedStatusBarAppearance 设置为 YES

  • 在viewDidLoad中执行 [self setNeedsStatusBarAppearanceUpdate];

  • 添加以下方法:

- (UIStatusBarStyle)preferredStatusBarStyle{ 
      return UIStatusBarStyleLightContent; 
  }

在iOS 7.0.3上运行,此方法对我不起作用,因为即使在我正确实现了所有3个步骤之后,也永远不会调用 preferredStatusBarStyle .

navigationBarbarStyle 设置为 UIBarStyleBlackTranslucent 将提供白色状态栏文本(即 UIStatusBarStyleLightContent ), UIBarStyleDefault 将提供黑色状态栏文本(即 UIStatusBarStyleDefault ) .

这种方法在iPhone上公平公正,但不适用于iPad .

  • 在plist中将 UIViewControllerBasedStatusBarAppearance 设置为 NO ,然后使用
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

这显然不适用于这种情况,因为我只需要为两个 ViewController 指定不同的状态栏颜色 .

谢谢大家的帮助!

7 回答

  • 12

    对于有 UINavigationController 这个问题的人我可以建议创建一个自定义 UINavigationController 并在其上实现 preferredStatusBarStyle ,如下所示:

    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return [self.topViewController preferredStatusBarStyle];
    }
    

    这样,状态栏样式将是顶视图控制器的样式 . 现在你可以随心所欲地实现视图控制器的 preferredStatusBarStyle .

  • 5

    这是对Groot answer的改进,以UINavigationController的简单类别的形式,而不需要子类UINavigationController .

    Swift

    extension UINavigationController {
        override public func preferredStatusBarStyle() -> UIStatusBarStyle {
            return topViewController?.preferredStatusBarStyle() ?? .Default
        }
    }
    

    Swift 3 & Swift 4

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return topViewController?.preferredStatusBarStyle ?? .default
        }
    }
    

    Objective-C

    @implementation UINavigationController (StatusBarStyle)
    
    - (UIStatusBarStyle)preferredStatusBarStyle 
    {
        return [self.topViewController preferredStatusBarStyle];
    }
    
    @end
    
  • 7

    要为 UINavigationController 堆栈上的每个 UIViewController 单独设置 UIStatusBarStyle ,您必须首先继承 UINavigationController 并覆盖 childViewControllerForStatusBarStyle 方法 .

    在你的UINavigationController子类中添加:

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

    你可以使用 preferredStatusBarStyle 方法将 UIStatusBarStyle 设置为每个 UIViewController 中你想要的任何东西 . 例如:

    -(UIStatusBarStyle)preferredStatusBarStyle {
         return UIStatusBarStyleLightContent;
    }
    
  • -3

    我使用了你提到的第一种方法,我也发现当你使用 UINavigationController 时会有一些错误,它永远不会将 preferredStatusBarStyle 调用传递给它的子视图控制器 . 我所做的是将 UINavigationController 子类化,并覆盖 preferredStatusBarStyle 方法,如下所示:

    @implementation GLBaseNavigationController
    
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        UIViewController *lastViewController = [self.viewControllers lastObject];
        if ([lastViewController respondsToSelector:@selector(preferredStatusBarStyle)]) {
            return [lastViewController preferredStatusBarStyle];
        } else if ([super respondsToSelector:@selector(preferredStatusBarStyle)]) {
            return [super preferredStatusBarStyle];
        }
        return UIStatusBarStyleDefault;
    }
    

    然后每当我需要导航控制器时,我使用 GLBaseNavigationController 而不是 UINavigationController . 对于故事板,您还需要为子类指定导航控制器的类 .

  • -3

    对于您的第一个解决方案,我认为您无法更改viewDidLoad中的状态栏 . 如果您有两个ViewControllers堆叠在一起,并且每个ViewController以不同方式切换状态栏,则该方法仅为每个方法调用一次 . 您真的想要更改 viewWillAppear 中的状态栏,以便每次显示页面时都会调用它 . 我也不认为你可以依赖 preferredStatusBarStyle ,因为我也不确定它被调用的频率/时间 . 这就是你想要的方式:

    - (void) viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        [self.navigationController.navigationBar setBarStyle:UIBarStyleDefault];
    }
    
  • 0

    目前你只能做光明和黑暗 . 改为光明做 .

    • .plist 文件中将 UIViewControllerBasedStatusBarAppearance 设置为 YES .

    • viewDidLoad 方法中 [self setNeedsStatusBarAppearanceUpdate];

    • 添加此方法:

    -(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }

    要将其更改回黑暗,请将 UIStatusBarStyleLightContent 更改为 UIStatusBarStyleDefault

  • 0

    在AppDelegate的didFinishLaunch方法中,设置默认的状态栏样式,例如:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault
                                                    animated:YES];       
        return YES;
    }
    

    然后,在您要更改状态栏的那两个视图控制器中,覆盖以下方法:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated]        
    
        // Here change status bar color
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent
                                                    animated:YES];       
    
    }
    
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear]                
    
        // Here bring back to color, that we set in AppDelegate
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault
                                                    animated:YES];       
    }
    

相关问题