2012-10-29 3 views
2

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

이 코드는 정확히 한번 호출시에 방법을 작동합니다

여기 내 코드입니다. 다음 곡선을 보여줍니다 : Working well

그러나 타이머를 추가하면 redraw 이상한 일이 일어나기 시작합니다. 앱을 시작할 때 위의 그림에 표시된 커브를 얻었지만 즉시이 커브로 바뀝니다 (동일한 커브, x 축을 따라 보이는 것처럼 보입니다. 기술적으로 낮은 쪽). 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); 
} 
+0

나는'[self y : i]'가하고있는 일과'y'가 어디서 왔는지 궁금합니다. – barley

+0

질문 편집으로보기 ... –

+0

죄송하지만 어쩌면 누락되었습니다. '- (void) y : (float) x'의 요점은 무엇입니까? 그것은 변수를 반환하지 않으며 아무 것도 참조로 전달되지 않습니다. 'y'는 인스턴스 변수입니까? 그렇다면'_y' 또는'y_'와 같은 것으로 변경하여 iVar임을 알리는 것이 좋습니다. 다른 곳에서는'y' iVar를 사용하고 있습니까? 위의 코드에서 한 번만 사용 된 것을 볼 수 있습니다.이 경우 iVar로 사용하는 것이 적합하지 않습니다. '[self y : i]'가''float' 값을 반환하도록하십시오. –

답변

1

나는 문제는 당신이 self.view.frame.size에 그래픽 컨텍스트를 설정하는 동안 canvas.frame에 계산을하고있는 것으로 믿고 이제 아마 모두 동일한 크기로 설정되어 있습니다. (나는 알 수있는 방법이 없다) 그러나 어떤 이유로 든 그 크기가 다르다면 루틴의 그래픽 결과에서 '스트레칭'을 설명 할 수있다. .

또한 이상한 코드가 있습니다. 방법을 시작할 때 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의 이미지를 바꾸려면 어쨌든 왜 그러고 싶습니까?

+0

네, 문제였습니다. 고마워요. canvas.image = nil을 사용하여 캔버스를 공백으로 만들었으므로 쿼츠 선이 겹치지 않습니다. 더 쉽고/더/더 효율적인 방법이 있습니까? –

+0

'canvas'가 UIImageView라고 가정하면, 그래픽 컨텍스트에서 얻은 새로운 이미지에'canvas.image'를 설정하기 만하면, 먼저'nil'으로 설정할 필요가 없습니다. 'UIGraphicsBeginImageContext'를 호출하면 새로운 빈 그래픽 컨텍스트를 만들 수 있습니다. 따라서 컨텍스트에서 그릴 내용은 새 것이됩니다 (겹침이 없음). –