2017-02-28 25 views
0

我正在尝试使UIViewControllerContextTransitioning正常工作。自定义模式转换不起作用 - 示例

我想要什么:

我想吃点什么,是呈现与自定义动画和透明背景模式视图控制器。

Wthat我所做的:

我创建动画实现UIViewControllerTransitioningDelegate,

集的模态控制器:

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

我取得了什么至今,

模态控制器动画呈现和dis正确地丢失视图,但解散完成后,整个应用程序变黑。我使用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,我注释掉'[容器addSubview:fromVC.view]''中animatePresentingInContext:toVC:fromVC:'但没有真正改变。任何其他想法? – konradholub

+1

删除'[container addSubview:toVC.view];''from animatePresentingInContext:toVC:fromVC:'虽然工作。谢谢你在那里指导我。请将其添加为答案,以便我可以将其标记为已解决。 – konradholub

回答

0

如果这是一个呈现动画师,您不应该将fromVC.view添加为子视图,因为它已经存在。这会导致它出错。试试看,告诉我会发生什么。如果它是一个解雇动画师,你不应该把presentationViewController添加到层次结构中。