绘制,清除然后重绘问题石英

时间:2012-10-29 19:05:53

标签: iphone ios drawing quartz-graphics quartz-core

我试图在iPhone上绘制图形,但我希望图表能够快速更新,所以我真正想做的是将图形绘制到UIImageView,然后重复绘制方法,清除旧图纸并重新绘制。

这是我的代码:

- (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();
}

此代码在调用一次时完全符合我的要求。它显示以下曲线: Working well

但是当我向redraw添加计时器时,会发生奇怪的事情。当应用程序启动时,我得到上面图片中显示的曲线,但随后它立即转变为此曲线(相同的曲线,沿x轴看似更加拉伸,在y轴上更高(技术上更低): enter image description here

- (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);
}

1 个答案:

答案 0 :(得分:1)

我相信问题是,当您将图形上下文设置为canvas.frame时,您正在self.view.frame.size上进行计算。现在也许两者都设置为完全相同的尺寸(我无法知道)但是,如果由于某种原因,这些尺寸不同,它可以解释&#39;拉伸&#39;在你日常的图形结果中。

另外,你有一些奇怪的代码。在方法的开头,您可以调用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&#39,为什么还要这样? ; s图像)。