2

UINavigationControllerのカテゴリを作成して、いくつかのカスタムアニメーションをまとめようとしています。私はこの質問に出くわしました、そしてそれは私を始めさせました。私はプッシュ機能のために次のことを思いついた:

- (void)pushViewControllerMoveInFromBottom:(UIViewController *)viewController {
    [CATransaction begin];
    CATransition *transition;
    transition = [CATransition animation];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromBottom;
    transition.duration = 0.7;

    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
    [self  pushViewController:viewController animated:YES];
    [CATransaction commit];
}

サブビュー呼び出しを介してどのビュー/レイヤーにアクセスしているかわかりません。ですから、誰かが私にそれを理解するのを手伝ってくれるなら、それは役に立ちます。画面に表示されようとしているビューに影響を与えているようです。

しかし、私の主な質問は、上記の機能を「元に戻す」ポップを作成しようとしているということです。わかりやすくするために、AとBの2つのビューがあるとします。Aは画面に表示される最初のビューです。上記の関数は、Aを押し出さずにBに移動します。モーダルビューと同じように。ただし、以下の関数は、Bを上にスライドさせてAを所定の位置に残すのではなく、AをBの上にスライドさせて戻します。

- (void)popViewControllerMoveInFromTop {
    [CATransaction begin];
    CATransition *transition;
    transition = [CATransition animation];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromTop;
    transition.duration = 0.7;

    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
    [self  popViewControllerAnimated:YES];    
    [CATransaction commit];
}

モーダルビューを使用したくないので、カスタムアニメーションブロックを使用してビューのフレームを変更したくありません。

4

1 に答える 1

3

私は似たようなことを成し遂げましたが、それをそれ自身の機能に移すことはしませんでした:

CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition forKey:nil];

[self.navigationController popViewControllerAnimated:NO]

あなたはそれを抽象化することができます。コードを使用すると、次のようになります。

- (void)popViewControllerMoveInFromTop {
[CATransaction begin];
CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
transition.duration = 0.7;

[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];

[self.view.layer addAnimation:transition forKey:nil];
[self  popViewControllerAnimated:NO];    
[CATransaction commit];
}

UIViewのアニメーションを使用して、ポップのカスタムトランジションを作成することもできます。ここでは、消えようとしているビューにアニメーションを適用してから、ビュースタックからポップします。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.75];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO]; 

[self.navigationController popViewControllerAnimated:NO];

[UIView commitAnimations];
于 2011-06-21T20:01:55.520 に答える