在导航堆栈上创建显示源视图和目标视图的转换?

时间:2013-07-25 13:30:27

标签: ios objective-c core-animation

本机推送转换显示源视图,并无缝转换到目标视图。

模态转换显示目标视图从底部覆盖源视图。

我想要一个适用于导航控制器的模态转换。

到目前为止,我有这个:

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
    anim.duration = .2;
    anim.autoreverses = NO;
    anim.removedOnCompletion = YES;

    anim.fromValue = [NSNumber numberWithInt:sourceViewController.view.frame.size.height];
    anim.toValue = [NSNumber numberWithInt:0];

    [sourceViewController.navigationController.view.layer addAnimation:anim
                                                                 forKey:kCATransition];

    [sourceViewController.navigationController pushViewController:destinationController animated:NO];

这是我的segue子类中的-perform方法。这样的问题是导航控制器推送几乎立即完成,并且在转换发生时,不显示任何源视图。我希望它看起来好像在重叠。

我认为可以使用Core Graphics截取屏幕截图并将其作为目标视图的超级视图,但我无法正常工作。

我也尝试使用其中一种UIView动画方法:

[sourceViewController.view addSubview:destinationController.view];
    [destinationController.view setFrame:sourceViewController.view.window.frame];
    [destinationController.view setTransform:CGAffineTransformMakeTranslation(0, sourceViewController.view.frame.size.height)];
    [destinationController.view setAlpha:1.0];

    [UIView animateWithDuration:1.3
                          delay:0.0
                        options:UIViewAnimationOptionTransitionNone
                     animations:^{
                         [destinationController.view setTransform:CGAffineTransformMakeTranslation(0, 0)];
                         [destinationController.view setAlpha:1.0];

                     }
                     completion:^(BOOL finished){
                         [destinationController.view removeFromSuperview];
                         [sourceViewController.navigationController pushViewController:destinationController animated:NO];

                     }];

但同样,这有一个问题:在视图控制器实际被推入导航堆栈之前,导航栏不会显示。因此,当导航栏突然显示时,动画结束时会出现一种“跳跃”。

那么我有什么选择呢?

1 个答案:

答案 0 :(得分:0)

我通过创建源视图图像并转换它的路径解决了这个问题。

另外,应该注意ios 7上不存在“flash”,因此没有太多自定义代码。