2011-08-18 3 views
0

회전하는 본문 애니메이션이있는 iOS 앱을 사용하고 있습니다. 일련의 UIImages는 NSArray에 저장되고 변수는 현재 이미지의 인덱스를 추적합니다.UIImage의 반복 업데이트가 화면에 표시되지 않습니다.

다음 방법은 지금까지 내가 터치 이벤트에 대한 응답으로 방법이라고 한 개까지있는 UIImageView

- (void)renewImage{ 
    [rotatingBody.image release]; 
    rotatingBody.image = [[UIImage alloc] initWithContentsOfFile:[currentPerson.imageArray objectAtIndex:pictureIndex]]; 
} 

를 업데이트합니다. touch 이벤트에서 새 pictureIndex를 계산 한 다음 [self renewImage]를 호출합니다. 그것은 완벽하게 작동합니다.

그러나 애니메이션에 운동량을 추가하고 싶습니다. 바로 다음 이미지를 계산하는 대신 속도를 계산합니다. 속도 변수를 사용하여 pictureIndex를 업데이트하고 속도를 줄이면 결국 [self renewImage]를 호출하기 위해 별도의 스레드에 루프를 만들 계획입니다.

문제를 입력

I 화면이 될 때까지 갱신되지 (루프 예 또는 단지 두번 수면의 일종으로 구분)과 같은 기능으로 일렬로 더 다음 번 [renewImage 자기] 호출마다

마지막 전화 후에. 그것은 마치 renewImage 메서드가 방문되었음을 확신하더라도 (추적 덕분에) 장치 (또는 컴파일러)가 첫 번째 업데이트를 합리화하는 것처럼 보입니다. 여기

는 작동하지 않는 몇 가지 테스트 코드 :이

while (velocity > 0) { 
     pictureIndex++; 
     pictureIndex = pictureIndex % [self getNumberOfImages]; 
     if (pictureIndex < 0) 
     { 
      pictureIndex += [self getNumberOfImages]; 
     } 
     velocity -= 20; 
     NSLog(@"velocity: %f", velocity); 
     [self renewImage]; 
     [NSThread sleepForTimeInterval:0.5]; 
    } 

을 둘 다 수행합니다

pictureIndex += 20; 
[self renewImage]; 
sleep(1); 
pictureIndex += 20; 
[self renewImage]; 

어떤 생각을?

답변

1

NSTimer 콜백을 사용하여 이미지를 변경하면 모든 것이 별도의 스레드가 아닌 실행 루프에서 발생합니다.

NSTimer가 충분하지 않은 경우 다른 스레드의 UI 변경 사항이 즉시 업데이트되지 않으므로 기본 스레드에서 메소드를 호출하여 이미지를 변경해야합니다.

+0

효과가있었습니다. 고맙습니다! 왜 빨리 대충 설명할까요? (그리고, 네, 알아야 할 것은 문서화되어 있어야한다는 것을 알고 있습니다.) – Jonatan

+1

알고있는 한 UI에 대한 모든 변경은 주 스레드/실행 루프에서 수행되어야합니다. –

관련 문제