2011-04-01 41 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