1

我有一个UITabBarController作为我的 rootViewController 并基于一个动作,我调用 tabBarControllerpresentViewController工作正常。呈现的控制器是 UINavigationController

基于我想通过使用从当前呈现的 UINavigationController 转换到不同的 UINavigationController 的操作,transitionFromViewController:toViewController:duration:options:animations:completion:但会引发错误:

Parent view controller is using legacy containment in call to -[UIViewController transitionFromViewController:toViewController:duration:options:animations:completion:]

人们谈论在 UINavigationController 上调用它时会得到它,但这是针对 UITabBarController 的,我希望它有所不同。

最终,我想从当前呈现的 UINavigationController 过渡到具有交叉溶解的新 UINavigationController。我可以忽略第一个并展示第二个,但它是从底部滑出的。这可能吗?

4

1 回答 1

1

当过渡不能按您想要的方式工作时,一种对我始终有效的技术是简单地使用一些烟雾和镜子。这是一种很好的技术,可以理解并包含在您的工具带中。

这是我的食谱:

A)您为当前屏幕截屏:(借自How Do I Take a Screen Shot of a UIView?

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
CGRect rect = [keyWindow bounds];
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[keyWindow.layer renderInContext:context];   
UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

B)使用您的屏幕截图创建一个 UIImageView 并将其添加到您的新 viewController

UIImageView *fakeScreen = [UIImageView alloc] initWithImage:captureScreen];
 //accessing .view isn't best practice, consider using a dedicated property inside your UIViewController subclass, here just for the sake of explanation
[secondViewController.view addSubview:fakeScreen];

C)关闭当前视图控制器,确保不对它进行动画处理,在您的情况下为 UINavigationController [navigationController dismissViewControllerAnimated:NO completion:nil];

D) 展示您的新视图控制器,也不要为其设置动画。(secondViewController),然后淡出 imageView。

[self.tabBarController presentViewController:secondViewController animated:NO completion:NO];
    [UIView animateWithDuration:0.08 animations:^{
        fakeScreen.alpha = 0;
    } completion:
         ^{[
       fakeScreen removeFromSuperview]; ];

这给你一个正常的淡入淡出。如果你想做一个真正的交叉淡入淡出,你需要对你的第二个 viewController 的内容有点创意:你需要一个有两个孩子的根视图:一个 contentview(用于淡入的内容)和 fakeView(它将逐渐消失)。

于 2013-09-09T06:39:57.327 回答