Подтвердить что ты не робот

Нет анимации, когда 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, анимация работает нормально.

4b9b3361

Ответ 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];
}];