当modalPresentationStyle设置为UIModalPresentationCurrentContext时没有动画

时间:2013-02-17 15:14:50

标签: iphone ios objective-c xcode presentmodalviewcontroller

当我将UIViewController modalPresentationStyleUINavigationController设置为UIModalPresentationCurrentContext时,UIViewController没有滑入。没有过渡使用。

这是我的代码:

UIViewController *viewController = [[UIViewController alloc] init];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBarHidden = YES;

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:navController animated:YES completion:nil];

当我没有设置modalPresenttionStyle时,一切正常。但我需要这种风格,因为我希望UIViewController呈现为叠加。

顺便说一句:当ViewController被解雇时,动画效果很好。

5 个答案:

答案 0 :(得分:2)

根据UIViewController.h标题定义: -

/ *   定义在以模态方式呈现时将用于此视图控制器的过渡样式。组   要呈现的视图控制器上的此属性,而不是演示者。默认为   UIModalTransitionStyleCoverVertical。 * /

所以你应该在presentingViewController上应用这个: -

UIViewController *viewController = [[UIViewController alloc] init];

 UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
 navController.navigationBarHidden = YES;

//Here is the change
 navController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:navController animated:YES completion:nil];

答案 1 :(得分:1)

如果您希望将UIViewController显示为不是正确方法的叠加层,那么当您这样做时: [self presentViewController:navController animated:YES completion:nil]; 您正在进行模式演示,并且您不会将父视图控制器置于当前视图下方。相反,你会得到UIWindow,所以它可能会在那里变黑,这不是你想要的。

因此,为了做你想做的事,你需要将你的控制器呈现为一个childViewController,并将它的视图添加到你的父控制器视图中,如下所示:

UIViewController *viewController = [[UIViewController alloc] init];

[self addChildViewController:viewController];
[self viewWillDisappear:animated];
[self.view addSubview:viewController.view];
[self.view bringSubviewToFront:viewController.view];
[viewController didMoveToParentViewController:parentController];
[self viewDidDisappear:animated];

并删除UIViewController

[controller.view removeFromSuperview];
[controller willMoveToParentViewController:nil];
[controller.parentViewController viewDidAppear:animated];
[controller removeFromParentViewController];

答案 2 :(得分:1)

如果您想添加叠加层,首先需要确保使用iOS 7的新ViewController转换API。这是一个快速教程Objc.io View Controller Transitions

一旦你完成,你应该有一个动画师和一个符合UIViewControllerTransitioningDelegate协议的viewcontroller。

然后,当您想要呈现控制器时,需要将模态表示样式设置为UIModalPresentationStyleCustom而不是CurrentContext。当然,您的动画师需要配置所呈现控制器的框架,以便您仍然可以看到下面的内容。

这是另一个可能有帮助的教程 - Custom presentations

最后但并非最不重要的是,你将不得不处理任何方向的演示场景,如果你没有在旋转时看到奇怪的行为,因为过渡的容器仍然是纵向的。请在此处查看我的回答 - transitions in any orientation

答案 3 :(得分:1)

UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBarHidden = YES;

navController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:navController animated:YES completion:nil];

使用情节提要标识符启动viewController,它可能有帮助

答案 4 :(得分:1)

如果有帮助,请告诉我,当前视图控制器将被取消,以便动画开始。

UIViewController *viewController = [[UIViewController alloc] init];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
navController.navigationBarHidden = YES;

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self dismissViewControllerAnimated:YES completion:^{
  [self presentViewController:navController animated:YES completion:nil];
}];