iPhone에서 그래프를 그려보고 싶습니다만, 그래프를 빠르게 업데이트하고 싶습니다. 그리하여 실제로 그래프를 그릴 때 UIImageView
으로 그려야합니다. 그러면 그릴 때 방법이 반복되면 이전 도면을 지우고 다시 그립니다.Draw, Clear, Redraw 문제 Quartz
- (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 축을 따라 보이는 것처럼 보입니다. 기술적으로 낮은 쪽).
그리고 :
- (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);
}
나는'[self y : i]'가하고있는 일과'y'가 어디서 왔는지 궁금합니다. – barley
질문 편집으로보기 ... –
죄송하지만 어쩌면 누락되었습니다. '- (void) y : (float) x'의 요점은 무엇입니까? 그것은 변수를 반환하지 않으며 아무 것도 참조로 전달되지 않습니다. 'y'는 인스턴스 변수입니까? 그렇다면'_y' 또는'y_'와 같은 것으로 변경하여 iVar임을 알리는 것이 좋습니다. 다른 곳에서는'y' iVar를 사용하고 있습니까? 위의 코드에서 한 번만 사용 된 것을 볼 수 있습니다.이 경우 iVar로 사용하는 것이 적합하지 않습니다. '[self y : i]'가''float' 값을 반환하도록하십시오. –