美文网首页
iOS13关于状态栏在横屏模式下隐藏的解决办法

iOS13关于状态栏在横屏模式下隐藏的解决办法

作者: HuyaRC | 来源:发表于2019-12-12 15:53 被阅读0次

    在iOS13更新后,测试小伙伴反馈视频播放时,在横屏模式下看不到状态栏的信息了。虽然不知道为什么苹果爸爸要这样,但是这样真心不方便用户!!!直到前段时间看一个直播的App,居然发现在横屏下状态栏显示了时间和电池电量,以为恢复了。
    然而并没有,了解了当下一些主流的有视频播放的App,状态栏都是自家添加的,你会发现各家基本上都不太一样。但都有共同点:时间+电池。

    笔者也简单弄了下:


    statusBar .png
    时间

    首先是时间,一般手机有两个时制:12H制和24H制。两者在显示下有些许差异,比如下午3点,12H下显示:下午 3:00,而在24H下就显示:15:00,就需要判断当前的时间是12H还是24H的。这也简单就是输出当前时间,判断是否包含AM或PM,12H制下会输出:3:00 PM,24H制下会输出:15:00
    判断时制:

    - (BOOL)is24H{
        if(!_is24H){
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setLocale:[NSLocale currentLocale]];
            [formatter setDateStyle:NSDateFormatterNoStyle];
            [formatter setTimeStyle:NSDateFormatterShortStyle];
            NSString *dateString = [formatter stringFromDate:[NSDate date]];
            NSRange amRange = [dateString rangeOfString:[formatter AMSymbol]];
            NSRange pmRange = [dateString rangeOfString:[formatter PMSymbol]];
            _is24H = (amRange.location == NSNotFound && pmRange.location == NSNotFound);
        }
        return _is24H;
    }
    

    如果你还想监听用户在手机系统设置中切换时制,可以加入这个通知

    UIKIT_EXTERN NSString *const UIApplicationSignificantTimeChangeNotification;
    

    后面可以写一个定时器来是定时更新当前显示的时间信息,但其实有个取巧的办法:因为一般横屏情况下,这个顶部工具条在显示一段时间(这个时间可能只有几秒)后自动动画隐藏,用户手动触发才会再次显示,所以只需要在这个顶部工具条需要显示的时候再去更新时间信息,就避免了定时器占内存了。某上市直播App就是这么干的。

    电池

    电池有两个信息,一个是电量,还有一个就是电池状态:是否处于低电量状态(小于或等于20%);是否开启了低电量模式(前者电池是红色,后者是黄色);是否正在充电(电池是绿色,且显示小闪电的正常充电图标)。

    我们可以通过 batteryState 来获取电池状态,通过 batteryLevel来获取电池电量信息。值得一提的是,在获取电池信息之前,需要手动设置 batteryMonitoringEnabled 为 YES,不然batterystate 会返回 Unkonw。

    [UIDevice currentDevice].batteryMonitoringEnabled = YES;
    
    ///获取电池电量
     NSLog(@"电池电量:%.2f", [UIDevice currentDevice].batteryLevel);
    
    ///获取电池状态
    NSLog(@"电池状态 = %ld",[UIDevice currentDevice].batteryState);
    

    电池的状态有以下几种:

    UIDeviceBatteryStateUnknown   /// 未知状态
    UIDeviceBatteryStateUnplugged   /// 未充电
    UIDeviceBatteryStateCharging   /// 正在充电(少于100%电量)
    UIDeviceBatteryStateFull   /// 电池已充满(未拔出)
    

    注意:获取的电池电量可能与系统显示电量的存在1%的差异,实际上我们很难获取准确的数据,至少笔者暂时还没找到,包括笔者也用了runtime来读取状态栏的私有变量。某上市直播App就经常存在这种差异,而B站和一些大厂为了避免这个问题,干脆不显示电池具体的百分数,只显示对应比例的电量

    此外我们还需判断用户是否开启低电量模式:

    // 是否开启低电量模式
    NSLog(@"是否开启低电量模式 = %d",[NSProcessInfo processInfo].lowPowerModeEnabled);
    

    我们还可以用一下通知来监听电池电量的和电池状态的变化

    UIKIT_EXTERN NSString *const UIDeviceBatteryLevelDidChangeNotification;  ///电池电量变化
    UIKIT_EXTERN NSString *const UIDeviceBatteryStateDidChangeNotification;  ///电池状态变化
    

    其中,要发送此通知,必须将isBatteryMonitoringEnabled属性设置为true。
    电池电量变化的通知发送频率不超过每分钟一次。不要试图计算电池放电率或电池剩余时间;放电率可能会根据内置应用程序和您的应用程序而频繁更改。

    当我们检测低电量模式的时候,需要注意以下两点:
    低电量模式仅支持 iOS 9 。当 App 需要兼容更早的版本时,先检查api的可用性。
    低电量模式仅适用于 iPhone ,在 iPad 中,isLowPowerModeEnabled 的返回值始终为 NO
    当我们检测到用户开启了低电量模式,可以为用户做一些小改变,来帮助用户延长电池续航。以下是 Apple 给出一些建议:
    • 停止使用定位服务
    • 减弱动画效果
    • 停止后台任务(比如网络请求)
    • 禁用运动追踪


    最后是自己写的简单的demo : RCStatusBar

    相关文章

      网友评论

          本文标题:iOS13关于状态栏在横屏模式下隐藏的解决办法

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