如何关闭带有淡出动画的模态 VC?

Posted

技术标签:

【中文标题】如何关闭带有淡出动画的模态 VC?【英文标题】:How to dismiss a modal VC with fade out animation? 【发布时间】:2012-02-15 22:30:11 【问题描述】:

我在演示 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;];

模态视图控制器会立即淡出,而不是像它显示时那样在一段时间内淡出。

【问题讨论】:

如果您确实希望此代码在 ios 5 之前的设备上运行,您需要保护对 presentedViewControllerdismissModalViewControllerAnimated 的调用。 如果您看到关闭动画,听起来确实是这段代码正在执行,并且正在通过另一条路径被关闭。 【参考方案1】:

这(原始部分)不是要从 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。这是一个交互动画。

【讨论】:

谢谢,但你自己和 H2CO3 都忽略了我的代码中有一个 withDuration 部分的事实。使用减少的代码,无法设置淡入/淡出应该花费多长时间。我的帖子说“..但不是在一段时间内”。抱歉,我的标题可能应该说明如何实现淡出并控制其持续时间,但我认为从发布的代码和描述中可以明显看出,如果不是,抱歉。 根据评论编辑 看来在iOS8中还需要在presentingViewController上加上self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve,所以dismiss也是CrossDissolve【参考方案2】:

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

@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle

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

希望对您有所帮助。

【讨论】:

谢谢,它会溶解,但它会立即溶解,而我在它的外观上有 0.5 秒的动画。怎样才能让它慢慢溶解? [self.parentViewControllerdismissModalViewControllerAnimated:YES]; 将 Animated: 设置为 YES 使其滚动关闭,将 Animated: 设置为 NO 使其消失,但仍会立即消失。我在上面的编辑中发布了我的最新代码。 将其标记为已接受,因为它回答了我的查询标题,尽管我仍在寻找有关如何在设置的持续时间内实现淡入淡出的答案。【参考方案3】:

我想,这可能对那些仍然尝试在全屏模式和方向上使用 MPMoviePlayerViewController 的英雄们有用,这与应用程序的主要模式不同。

我已经花了半个工作日来处理模态或非模态呈现 MPMoviePlayerViewController。但是从过渡动画变化的意义上来说,这根本就没有运气。 (设置方向所需的模态模式,与应用主方向不同)。

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

我还没有尝试过任何其他类型的控制器...考虑到普通控制器有方法dismissMoviePlayerViewControllerAnimated,我可以假设,不管它是如何出现的,这个方法无论如何都用于关闭视频控制器。 (输入转换对我也不起作用,除了它们没有作为 CoverVertical 处理(在 modalTransitionStyle 发生变化的情况下)。

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

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

【讨论】:

以上是关于如何关闭带有淡出动画的模态 VC?的主要内容,如果未能解决你的问题,请参考以下文章

如何在关闭视图控制器时获得淡出动画

自定义 VC 转换未正确关闭

单击特定网格视图单元格时淡出网格视图

关闭模态呈现的 VC 和弹出呈现的 VC

如何连续关闭两个模态视图控制器*动画*?

所有VC的一个UI元素[关闭]