如何用淡出动画解雇模态VC?

时间:2012-01-21 21:46:11

标签: ios animation modalviewcontroller fadeout dismiss

我在演示VC中使用以下代码来淡化子模态VC,这很好用:

self.infoViewController.view.alpha = 0.0;
[self.navigationController presentModalViewController:self.infoViewController animated:NO];
[UIView animateWithDuration:0.5
             animations:^{self.infoViewController.view.alpha = 1.0;}];

然而我无法让它淡出,我尝试了一些东西,这是我试过的最新功能:

- (IBAction)dismissAction:(id)sender
{
if ([[self parentViewController] respondsToSelector:@selector(dismissModalViewControllerAnimated:)])
{
    [[self parentViewController] dismissModalViewControllerAnimated:YES];
    self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    self.parentViewController.view.alpha = 0.0;
    [UIView animateWithDuration:0.5
                     animations:^{self.parentViewController.view.alpha  = 1.0;}];
} else 
{
    [[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
    self.presentedViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    self.presentedViewController.view.alpha = 0.0;
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.presentedViewController.view.alpha  = 1.0;}];
}

}

模态视图控制器会逐渐消失,但不会像显示它时那样在一段时间内消失。

3 个答案:

答案 0 :(得分:49)

这(原始部分)不是要取消H2CO3的正确答案。 UIModalTransitionStyleCrossDissolve确实非常符合您所寻找的效果。你只是设置modalTransitionStyle,直到它为时已晚。用相应的位置替换所有代码:

-(void)show{
    self.infoViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:self.infoViewController animated:YES];
}
- (IBAction)dismissAction:(id)sender{
    [self dismissModalViewControllerAnimated:YES];
}

编辑以解决时间问题:让我们来谈谈有问题的代码。我们将专注于if true部分,因为它与else完全相同。

[[self parentViewController] dismissModalViewControllerAnimated:YES];
self.parentViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
self.parentViewController.view.alpha = 0.0;
[UIView animateWithDuration:0.5
                 animations:^{self.parentViewController.view.alpha  = 1.0;}];

如果你正在寻找一个倒数动画,那就不是了。在原始动画中,您将下一个视图的alpha设置为0,然后显示下一个视图控制器,然后将其视图的alpha设置为1.因此逻辑上您需要在动画后关闭视图控制器;使用块非常简单。代码看起来像这样:

[UIView animateWithDuration:0.5 animations:^{
    self.view.alpha = 0;
} completion:^(BOOL b){
    [self.presentingViewController dismissModalViewControllerAnimated:NO];
    self.view.alpha = 1;
}];

这行代码将视图的alpha设置为0,然后(完成时)解除显示的视图控制器,并将视图的alpha设置回1.这是一个倒数动画。

答案 1 :(得分:10)

在UIViewController的文档中,我们可以找到:

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle

将此属性设置为UIModalTransitionStyleCrossDissolve,它将正确解散:)

希望有所帮助。

答案 2 :(得分:0)

我想,这可能对那些仍然试图在全屏模式下使用 MPMoviePlayerViewController 并且与应用程序主要版本不同的英雄人士有用。

我花了半个工作日玩模拟或非模态地呈现 MPMoviePlayerViewController 。但是,就过渡动画的变化而言,根本没有运气。 (设置方向所需的模态模式与应用主要方向不同)。

我尝试过presentViewController或presentModalViewController,但结果是一样的。无论modalTransitionStyle属性集是什么类型,如果我执行[... dismissViewControllerAnimated:true ...],则无论如何都使用默认转换样式(UIModalTransitionStyleCoverVertical)。我在iOS 5.1设备和iOS 6模拟器中测试过它。

我还没有尝试过任何其他类型的控制器...考虑到常见的控制器有方法dismissMoviePlayerViewControllerAnimated,我可以假设,这种方法无论如何都用于解雇视频控制器,无论它是如何出现的。 (输入转换对我来说也不起作用,除了它们没有处理为CoverVertical(在modalTransitionStyle改变的情况下)。

所以,我的解决方案是根本不使用过渡动画。 我确信,Apple有一些理由只允许MovieViewController的一些明确的动画(我真的希望如此,这不是因为“懒惰”),但如果他们想要用户会得到一些不错的体验,他们就会失败,就像在我的应用程序在视频没有任何动画时显示效果更好(肯定比CrossDisolving更差),但这比平庸的CoverVertical更好。

从开发人员的角度来看,真的听起来他们花了更多的钱让设计师为客户绘制漂亮的图标,而不是开发人员更愉快和有效的工作。 (