2011-04-01 86 views
0

我想绘制一条线(在iphone上),这样我就可以查看每个正在绘制的像素。如何使用对象绘制一个像素逐像素C

我目前使用定时器调用drawRect方法。

以下是我在哪里使用绘制从数组的值的波的代码:

static int i=0; 
int x = 10; 
int y = 0; 
int x2; 
int y2; 

- (void)drawRect:(CGRect)rect 
{ 
// Drawing code. 
CGContextRef c = UIGraphicsGetCurrentContext(); 

CGFloat black[4] = {0.0f,0.0f,0.0f,1.0f}; 
CGContextSetStrokeColor(c, black); 
CGContextBeginPath(c); 
NSLog(@"fired..."); 
int ecg[358] = {36, 37, 37, 36, 34, 33, 33, .... ,36}; //Assume the data is there 

CGContextMoveToPoint(c, x, y); 

x2 = i; 
y2 = ecg[i]; 
CGContextAddLineToPoint(c, x2, y2); 
x = x2; 
y = y2; 

CGContextStrokePath(c); 
[self setNeedsDisplay]; 
i++; 
} 

- (void) awakeFromNib 
{ 
NSTimer *timer; 
timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(drawRect:) userInfo:nil repeats:YES]; 
} 

我只能看到在一次一行被拉伸时的drawRect被调用。但我没有看到整个图像。我想不出一种不同的方法来看到屏幕上正在绘制的波浪。

此外,initWithFrame方法永远不会被调用,所以不得不与awakeFromNib一起去声明计时器,如果我错了,请纠正我。

任何指向动画线条图的指针都会有所帮助。

谢谢

+2

每次调用drawRect时,都会清除上下文。所以你必须重新绘制一切到你想要的点。 – DarkDust 2011-04-01 14:03:31

+0

@DarkDust:是的,我明白了,你能为此提出一种不同的方法吗? – R3D3vil 2011-04-01 14:22:51

回答

2

只是重新绘制的东西了到如此地步,你想,这样的:

for (int j = 0; j <= i; j++) { 
     x2 = j; 
     y2 = ecg[j]; 
     CGContextAddLineToPoint(c, x2, y2); 
     x = x2; 
     y = y2; 
    } 

    CGContextStrokePath(c); 

不要在您的drawRect:称之为setNeedsDisplay:,它会导致视图中随即重绘一遍又一遍地。另外,尽量避免全局变量。例如,这里不需要“缓存”x,x2,y和y2。在drawRect:内定义它们。

+0

@DarkDust:通过这样做,它只会画出我的第一行。在循环外部调用CGContextStrokePath(c)将一次绘制波形。我想看到正在吸引的浪潮。所以我认为setNeedsDisplay是必需的,但不知道在哪里。 – R3D3vil 2011-04-01 14:53:14

+0

@Nisarg:你说的对,需要在循环之外完成。至于“我想看到它被绘制”:只需设置一个定时器,定时器会在定时器回调你的调用'[myView setNeedsDisplay]'。事实上,这是'i'应该增加的地方(请给它一个更具描述性的名字;-) – DarkDust 2011-04-01 14:55:50

+0

@DarkDust:我的计时器正在调用drawRect。我不熟悉目标C,也不知道如何从计时器调用[self setNeedsDisplay]。 – R3D3vil 2011-04-01 15:14:52