2017-02-28 7 views
0

私はUIViewControllerContextTransitioningを動作させようとしています。カスタムモーダルトランジションが動作しません - 例:

私が欲しいもの:私は、カスタムアニメーションと透明な背景を持つモーダルビューコントローラを提示されたいと思うパートナーはどのような

私はUIViewControllerTransitioningDelegate、モーダルコントローラの

セットの実装アニメーター作成:

self.modalPresentationStyle = UIModalPresentationCustom; 
self.transitioningDelegate = self; 

私がこれまで達成し何、

モーダルコントローラを私がやったWthat

プレゼンテーションとディスプレイをアニメーション化する表示が正しく表示されませんが、終了後にアプリ全体が黒くなります。私はxCodeツールを使ってウィンドウ階層内のものを選びましたが、何もありません。私の推測は、コンテクストのコンテナに追加するときにVCのスーパービューを変更したことです。

アニメーター

@implementation AlertAnimator 

const static CGFloat kAnimationDuration = 1.2; 

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

    if (self.transitionType == ModalAnimatedTransitioningTypePresent) { 
     [self animatePresentingInContext:transitionContext toVC:to fromVC:from]; 
    } else if (self.transitionType == ModalAnimatedTransitioningTypeDismiss) { 
     [self animateDismissingInContext:transitionContext toVC:to fromVC:from]; 
    } 
} 

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

- (void)animatePresentingInContext:(id<UIViewControllerContextTransitioning>)transitionContext toVC:(UIViewController *)toVC fromVC:(UIViewController *)fromVC { 
    CGRect fromVCRect = [transitionContext initialFrameForViewController:fromVC]; 
    CGRect toVCRect = fromVCRect; 
    toVCRect.origin.y = toVCRect.size.height; 

    toVC.view.frame = toVCRect; 
    UIView *container = [transitionContext containerView]; 
    [container addSubview:fromVC.view]; 
    [container addSubview:toVC.view]; 

    [UIView animateWithDuration:kAnimationDuration animations:^{ 
     toVC.view.frame = fromVCRect; 
    } completion:^(BOOL finished) { 
     [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; 
    }]; 
} 

- (void)animateDismissingInContext:(id<UIViewControllerContextTransitioning>)transitionContext toVC:(UIViewController *)toVC fromVC:(UIViewController *)fromVC { 
    CGRect fromVCRect = [transitionContext initialFrameForViewController:fromVC]; 
    fromVCRect.origin.y = fromVCRect.size.height; 

    UIView *container = [transitionContext containerView]; 
    [container addSubview:toVC.view]; 
    [container addSubview:fromVC.view]; 

    [UIView animateWithDuration:kAnimationDuration animations:^{ 
     fromVC.view.frame = fromVCRect; 
    } completion:^(BOOL finished) { 
     [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; 
    }]; 
} 

@end 

コード例:

https://www.dropbox.com/s/oaghtgwvga4nxs4/Test.zip?dl=0

質問:

私が間違っていると、なぜ画面が黒くなっていますか?

+0

これがプレゼンテーションアニメーターの場合は、fromVC.viewをサブビューとして追加するべきではありません。これによりバグが発生します。それを試してみてください。 – DatForis

+0

感謝@DatForis、私は 'animatePresentingInContext:toVC:fromVC:'で '[container addSubview:fromVC.view];をコメントアウトしましたが、実際には何も変わっていません。他のアイデア? – konradholub

+1

'animatePresentingInContext:toVC:fromVC:'から '[container addSubview:toVC.view];を削除しました。そこに私を案内してくれてありがとう。答えとして追加してください。解決済みとマークすることができます。 – konradholub

答えて

0

これがプレゼンテーションアニメーターの場合は、fromVC.viewをサブビューとして追加しないでください。これによりバグが発生します。試してみて、何が起こるか教えてください。解雇アニメーターの場合は、presentingViewControllerを階層に追加しないでください。

関連する問題