首页 > 代码库 > IOS使用CGContextRef动态画折线图

IOS使用CGContextRef动态画折线图

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    CGContextSetLineWidth(context, _lineWidth);                                 //设置画笔宽度
    CGContextSetFillColorWithColor(context, [[self backgroundColor] CGColor]);  //设置背景填充颜色
    CGContextFillRect(context, rect);                                           //填充背景
    
    CGContextSetStrokeColorWithColor(context, _lineColor.CGColor);              //设置画笔颜色
    
    //arr 为实时获取的动态数据数组
    for (int i = 0; i < _arr.count; i ++) {
        if (i < _arr.count - 1) {
            CGPoint pp[2];
            [_arr[i] getBytes:&pp[0] length:sizeof(CGPoint)];
            [_arr[i+1] getBytes:&pp[1] length:sizeof(CGPoint)];
            
            CGContextMoveToPoint(context, pp[0].x, pp[0].y);
            CGContextAddLineToPoint(context, pp[1].x, pp[1].y);
            CGContextStrokePath(context);
        }
    }
}

- (void)addDataToArr:(CGFloat)data {
    if (!_arr)
        _arr = [[NSMutableArray alloc] init];
    
    CGPoint point;
    //MAX_X_COUNT表示在X轴上显示的最大个数,超过后则X轴向左移动,每次移动一个单位
    if (_arr.count >= MAX_X_COUNT) {
        //移动x轴
        CGRect frame = self.frame;
        frame.origin.x -= (self.frame.size.width / MAX_X_COUNT);
        frame.size.width += (self.frame.size.width / MAX_X_COUNT);
        self.frame = frame;
    }
    point.x = _arr.count * (self.frame.size.width / MAX_X_COUNT);
    
    //如果当前值大于Y轴所代表的最大值,则将Y轴最大值扩大为当前值的2倍
    if (data > _maxYPower) {        //改变y的最大值为currentPower
        _maxYPower = data * 2;
    }
    point.y = data;
    
    //将实时获取的数据存入_arr中
    [_arr addObject:[NSData dataWithBytes:&point length:sizeof(CGPoint)]];
}
只需动态调用addDataToArr:后再调用[self.view setNeedDisplay]即可

IOS使用CGContextRef动态画折线图