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

在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

分类:
iOS
标签: