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]即可