Модальность UIViewController PresentViewController не анимируется в iOS7

Вызов presentViewController:animated:completion: не анимируется в iOS7. Представление просто мгновенно появляется. Анимация работает корректно в iOS8. Настоящий метод вызывается в трех разных местах моего приложения, и все они отображают это поведение. Это происходит как на устройстве, так и на симуляторе.

Последующий вызов dismissViewControllerAnimated:completion: правильно анимируется во всех версиях iOS.

Структура кода

Контроллер представления, вызывающий настоящий метод, является корневым контроллером представления UINavigationController, а этот контроллер навигации является одним из viewControllers в UITabBarController.

Каждый вызов прост и запускается нажатием кнопки. Вот один из случаев:

GenreViewController *controller = [[GenreViewController alloc] init]; [self presentViewController:controller animated:YES completion:nil];

Попытки исправления

  • Явная отправка в основной поток
  • Звонок [UIView setAnimationsEnabled:YES] перед презентацией
  • Добавление задержки для отображения контроллера (просто посмотреть, что произойдет)

В каждом случае поведение не менялось.
Будем очень признательны за любую помощь!

ОБНОВЛЕНИЕ - ИСПРАВЛЕНИЕ

Оказывается, у UITabBarController свойство modalPresentationStyle было установлено на UIModalPresentationCurrentContext. Это не будет анимироваться в iOS7, и вместо этого вы должны использовать стиль представления UIModalPresentationFullScreen.


person JohnG    schedule 01.07.2015    source источник
comment
Вы переопределили метод инициализации для своего GenreViewController? возможно, вам следует попробовать GenreViewController *vc = [[GenreViewController alloc] initWithNibName:NSStringFromClass([GenreViewController class]) bundle:nil];   -  person Doro    schedule 01.07.2015
comment
@Doro Я попробовал initWithNibName:bundle: (и убедился, что все мои суперклассы также вызывают его), но презентация все еще не анимировалась.   -  person JohnG    schedule 01.07.2015


Ответы (4)


вы можете использовать это

   GenreViewController *addController = [[GenreViewController alloc]

                       init];
   UINavigationController *navigationController = [[UINavigationController alloc]

                             initWithRootViewController:addController];

   [self presentViewController:navigationController animated:YES completion: nil];
person BKjadav    schedule 01.07.2015
comment
То же поведение, контроллер не анимируется. - person JohnG; 01.07.2015
comment
Используйте установленный модальный стиль перехода, как указано ниже, это может сработать. [navigationController setModalTransitionStyle:UIModalPresentationPageSheet]; - person BKjadav; 01.07.2015
comment
Не повезло, по-прежнему нет анимации презентации с использованием UIModalPresentationPageSheet (как представление контроллера навигации, так и представление контроллера представления напрямую). - person JohnG; 01.07.2015

Оказывается, свойство UITabBarController имело значение modalPresentationStyle, равное UIModalPresentationCurrentContext. Это не будет анимироваться в iOS7, и вместо этого вы должны использовать стиль представления UIModalPresentationFullScreen.

person JohnG    schedule 01.07.2015

Согласно вашему комментарию

Насколько мне известно, эта анимация невозможна без NavigationController. Если вы создали все программно, вам также необходимо создать NavigationController программно и назначить один из ViewController в качестве корневого ViewController. Затем переходим к presentViewController.

Сделать глобальный UINavigationController в appDelegate и в didFinishLaunchingWithOptions

InitialViewController *initialVC = [[InitialViewController alloc] init];
self.navController = [[UINavigationController alloc] initWithRootViewController:initialVC];
self.window.rootViewController = self.navController;
[self.window makeKeyAndVisible];

И затем получите свой контроллер Appdelegate Navigation в конкретном ViewController, где вы хотите сделать презентацию.

Возможно, то, что вы создали NavigationController, не соответствует навигационной иерархии.

person Chetan Prajapati    schedule 01.07.2015
comment
Он был построен без раскадровки, все представления и контроллеры создаются программно. - person JohnG; 01.07.2015
comment
Я программно создаю UINavigationController и назначаю контроллер представления в качестве rootViewController. Это делается до вызова текущего метода. - person JohnG; 01.07.2015

Можете ли вы проверить это:

GenreViewController *controller = [[GenreViewController alloc] init];
controller.view.backgroundColor = [UIColor whiteColor]; // or some color of your choice
[self presentViewController:controller animated:YES completion:nil];

И посмотрите, работает ли это. Я считаю, что это может быть проблемой при программном использовании UIViewController.

person aman.sood    schedule 01.07.2015
comment
Не повезло, все еще нет анимации презентации. - person JohnG; 01.07.2015