在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
网友评论