You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
6.3 KiB
217 lines
6.3 KiB
4 years ago
|
//
|
||
|
// DPBatteryView.m
|
||
|
// WXReader
|
||
|
//
|
||
|
// Created by Andrew on 2018/6/10.
|
||
|
// Copyright © 2018年 Andrew. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#import "WXYZ_BatteryView.h"
|
||
|
|
||
|
typedef enum : NSUInteger {
|
||
|
WXBatteryStateColorNormal,
|
||
|
WXBatteryStateColorCharging,
|
||
|
WXBatteryStateColorWarning,
|
||
|
} WXBatteryStateColor;
|
||
|
|
||
|
@interface WXYZ_BatteryView ()
|
||
|
{
|
||
|
UIView *batteryView;
|
||
|
UILabel *batteryLabel;
|
||
|
CAShapeLayer *batteryLayer;
|
||
|
CAShapeLayer *layer2;
|
||
|
|
||
|
CGFloat w;
|
||
|
CGFloat lineW;
|
||
|
NSTimer *time;
|
||
|
}
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation WXYZ_BatteryView
|
||
|
|
||
|
- (instancetype)initWithFrame:(CGRect)frame
|
||
|
{
|
||
|
if (self = [super initWithFrame:frame]) {
|
||
|
[self initialize];
|
||
|
[self createSubViews];
|
||
|
[self batteryLevelChanged];
|
||
|
[self updateTime];
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)initialize
|
||
|
{
|
||
|
UIDevice *device = [UIDevice currentDevice];
|
||
|
device.batteryMonitoringEnabled = YES;
|
||
|
|
||
|
WS(weakSelf)
|
||
|
[[NSNotificationCenter defaultCenter]
|
||
|
addObserverForName:UIDeviceBatteryLevelDidChangeNotification
|
||
|
object:nil queue:[NSOperationQueue mainQueue]
|
||
|
usingBlock:^(NSNotification *notification) {
|
||
|
[weakSelf batteryLevelChanged];
|
||
|
}];
|
||
|
|
||
|
[[NSNotificationCenter defaultCenter]
|
||
|
addObserverForName:UIDeviceBatteryStateDidChangeNotification
|
||
|
object:nil queue:[NSOperationQueue mainQueue]
|
||
|
usingBlock:^(NSNotification *notification) {
|
||
|
[weakSelf batteryStateChanged];
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
- (void)createSubViews
|
||
|
{
|
||
|
//电池的宽度
|
||
|
w = 25;
|
||
|
//电池的x的坐标
|
||
|
CGFloat x = 0;
|
||
|
//电池的y的坐标
|
||
|
CGFloat y = self.height / 2 - 5;
|
||
|
//电池的线宽
|
||
|
lineW = 1;
|
||
|
//电池的高度
|
||
|
CGFloat h = 10;
|
||
|
|
||
|
//画电池
|
||
|
UIBezierPath *path1 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(x, y, w, h) cornerRadius:2];
|
||
|
batteryLayer = [CAShapeLayer layer];
|
||
|
batteryLayer.lineWidth = lineW;
|
||
|
batteryLayer.strokeColor = [UIColor grayColor].CGColor;
|
||
|
batteryLayer.fillColor = [UIColor clearColor].CGColor;
|
||
|
batteryLayer.path = [path1 CGPath];
|
||
|
[self.layer addSublayer:batteryLayer];
|
||
|
|
||
|
UIBezierPath *path2 = [UIBezierPath bezierPath];
|
||
|
[path2 moveToPoint:CGPointMake(x+w+1, y+h/3)];
|
||
|
[path2 addLineToPoint:CGPointMake(x+w+1, y+h*2/3)];
|
||
|
layer2 = [CAShapeLayer layer];
|
||
|
layer2.lineWidth = 2;
|
||
|
layer2.strokeColor = [UIColor grayColor].CGColor;
|
||
|
layer2.fillColor = [UIColor clearColor].CGColor;
|
||
|
layer2.path = [path2 CGPath];
|
||
|
[self.layer addSublayer:layer2];
|
||
|
|
||
|
//绘制进度
|
||
|
batteryView = [[UIView alloc] initWithFrame:CGRectMake(x + 1,y + lineW, 0, h - lineW * 2)];
|
||
|
batteryView.layer.cornerRadius = 1;
|
||
|
[self addSubview:batteryView];
|
||
|
|
||
|
batteryLabel = [[UILabel alloc] initWithFrame:CGRectMake(x + w + 5, y, 80, h)];
|
||
|
batteryLabel.textColor = [UIColor grayColor];
|
||
|
batteryLabel.textAlignment = NSTextAlignmentLeft;
|
||
|
batteryLabel.font = kFont10;
|
||
|
[self addSubview:batteryLabel];
|
||
|
|
||
|
time = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTime) userInfo:nil repeats:YES];
|
||
|
}
|
||
|
|
||
|
- (void)updateTime
|
||
|
{
|
||
|
//获取当前时间
|
||
|
NSDate *now = [NSDate date];
|
||
|
|
||
|
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||
|
NSCalendarUnit unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
|
||
|
NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:now];
|
||
|
|
||
|
NSInteger hour = [dateComponent hour];
|
||
|
NSInteger minute = [dateComponent minute];
|
||
|
|
||
|
if (hour < 10 && minute < 10) {
|
||
|
batteryLabel.text = [NSString stringWithFormat:@"0%d:0%d",(int)hour, (int)minute];
|
||
|
} else if (hour < 10) {
|
||
|
batteryLabel.text = [NSString stringWithFormat:@"0%d:%d",(int)hour, (int)minute];
|
||
|
} else if (minute < 10) {
|
||
|
batteryLabel.text = [NSString stringWithFormat:@"%d:0%d",(int)hour, (int)minute];
|
||
|
} else {
|
||
|
batteryLabel.text = [NSString stringWithFormat:@"%d:%d",(int)hour, (int)minute];
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// 电池剩余比例
|
||
|
- (void)batteryLevelChanged
|
||
|
{
|
||
|
UIDevice *device = [UIDevice currentDevice];
|
||
|
device.batteryMonitoringEnabled = YES;
|
||
|
|
||
|
float batteryLevel = [device batteryLevel] * 100;
|
||
|
|
||
|
if (batteryLevel < 0) {
|
||
|
batteryLevel = 0;
|
||
|
} else if (batteryLevel > 100){
|
||
|
batteryLevel = 100;
|
||
|
}
|
||
|
|
||
|
if (batteryLevel <= 10) {
|
||
|
[self changeBatteryState:WXBatteryStateColorWarning];
|
||
|
} else {
|
||
|
[self changeBatteryState:WXBatteryStateColorNormal];
|
||
|
}
|
||
|
|
||
|
CGRect frame = batteryView.frame;
|
||
|
frame.size.width = (batteryLevel * (w - lineW * 2)) / 100;
|
||
|
batteryView.frame = frame;
|
||
|
}
|
||
|
|
||
|
- (void)batteryStateChanged
|
||
|
{
|
||
|
switch ([[UIDevice currentDevice] batteryState]) {
|
||
|
case 0: // 未开启监视电池状态
|
||
|
[self changeBatteryState:WXBatteryStateColorNormal];
|
||
|
break;
|
||
|
case 1: // 电池未充电状态
|
||
|
[self changeBatteryState:WXBatteryStateColorNormal];
|
||
|
break;
|
||
|
case 2: // 电池充电状态
|
||
|
[self changeBatteryState:WXBatteryStateColorCharging];
|
||
|
break;
|
||
|
case 3: // 电池充电完成
|
||
|
[self changeBatteryState:WXBatteryStateColorCharging];
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void)changeBatteryState:(WXBatteryStateColor)batteryState
|
||
|
{
|
||
|
switch (batteryState) {
|
||
|
case WXBatteryStateColorNormal:
|
||
|
batteryView.backgroundColor = kColorRGBA(131, 131, 131, 1);
|
||
|
break;
|
||
|
case WXBatteryStateColorCharging:
|
||
|
batteryView.backgroundColor = kColorRGBA(75, 216, 102, 1);
|
||
|
break;
|
||
|
case WXBatteryStateColorWarning:
|
||
|
batteryView.backgroundColor = kColorRGBA(252, 62, 46, 1);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void)setBatteryTintColor:(UIColor *)batteryTintColor
|
||
|
{
|
||
|
batteryLayer.strokeColor = batteryTintColor.CGColor;
|
||
|
layer2.strokeColor = batteryTintColor.CGColor;
|
||
|
batteryLabel.textColor = batteryTintColor;
|
||
|
|
||
|
if ([UIDevice currentDevice].batteryState == UIDeviceBatteryStateCharging || [UIDevice currentDevice].batteryState == UIDeviceBatteryStateFull) {
|
||
|
[self changeBatteryState:WXBatteryStateColorCharging];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- (void)dealloc
|
||
|
{
|
||
|
[time invalidate];
|
||
|
time = nil;
|
||
|
}
|
||
|
|
||
|
@end
|