美文网首页
iOS 状态栏

iOS 状态栏

作者: sinno | 来源:发表于2018-09-01 00:25 被阅读16次

    1.什么是状态栏?

    iOS顶部的那一条显示网络、信号、电池等手机状态信息的一栏就是状态栏。


    image.png

    2.如何获取状态栏的高度

    // 这行代码可以获取到状态栏高度,但是要注意如果当前状态栏是隐藏状态,此方法返回CGRectZero
    // 官方注释:The frame rectangle defining the area of the status bar.
    // The value of this property is CGRectZero if the status bar is hidden.
    CGRect statusBarRect = [UIApplication sharedApplication].statusBarFrame;
    

    一般来说,除iPhoneX外,其他iPhone手机的状态栏高度都是20。
    iPhoneX的状态高度是44。


    image.png

    但是在某些条件下--比如在分享热点、后台定位、通话状态等情况下状态栏下会多变成蓝色同时高度增加20变为40(iPhoneX以外的手机)或64(iPhoneX)


    image.png

    3. 状态栏的控制

    其实状态栏能够做的控制不多:
    1.显示或隐藏
    2.状态栏信息颜色(黑、白)
    其中对状态栏的控制按时间来分又分为
    1.应用启动期间的控制
    2.应用运行期间的控制

    3.1 应用启动期间:

    用户点击app>显示启动页->应用完全启动,姑且称之为启动页时间吧。
    这一段时间我们的代码无法执行,在这段时间的状态栏样式由Info.plist决定。

    我们可以通过target->General->Deployment Info来修改我们的应用启动时的样式


    image.png

    对应的info.plist:


    Info.plist - Source Code Info.plist - Property List

    关于这两个key值在官方文档是这样说的:
    https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW10

    image.png
    3.2 应用运行期间

    应用运行期间的状态栏要控制其实要分两种情况:
    1.基于UIApplication控制
    2.基于UIViewController控制

    具体是哪种情况是由info.plist决定:


    image.png

    苹果官方文档描述:

    UIViewControllerBasedStatusBarAppearance

    UIViewControllerBasedStatusBarAppearance (Boolean - iOS) Specifies whether the status bar appearance is based on the style preferred by the view controller that is currently under the status bar. When this key is not present or its value is set to YES, the view controller determines the status bar style. When the key is set to NO, view controllers (or the app) must each set the status bar style explicitly using the [UIApplication](https://developer.apple.com/documentation/uikit/uiapplication) object.
    This key is supported in iOS 7.0 and later.

    3.2.1 基于UIApplication

    设置状态栏的代码很简单:

    // 设置导航栏显示(NO)/隐藏(YES)
    [UIApplication sharedApplication].statusBarHidden = YES;
    // 显示导航栏样式为黑色(UIStatusBarStyleDefault)/白色(UIStatusBarStyleLightContent)
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    

    这种方式特点是:每次修改都是影响全局的状态栏。app当前状态栏样式以最后的修改为准。
    如果你的app的导航栏是由控制器控制的,调用这两个方法是没有任何用的。


    image.png
    3.2.2 基于UIViewController
    // 默认实现是返回 UIStatusBarStyleDefault,即状态栏信息黑色;
    - (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
    // 在竖屏状态下默认实现是返回NO,即显示状态栏;
    // 在横屏的状态下默认实现是返回YES,即隐藏状态
    - (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; 
    
    

    可以在控制器中重写以上两个方法来控制在本控制器中状态栏的样式。
    如果在本控制器显示后状态栏需要进行修改,你可以调用setNeedsStatusBarAppearanceUpdate方法告诉系统状态栏样式需要更新,这样系统就会再次调用上面两个回调来更新到最新样式。

    // This should be called whenever the return values 
    //for the view controller's status bar attributes have changed.
     //If it is called from within an animation block, 
    //the changes will be animated along with the rest of the animation block.
    - (void)setNeedsStatusBarAppearanceUpdate NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
    

    如果你的控制器是某个控制器(比如UINavigationController、UITabBarController)的子控制器,那么你的控制器的这两个方法在默认的情况下不会被调用,你必须得重写父控制器的以下方法来使其调用子控制的状态栏设置方法:


    image.png

    比如UINavigationController可以这样重写:

    
    -(UIViewController*)childViewControllerForStatusBarStyle{
        return self.topViewController;// 让最上层的控制器来决定状态栏的样式
    }
    
    -(UIViewController*)childViewControllerForStatusBarHidden{
        return self.topViewController;// 让最上层的控制器来决定状态栏是否隐藏
    }
    
    image.png

    相关文章

      网友评论

          本文标题:iOS 状态栏

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