2013-01-06 2 views
0

저는 CoreGraphics와 drawRect를 사용하여 기어 휠을 그립니다. 나는 단계를 통해 전진 기어에 단추를 사용 :forcing setNeedsDisplay

- (IBAction를가) advanceButtonPressed (ID) 보낸 사람을 {

stage=stage+1; 

if (stage==4) stage=0; 

[self setNeedsDisplay]; 

}

기어를 그리기위한 루틴의 drawRect이며, gear teeth는 drawRect로 전달되는 stage의 값에 따라 새로운 위치에 그려집니다. 단추를 누를 때마다 하나씩 4 단계로 기어가 새로운 위치 (원 주위의 한 세그먼트)로 바뀝니다.

buttonPressed 루틴을 루프의 4 단계로 변경하여 프레스 만하면됩니다 버튼을 한 번,하지만이 작동하지 않습니다

- (IBAction를)의 buttonPressed (ID) 보낸 사람을 {

for (stage=0;stage<4;stage++){ 

    NSLog(@"%i",stage); 

[self setNeedsDisplay]; 
} 

은}

내 NSLog는 그 단계가 바로 그 네 개의 값을 통과 보여줍니다 그것은 이전의 일상에서와 마찬가지입니다. 그러나 setNeedsDisplay는 단 한 번만 실행되므로 (drawRect의 NSLog 추적처럼) 기어가 최종 위치에 표시되지만 중간 단계에는 표시되지 않습니다. setNeedsDisplay는 버튼 루틴이 루프 안에 있음에도 불구하고 완료 될 때만 실행됩니다.

강제로 실행할 수있는 방법이 있습니까?

답변

2

아이폰은 상관없이 setNeedsDisplay를 호출하는 빈도 화면을 두 번째 60 배를 업데이트하지 않습니다. 루프는 1/60th 초 이내에 실행됩니다. 그래서 마지막 상태 만 보게됩니다.

버튼을 눌러 네 상태를 모두 표시하려면 타이머 또는 performSelector: afterDelay을 사용하여 네 가지 상태를 모두 표시 할 수 있습니다. 좀 더 복잡하지만 거기에 당신이 간다.

+3

화면 새로 고침 빈도는 중요하지 않습니다. 이 메소드가 반환 될 때까지 실제로 표시되지 않는 이유는 그것이 코코아 및 코코아 터치에서 드로잉이 작동하는 방식이기 때문입니다. 루프에 걸리는 시간은 중요하지 않습니다. 1 분이 걸릴지라도 코드가 실행 루프로 제어를 반환 할 때까지는 그리기가 수행되지 않습니다. http://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW10 –

+0

타이머가 잘 작동했습니다. 제안에 감사드립니다.-Rob –

-2

setNeedsDisplay를 호출하면 다음 드로잉주기에 뷰가 다시 그려집니다. 당신의 방법 중에을 다시 그릴

, 당신은 명시 적으로의 drawRect 호출 할 수

+0

명시 적으로'drawRect :'를 호출해서는 안됩니다. [문서] (http://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html#//apple_ref/doc/uid/TP40010156-CH14-SW3)는 이에 대해 조언합니다. , 허용 된 경우에도 이렇게하면 사용자의 배터리 시간을 낭비하게됩니다. 올바른 해결책은 skinnyTOD가 제안한 것입니다. 각 상태를 차례대로 보여주는 타이머를 사용하여 시스템에'drawRect :'를 호출하고 사용자가 변경 사항을 볼 수있는 기회를 제공하십시오. –

관련 문제