如何设置两个模态视图控制器之间的过渡动​​画?

时间:2018-04-14 00:32:43

标签: ios objective-c uikit

为了清晰起见,编辑了原始帖子

我希望能够控制两个模态视图控制器之间的动画。具体来说,我希望第一个模态向下滑动,第二个模态在其后面淡入。我刚刚观看了关于自定义动画过渡的WWDC视频,我认为这可能就是我想要的。我的想法是,在向下滑动modal1时,我可以淡入modal2(或modal2的图像),然后在动画结束后正常呈现modal2。我不确定这是否是正确的方式,所以我对这些想法持开放态度。

这就是我解雇/提出的方式:

 _modal1.modalPresentationStyle = UIModalPresentationCustom;
 [_modal1 setTransitioningDelegate:self];
 [_modal1 dismissViewControllerAnimated:YES completion:^{
        [self presentViewController:_modal2 animated:NO completion:nil];
  }];

这是我的委托方法:

- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    return [CustomDismissAnimation new];
}

我尝试过渡:

@implementation CustomDismissAnimation

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    UIView *containerView = [transitionContext containerView];
    UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];

    CGRect containerFrame = containerView.frame;
    CGRect fromViewFinalFrame = CGRectMake(0,
                                           containerFrame.size.height,
                                           fromView.frame.size.width,
                                           fromView.frame.size.height);

    UIViewController *test = [UIViewController new];
    [test setBackgroundColor:[UIColor greenColor]];
    test = containerFrame;
    [containerView addSubview:test];
    [containerView bringSubviewToFront: test];

    [UIView animateWithDuration:[self transitionDuration:transitionContext]
                     animations:^{
                         [fromView setFrame:fromViewFinalFrame];
                     }
                     completion:^(BOOL finished){
                         [test removeFromSuperview];
                         [transitionContext completeTransition:YES];
                     }];
}

@end

我的期望是这个绿色测试视图会出现在modal1后面,因为它在屏幕上向下滑动,但似乎并非如此。它根本没有显示出来。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

一个简单的解决方法是,你不能显示2个模态VC,就是只创建一个带有2个视图的模态,前面是旧的,后面是新的(如果你想分离VC,则将newVC设为一个孩子背后的老人),并管理他们之间的隐藏/显示也可以直接做动画到视图

答案 1 :(得分:1)

所以你说A呈现B,然后解散B,然后呈现C,但在解雇B并呈现C时A不应该可见。

一个明显的解决方案是让B呈现C!当你把C降下来的时候,你可以一举一动地从B到A放松。

如果你坚持这种层次结构 - 也就是说,如果A存在B然后C-B和C不能同时占用空间,因为一个视图控制器(A)不能同时呈现两个VC。所以某些东西会在它消失后出现在B后面,然后出现在C后面。但是,你可以自由地说出那是什么;例如,你可以设置一个&#34;调光视图&#34;在A面前。