当过渡不能按您想要的方式工作时,一种对我始终有效的技术是简单地使用一些烟雾和镜子。这是一种很好的技术,可以理解并包含在您的工具带中。
这是我的食谱:
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(它将逐渐消失)。