2013-02-17 2 views
12

Когда я представляю свою UIViewController с modalPresentationStyle родительского UINavigationController набора для UIModalPresentationCurrentContext, то UIViewController не втягивается. Там нет перехода используется.Нет анимации, когда modalPresentationStyle установлен в UIModalPresentationCurrentContext

Вот мой код:

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

+0

Вы когда-нибудь находили решение этого вопроса? – Alf

+0

У меня такая же проблема. Вы когда-нибудь находили решение? –

ответ

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]; 
+0

Это неправильно! Если вы используете UIModalPresentationCurrentContext, базовый viewController все еще отображается! Попробуйте, представив слегка прозрачный viewController! – Alexander

+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

Если вы хотите добавить накладку первое, что вам нужно сделать, это убедиться, что вы используете новый переход ViewController API iOS 7. Вот краткое руководство Objc.io View Controller Transitions

После того, как вы закончите, у вас должен быть аниматор и контролер просмотра, соответствующий протоколу UIViewControllerTransitioningDelegate.

Затем, когда вы хотите представить свой контроллер, вам необходимо установить стиль модальной презентации UIModalPresentationStyleCustom, а не CurrentContext. Естественно, вашему аниматору нужно будет настроить кадр представленного контроллера, чтобы вы все еще могли видеть содержимое внизу.

Вот еще один учебник, который может помочь - Custom presentations

И последнее, но не в последнюю очередь вы будете иметь, чтобы справиться сценарий презентации в любой ориентации, если вы этого не сделаете, вы увидите странное поведение при повороте из-за контейнера перехода остается в портрете.Смотрите мой ответ здесь - transitions in any orientation

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 с раскадровки идентификатором, это может помочь

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]; 
}];