我试图在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();
}
此代码在调用一次时完全符合我的要求。它显示以下曲线:
但是当我向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);
}
答案 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图像)。