【发布时间】:2014-09-24 13:00:02
【问题描述】:
我正在构建一个中间有一个分支的复杂应用程序。
在应用程序的某个时刻,会出现一个特定的 UIViewController,我们将其称为 mainViewController(缩写为 mainVC)。
mainVC 通过代码提供了另一个视图控制器,使用以下代码(出于隐私原因,我删除了部分代码):
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SecondaryStoryboard" bundle:secondaryBundle];
SecondViewController *secondVC = [storyboard instantiateInitialViewController];
[self presentViewController:secondVC animated:YES completion:nil];
所以secondVC 稍后将呈现另一个视图控制器,称为thirdVC。这是使用自定义 segue 完成的,设置在上面代码中使用的故事板中,代码如下所示:
@implementation VCCustomPushSegue
- (void)perform {
UIView *sourceView = ((UIViewController *)self.sourceViewController).view;
UIView *destinationView = ((UIViewController *)self.destinationViewController).view;
UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
destinationView.center = CGPointMake(sourceView.center.x + sourceView.frame.size.width, destinationView.center.y);
[window insertSubview:destinationView aboveSubview:sourceView];
[UIView animateWithDuration:0.4
animations:^{
destinationView.center = CGPointMake(sourceView.center.x, destinationView.center.y);
sourceView.center = CGPointMake(0 - sourceView.center.x, destinationView.center.y);
}
completion:^(BOOL finished){
[self.sourceViewController presentViewController:self.destinationViewController animated:NO completion:nil];
}];
}
@end
如您所见,此 segue 以模态方式(通过使用 presentViewController:)和自定义动画(从右向左滑动)呈现目标视图控制器。
所以基本上到这里一切都很好。我用经典的模态动画(从底部向上滑动)呈现secondVC,并用我的自定义过渡呈现thirdVC。
但是当我想解散thirdVC时,我想要的是直接回到mainVC。所以我从thirdVC 拨打以下电话:
self.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:_animate completion:nil];
这样,我直接在mainVC 上调用dismissViewControllerAnimated:(由self.presentingViewController.presentingViewController 引用),我希望thirdVC 会被动画解除,而secondVC 会消失没有动画。
正如 Apple 在 UIViewController 类文档中所说:
呈现视图控制器负责关闭视图 它呈现的控制器。如果您在呈现的视图上调用此方法 控制器本身,它会自动将消息转发到 呈现视图控制器。
如果你连续呈现多个视图控制器,从而构建一个 呈现的视图控制器堆栈,在视图上调用此方法 堆栈中较低的控制器关闭其直接子视图 控制器和堆栈上该子级上方的所有视图控制器。 发生这种情况时,只有最顶层的视图会在动画中消失 时尚;任何中间视图控制器都被简单地从 堆。最顶层的视图使用其模态转换被关闭 样式,可能与其他视图控制器使用的样式不同 在堆栈中较低。
问题在于,事情并非如此。在我的场景中,thirdVC 消失了,并显示 secondVC 被经典的模态滑动到底部动画解散。
我做错了什么?
编辑:
所以@codeFi 的答案可能是在一个经典项目中工作,但这里的问题是我正在研究一个框架。所以mainVC 将在客户端应用程序中,而secondVC 和thirdVC 在我的框架中,在单独的故事板中。除了在我的代码中引用它之外,我无法以任何其他方式访问mainVC,因此不幸的是,这里不是一个选项。
【问题讨论】:
-
这种行为变化发生在 iOS 8 中,在 7 中它确实可以正常工作。我现在正在尝试解决它。
-
@theLastNightTrain :好吧,你是对的,它只发生在 iOS 8 上。如果你有任何发现,请告诉我。
-
@theLastNightTrain:有什么更新吗?我很高兴为解决这个问题的答案提供赏金..
-
抱歉,不,就我而言,我已经尽可能地解决了这个问题。我注意到关闭动画会有所帮助,但并不完美,这意味着您无法获得标准动画。
标签: ios objective-c uiviewcontroller presentviewcontroller