1. ホーム
  2. ios

[解決済み] UIViewControllerContextTransitioningで "From View Controller "が消える。

2022-10-17 01:36:43

質問

ある問題が発生しましたので、以下に説明します。

私は UIViewControllerContextTransitioning を使っています。

第一ビューコントローラと第二ビューコントローラの2つのビューコントローラを用意しました。

ここで、2つ目のビューコントローラをアニメーション付きで1つ目のビューコントローラの上に追加したいと思います。その結果、2つ目のビューコントローラが透明になり、2つ目のビューコントローラの下に1つ目のビューコントローラが表示されるようになりました。

しかし、最初のビューコントローラが見えず、2番目のビューコントローラの下に黒い画面だけが見えています。

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
    self.transitionContext = transitionContext;
    if(self.isPresenting){
        [self executePresentationAnimation:transitionContext];
    }
    else{
       [self executeDismissalAnimation:transitionContext];
    }
  }

-(void)executePresentationAnimation:(id<UIViewControllerContextTransitioning>)transitionContext{
     UIView* inView = [transitionContext containerView];
     UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

     UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

     CGRect offScreenFrame = inView.frame;
     offScreenFrame.origin.y = inView.frame.size.height;
     toViewController.view.frame = offScreenFrame;

    toViewController.view.backgroundColor = [UIColor clearColor];
    fromViewController.view.backgroundColor = [UIColor clearColor];
    inView.backgroundColor = [UIColor  clearColor];
    [inView insertSubview:toViewController.view aboveSubview:fromViewController.view];
     // [inView addSubview:toViewController.view];
    CFTimeInterval duration = self.presentationDuration;
    CFTimeInterval halfDuration = duration/2;

    CATransform3D t1 = [self firstTransform];
    CATransform3D t2 = [self secondTransformWithView:fromViewController.view];

    [UIView animateKeyframesWithDuration:halfDuration delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{

    [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:0.5f animations:^{
        fromViewController.view.layer.transform = t1;
    }];

    [UIView addKeyframeWithRelativeStartTime:0.5f relativeDuration:0.5f animations:^{
        fromViewController.view.layer.transform = t2;
    }];
    } completion:^(BOOL finished) {
    }];


    [UIView animateWithDuration:duration delay:(halfDuration - (0.3*halfDuration)) usingSpringWithDamping:0.7f initialSpringVelocity:6.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
        toViewController.view.frame = inView.frame;
    } completion:^(BOOL finished) {
        [self.transitionContext completeTransition:YES];
    }];
}

いつ [self.transitionContext completeTransition:YES]; を呼び出すと、突然1つ目のビューコントローラが消え、2つ目のビューコントローラの下に黒い画面が表示されます。

どなたかお分かりになる方いらっしゃいますか? ありがとうございます。

どのように解決するのですか?

私も同じ問題を抱えていました。iOS 8 のバグのようです。私は レーダーを提出しました。 .

私が使用したのは レヴール を使用して、画面が黒くなった後のビュー階層を検査します。キーである UIWindow は完全に空です。ビュー階層が全くありません!

少し遊んでみたところ、簡単なケースであれば、簡単に回避できるようです。単に toViewController のビューをキー ウィンドウのサブビューとして追加し直せばよいのです。

transitionContext.completeTransition(true)
UIApplication.sharedApplication().keyWindow!.addSubview(toViewController.view)

確認したところ、キーウィンドウの rootViewController が正しく設定されたままなので、問題ありません。すでに提示されているモーダルコントローラの中からコントローラを提示した場合にどうなるかはわからないので、より複雑なケースについては、いろいろと実験してみる必要がありそうです。