美文网首页
iOS 绘制电池获取系统电量

iOS 绘制电池获取系统电量

作者: 杪夏荷月 | 来源:发表于2017-09-02 11:09 被阅读215次

    前言

    公司的一款新产品要求自己画一个电池并调用,搜索了一下发现画电池和调用的部分基本都是分开的,东西不算难,整理一下方便同行使用,菜鸟一枚,如有不对的地方欢迎指正.

    一 如何使用

    使用方式比较简单,首先要引用两个文件

    import "IOPSKeys.h"

    import "IOPowerSources.h"

    只要定义一个View就可以了,电池大小根据需求

    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        self.batteryView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 30, 15)];
    
        [self drawBattery:self.batteryView];
    
        [self.view addSubview:self.batteryView];
    
    }
    

    下面的部分复制可用,也可根据自己的习惯改写.

    二 Bezier曲线画电池

    - (void)drawBattery: (UIView *)view {
    
    //绘制电池
    
        UIBezierPath *path1 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, view.frame.size.width * 49 / 50, view.frame.size.height) cornerRadius:2];
    
        CAShapeLayer *batteryLayer = [CAShapeLayer layer];
    
        batteryLayer.lineWidth = 1;
    
        batteryLayer.strokeColor = [UIColor blackColor].CGColor;
    
        batteryLayer.fillColor = [UIColor whiteColor].CGColor;
    
        batteryLayer.path = [path1 CGPath];
    
        [view.layer addSublayer:batteryLayer];
    
        UIBezierPath *path2 = [UIBezierPath bezierPath];
    
        [path2 moveToPoint:CGPointMake(view.frame.size.width * 49 / 50 + 1, view.frame.size.height / 3)];
    
        [path2 addLineToPoint:CGPointMake(view.frame.size.width * 49 / 50 + 1, view.frame.size.height * 2 / 3)];
    
        CAShapeLayer *layer2 = [CAShapeLayer layer];
    
        layer2.lineWidth = view.frame.size.width / 50;
    
        layer2.strokeColor = [UIColor blackColor].CGColor;
    
        layer2.fillColor = [UIColor blackColor].CGColor;
    
        layer2.path = [path2 CGPath];
    
        [view.layer addSublayer:layer2];
    
        //绘制电量
    
        UIView *eleView = [[UIView alloc] initWithFrame:CGRectMake(1, 1, 0, view.frame.size.height - 2)];
    
        eleView.layer.cornerRadius = 2;
    
        NSInteger ele = [self getCurrentBatteryLevel];
    
        if (ele <= 20) {
    
            eleView.backgroundColor = [UIColor redColor];
    
        } else {
    
            eleView.backgroundColor = [UIColor greenColor];
    
        }
    
        [view addSubview:eleView];
    
        //绘制数字电量
    
        UILabel *eleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, view.frame.size.width, self.batteryView.frame.size.height)];
    
        eleLabel.backgroundColor = [UIColor clearColor];
    
        eleLabel.font = [UIFont systemFontOfSize:12];
    
        eleLabel.textAlignment = NSTextAlignmentCenter;
    
        eleLabel.text = [NSString stringWithFormat:@"%ld%@", (long)ele, @"%"];
    
        [view addSubview:eleLabel];
    
        [self runProgress:view.frame.size.width * 49 / 5000 * ele - 2 view:eleView];//bleBattery为电池电量
    
    }
    

    三 调用系统电量

    - (NSInteger)getCurrentBatteryLevel {
    
        CFTypeRef blob = IOPSCopyPowerSourcesInfo();
    
        CFArrayRef sources = IOPSCopyPowerSourcesList(blob);
    
        CFDictionaryRef pSource = NULL;
    
        const void *psValue;
    
        NSInteger numOfSources = CFArrayGetCount(sources);
    
        if (numOfSources == 0) {
    
        NSLog(@"Error in CFArrayGetCount");
    
        return -1.0f;
    
    }
    
        int curCapacity = 0;
    
        for (int i = 0 ; i < numOfSources ; i++) {
    
            //Returns a CFDictionary with readable information about the specific power source.
    
            pSource = IOPSGetPowerSourceDescription(blob, CFArrayGetValueAtIndex(sources, i));
    
            if (!pSource) {
    
                NSLog(@"Error in IOPSGetPowerSourceDescription");
    
                return -1.0f;
    
            }
    
            psValue = (CFStringRef)CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey));
    
            int curCapacity = 0;
    
            int maxCapacity = 0;
    
            double percent;
    
            psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey));
    
            CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);
    
            psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey));
    
            CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);
    
            percent = ((double)curCapacity/(double)maxCapacity * 100.0f);
    
        }
    
        return -curCapacity;
    
    }
    

    四 填充电量

    - (void)runProgress:(NSInteger)progressValue view:(UIView *)view {
    
    [UIView animateWithDuration:1 animations:^{
    
    CGRect frame = view.frame;
    
    frame.size.width = progressValue;
    
    view.frame = frame;
    
    }];
    
    }
    

    五 引用库

    需要引用库IOKit.可以自己下载或者加QQ:346991576备注IOKit发给你

    相关文章

      网友评论

          本文标题:iOS 绘制电池获取系统电量

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