Нет анимации, когда modalPresentationStyle установлен в UIModalPresentationCurrentContext
Когда я представляю свой UIViewController
с modalPresentationStyle
родительского UINavigationController
, установленного на 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
представлял как оверлей.
BTW: Когда отклоняется ViewController
, анимация работает нормально.
Ответы
Ответ 1
В соответствии с определением заголовка 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];
Ответ 2
Если вы хотите, чтобы 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];
Ответ 3
Если вы хотите добавить оверлей, первое, что вам нужно сделать, это убедиться, что вы используете новый API перехода ViewController для iOS 7. Вот небольшой учебник Переходы контроллера Objc.io View
Как только вы закончите, у вас должен быть аниматор и диспетчер представлений, который соответствует протоколу UIViewControllerTransitioningDelegate.
Затем, когда вы хотите представить свой контроллер, вам нужно установить стиль модальной презентации в UIModalPresentationStyleCustom, а не CurrentContext. Естественно, вашему аниматору нужно будет настроить кадр представленного контроллера, чтобы вы все еще могли видеть содержимое внизу.
Вот еще один учебник, который может помочь - Пользовательские презентации
Наконец, но не в последнюю очередь вам придется обрабатывать сценарий презентаций в любой ориентации, если вы этого не сделаете, вы увидите странное поведение при повороте, потому что контейнер перехода остается в портрете. См. Мой ответ здесь - переходы в любой ориентации
Ответ 4
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 с идентификатором раскадровки, он может помочь
Ответ 5
Дайте мне знать, если это поможет, текущий диспетчер представлений будет уволен, чтобы начать анимацию.
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];
}];