2013-04-25 63 views
0

我試圖停止在我的UIActivityIndi​​catorView上的動畫,我使用CATransition淡入淡出的方法來推動視圖控制器。UIActivityIndi​​catorView在CATransition之前保持動畫pushViewController

無論停止動畫,然後退到下一個視圖控制器,UIActivityIndi​​catorView都會在整個淡入淡出過程中確定動畫,無論設置持續時間有多長。

任何想法如何讓紡紗停止,然後按相同的方法推/淡入?

- (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如果我用dispatch_after和延遲一秒鐘的一小部分。有沒有更好的方法來實現這個目標?:

- (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

我遇到過類似於此之前的事情。你正在運行的是叫做Synchronous Execution。在同步執行中,在編譯器終止函數之後,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

感謝您的回覆,大衛。不幸的是'dispatch_async'不適合我。但是,如果我使用'dispatch_after'延遲執行轉換塊,只需幾分之一秒,'stopAnimating'的行爲就像預期的那樣。我編輯了我的問題以顯示我如何修改我的代碼。必須有更好的方法... – Snow 2013-04-25 16:31:00

+0

檢查編輯的代碼。我忘了將所有東西都發送到默認隊列中。 – David 2013-04-25 17:01:34

+0

所以activityIndi​​cator現在停止動畫,但視圖不會推動...:/任何想法?我欣賞這種幫助 – Snow 2013-04-25 20:31:29

相關問題