2

カスタム トランジションを使用しているビュー コントローラーがあり、うまく機能しています。UIModalPresentationCustom を使用すると、表示中のビュー コントローラーが削除されないという事実を利用して、新しいビュー コントローラーをその上に透明に配置します。

ただし、これを状態復元と組み合わせて使用​​する場合は、表示中のビュー コントローラー IS が削除されます。ビュー コントローラーはアニメーションなしで表示されるため、カスタム遷移コードが呼び出されることはありません。ビュー コントローラがアニメーション化されていない場合でも、カスタム トランジションを有効にする方法はありますか?

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented
                                                                  presentingController:(UIViewController *)presenting
                                                                      sourceController:(UIViewController *)source
{
    // never called if we aren't animating
    return self;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    return self;
}

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (toViewController == self) {
        [transitionContext.containerView addSubview:fromViewController.view];
        [transitionContext.containerView addSubview:toViewController.view];

        self.maskView.alpha = 0.0f;
        self.menuView.frame = CGRectMake(0, self.view.bounds.size.height, self.view.bounds.size.width, 286.0f);

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;

            [self.menuView updateFrame:^(CGRect *frame) {
                frame->origin.y = self.view.bounds.size.height - frame->size.height;
            }];

            self.maskView.alpha = 0.75f;
        } completion:^(BOOL finished) {
            self.maskView.userInteractionEnabled = YES;
            [transitionContext completeTransition:YES];
        }];
    } else {
        [transitionContext.containerView addSubview:toViewController.view];
        [transitionContext.containerView addSubview:fromViewController.view];

        self.maskView.userInteractionEnabled = NO;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            toViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;

            [self.menuView updateFrame:^(CGRect *frame) {
                frame->origin.y = self.view.bounds.size.height;
            }];

            self.maskView.alpha = 0.0f;
        } completion:^(BOOL b){
            [transitionContext completeTransition:YES];

            [self.menuView updateFrame:^(CGRect *frame) {
                frame->origin.y = self.view.bounds.size.height - frame->size.height;
            }];
        }];
    }
}
4

1 に答える 1