如何关闭带有淡出动画的模态 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 之前的设备上运行,您需要保护对presentedViewController
和 dismissModalViewControllerAnimated
的调用。
如果您看到关闭动画,听起来确实是这段代码正在执行,并且正在通过另一条路径被关闭。
【参考方案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?的主要内容,如果未能解决你的问题,请参考以下文章