2013-04-25 3 views
0

CATransition 페이드를 사용하는보기 컨트롤러를 푸시하는 것과 동일한 방법으로 UIActivityIndicatorView에서 애니메이션을 중지하려고합니다.UIActivityIndicatorView는 이전 CATransition의 애니메이션을 유지합니다. pushViewController

애니메이션을 멈추지 않고 다음보기 컨트롤러로 사라지는 대신 UIActivityIndicatorView는 지속 시간을 설정 한 시간에 관계없이 전체 페이드에 걸쳐 애니메이션을 적용합니다.

어떻게 회전을 멈출 수 있는지, 같은 방법으로 푸시/페이드를 할 수있는 아이디어는 무엇입니까? 내가 dispatch_after을 사용 순식간 동안 지연하는 경우

- (void)pushView:(NSNotification *)notification { 

    [self.activityIndicator stopAnimating]; 
    NextViewController* nextViewController = [[NextViewController alloc] init]; 
    CATransition *transition = [CATransition animation]; 
    transition.duration = 1.5f; 
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    transition.type = kCATransitionFade; 
    [self.navigationController.view.layer addAnimation:transition forKey:nil]; 
    [self.navigationController pushViewController:nextViewController animated:NO]; 

} 

편집 다윗의 대답과 같은 라인을 따라 1

, 나는 성공적으로 stopAnimating 할 수 있었다. 내가 전에 이와 비슷한 무언가로 실행했습니다

- (void)pushView:(NSNotification *)notification { 

    [self.activityIndicator stopAnimating]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.0001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){ 
     NextViewController* nextViewController = [[NextViewController alloc] init]; 
     CATransition *transition = [CATransition animation]; 
     transition.duration = 1.5f; 
     transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
     transition.type = kCATransitionFade; 
     [self.navigationController.view.layer addAnimation:transition forKey:nil]; 
     [self.navigationController pushViewController:nextViewController animated:NO]; 
    }); 
} 

답변

0

이? : 달성하는 더 좋은 방법이 있나요. 실행중인 것은 동기 실행입니다. 동기 실행에서는 컴파일러가 함수를 종료 할 때까지 UI가 업데이트되지 않습니다 (예 : }). 이 문제를 어떻게 해결합니까? 단순한. 그냥비동기 파견의 UI를 업데이트 할 수있는 방법을 실행

- (void)pushView:(NSNotification *)notification { 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 

dispatch_async(dispatch_get_main_queue(), ^(void){ 
    [self.activityIndicator stopAnimating]; 
}); 

NextViewController* nextViewController = [[NextViewController alloc] init]; 
CATransition *transition = [CATransition animation]; 
transition.duration = 1.5f; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionFade; 
[self.navigationController.view.layer addAnimation:transition forKey:nil]; 
[self.navigationController pushViewController:nextViewController animated:NO]; 

}); 

} 

으악를! 다른 코드를 일반 디스패치에 넣는 것을 잊었습니다! 편집 된 코드를 사용해보십시오.

이렇게하면 [self.activityIndicator stopAnimating];은 우선 순위 스레드에서 실행되지만 나머지 코드는 기본 우선 순위 스레드에서 실행되므로 코드를 동시에 효과적으로 실행할 수 있습니다.

건배!

+0

답장을 보내 주셔서 감사합니다. David. 불행히도'dispatch_async'는 나를 위해 작동하지 않았습니다. 그러나'dispatch_after'를 사용하여 트랜지션 블록의 실행을 지연 시키면,'stopAnimating'은 예상대로 동작합니다. 내 질문을 편집하여 코드를 수정 한 방법을 보여줍니다. 더 좋은 방법이있을 것입니다 ... – Snow

+0

편집 된 코드를 확인하십시오. 모든 것을 기본 큐에 전달하는 것을 잊었습니다. – David

+0

그래서 activityIndicator는 이제 애니메이션이 멈추지 만 뷰는 푸시하지 않습니다 .../어떤 아이디어입니까? 나는 어느 쪽이든 도움을 주셔서 감사합니다. – Snow