iOS Dismiss 和 Present 视图控制器自定义动画

Posted

技术标签:

【中文标题】iOS Dismiss 和 Present 视图控制器自定义动画【英文标题】:iOS Dismiss and Present view controller custom animation 【发布时间】:2014-11-11 05:43:38 【问题描述】:

我有一个视图控制器,我使用以下目标 c 代码呈现:

CATransition *animation=[CATransition animation];
animation.delegate=self;
animation.duration=0.3;
animation.type=kCATransitionMoveIn;
animation.subtype=kCATransitionFromRight;

[self presentViewController:reader animated:NO completion:nil];
[reader.view.layer addAnimation:animation forKey:@"animation"];

并在委托方法中使用类似的代码解除

CATransition *animation=[CATransition animation];
animation.delegate=self;
animation.duration=0.3;
animation.type=kCATransitionMoveIn;
animation.subtype=kCATransitionFromLeft;

[self dismissViewControllerAnimated:NO completion:nil];
[self.view.layer addAnimation:animation forKey:@"animation"];

但是有一个问题:与使用导航控制器不同,您会看到一个视图滑到另一个视图上;在这里,旧视图立即消失,因此新视图移动 在空白视图上。

我该如何解决这个问题?我需要这段代码在 ios 6,7 和 8 中工作,并希望它看起来像在导航控制器内的视图之间来回切换时看到的水平动画。

编辑: 我接受的解决方案有一个 iOS 6 的错误,如果我能找到修复它的解决方案,我会编辑这篇文章。

编辑 2: 找到了。看来,由于我正在展示一个 zBar 视图控制器,因此我需要使用此代码

zbarController.wantsFullScreenLayout=NO;

在我设置了 cameraOverlayView 之后。

【问题讨论】:

【参考方案1】:

使用自定义动画呈现视图控制器:

CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromRight;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController pushViewController:reader animated:NO];

使用自定义动画关闭视图控制器:

CATransition* transition = [CATransition animation];
transition.duration = 0.3;
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromLeft;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];    
[self.navigationController popViewControllerAnimated:NO];

【讨论】:

感谢您的回复。它在 IOS 7 中运行良好,但在 6 中存在一些问题。当我以纵向模式导航到新视图时,状态栏为纯黑色。此外,当我从纵向旋转到横向时,实心栏被向上移动到最顶部的导航栏覆盖。为什么会发生这种情况? 我不确定为什么状态栏会停止正常显示。多年来,iOS 中的状态栏设置发生了如此多的变化,以至于问题可能是由许多事情引起的,从应用程序委托中的全局设置到视图控制器,或者如果您使用的是抽屉式导航控件这可能是个问题。抱歉,我无法提供更多帮助。 没关系,如果我最终无法自己解决这个问题,我会发布一个新问题。谢谢你的帮助!如果我找到修复 iOS 6 错误的解决方案,我会将您的答案标记为已接受并更新原始帖子。 那么,0.3 是默认持续时间吗?

以上是关于iOS Dismiss 和 Present 视图控制器自定义动画的主要内容,如果未能解决你的问题,请参考以下文章

调用dismiss方法后如何刷新ViewController

离子 3 警报;调用dismiss()后调用present()不起作用

iOS 16 中 SwiftUI 防止弹出的 sheet 视图被下滑关闭(dismiss)的新解决方案

iOS 16 中 SwiftUI 防止弹出的 sheet 视图被下滑关闭(dismiss)的新解决方案

iOS 16 中 SwiftUI 防止弹出的 sheet 视图被下滑关闭(dismiss)的新解决方案

React Native Push 而不是 Present 本机 iOS 视图