2

iPhoneでグラフを描こうとしているのですが、グラフの更新を早くしたいので、どうしてもやりたいのはグラフをaUIImageViewに描画してから、drawメソッドを繰り返したら古い描画をクリアして再描画することです.

これが私のコードです:

- (void)redraw {
    canvas.image = nil;

    UIGraphicsBeginImageContext(self.view.frame.size);
    [canvas.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 1.0, 0.0, 0.0, 1.0);
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 0, canvas.frame.size.height/2);
    for (float i=0; i<500; i+=0.01) {
        [self y:i];
        CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), ((i*200)-200), (y*200)+canvas.frame.size.height/2);
    }
    CGContextStrokePath(UIGraphicsGetCurrentContext());
    canvas.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

このコードは、一度呼び出されたときに希望どおりに機能します。次の曲線を示します。 よく働く

しかし、タイマーを追加すると、redraw奇妙なことが起こり始めます。アプリの起動時に上の図に示されている曲線が表示されますが、すぐにこの曲線に変わります (同じ曲線で、x 軸に沿ってより伸び、y 軸に沿って上に (技術的には下に) 伸びているように見えます): ここに画像の説明を入力

と:

- (void)y:(float)x {
    y = sin(x - 1)*pow((x - 1), 0.5)*cos(2*(x - 1))*sin(0.5*(x - 1))*cos(x - 1)*sin(2*(x - 1))*pow(cos(x-1), -1);
}
4

1 に答える 1

1

問題はcanvas.frame、Graphics Context を に設定しているときに計算を行っていることだと思いますself.view.frame.size。現在、両方がまったく同じサイズに設定されている可能性があります (私にはわかりません) が、何らかの理由でこれらのサイズが異なる場合、ルーチンのグラフィック結果の「ストレッチ」が原因である可能性があります。

また、いくつかの奇妙なコードがあります。メソッドの先頭で を呼び出しますcanvas.image = nil;。しかし、後で (3 行下で) を呼び出します[canvas.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];canvas.imageが単に nil に設定されている場合、画像はありません(また、 の画像drawInRectを置き換えようとしているのに、なぜそうしたいのでしょうかcanvas)。

于 2012-10-30T11:28:24.953 に答える