0

CATransitionフェードを使用してView Controllerをプッシュするのと同じ方法で、UIActivityIndi​​catorViewのアニメーションを停止しようとしています。

アニメーションを停止してから次のビュー コントローラーにフェードする代わりに、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];
    });
}
4

1 に答える 1

0

私は以前にこれに似たものに出くわしたことがあります。実行しているものはSynchronous Executionと呼ばれます。同期実行では、コンパイラが関数 ( }. これをどのように回避しますか?単純。非同期ディスパッチで 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];は優先スレッドで実行されますが、関数内の残りのコードはデフォルトの優先スレッドで実行され、期待どおりにコードを効果的に同時に実行します。

乾杯!

于 2013-04-25T01:50:24.433 に答える