UIModalPresentationCurrentContext с переходом?
Я пытаюсь модально представить контроллер вида, как показано ниже:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"addPopover"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:vc animated:YES];
Сейчас использую UIModalPresentationCurrentContext
означает, что я могу представить этот вид с прозрачным фоном и увидеть мой другой вид за новым. Однако, это мешает мне быть в состоянии представить это с переходом.
Есть идеи почему? Или как я могу обойти это? Благодарю.
3 ответа
Полноэкранные модалы не должны позволять вам видеть нижний слой. Раздражает я знаю.
Исходя из вашего кода, я предполагаю, что "addPopover" на самом деле является полноэкранным представлением, где ваш контент представлен в виде подраздела, а остальное прозрачно.
Попробуй это:
vc.modalPresentationStyle = UIModalPresentationCurrentContext;
vc.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:vc animated:YES completion:NULL];
Примечание. Я бы порекомендовал добавить низкий фоновый цвет альфа, чтобы пользователь знал, что он не может взаимодействовать с остальной частью представления, когда вы добавляете это поверх...
Я смог сделать это, установив modalPresentationStyle = UIModalPresentationCurrentContext
на rootViewController моего UIWindow, ЕСЛИ я не представил никаких новых полноэкранных viewControllers поверх этого rootViewController. Я сделал что-то вроде этого:
UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:YES completion:nil];
Я пробовал это с UINavigationController в качестве rootViewController моего окна и различных других пользовательских контроллеров представления. Кажется, что пока rootViewController окна знает, что происходит, любой sub-viewController может вызывать presentViewController:animated:completion:
без затемнения основного представления.
Однако, допустим, вы представляете другой viewController поверх rootViewController вашего окна. И этот новый viewController представлен с modalPresentationStyle = UIModalPresentationFullScreen
(т.е. занимает экран), то вам нужно позвонить modalPresentationStyle = UIModalPresentationCurrentContext
на этом самом верхнем viewController.
Итак, резюмируем:
- Если у вас есть UINavigationController -> UIViewController(s) (их можно вставлять и извлекать), тогда вы устанавливаете
modalPresentationStyle = UIModalPresentationCurrentContext
на UINavigationController. - Если у вас есть UINavigationController -> UIViewController -> new-UIViewController (с modalPresentationStyle, установленным в UIModalPresentationFullScreen), то вы устанавливаете
modalPresentationStyle = UIModalPresentationCurrentContext
на новый-UIViewController.
Надеюсь, это работает и для вас, ребята!
Предложения мистера Т сработали почти идеально, вы просто потеряете анимацию перехода на представленном контроллере вида
Так как он также устанавливает стиль представления appDelegates rootviewController, он также удалит анимации перехода для любых представлений, представленных с этой точки.
Мое исправление состояло в том, чтобы вернуть стиль представления AppDelegates rootViewController обратно к его стандартному значению всякий раз, когда viewcontroller закрыт, когда мне нужен прозрачный фон на
У меня есть кнопка, которая отклоняет представленный ViewViewController, и я также устанавливаю стиль представления rootViewController обратно по умолчанию, используя:
UIViewController *rootViewController = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;
Я надеюсь, что это поможет кому-то еще быть поставленным в тупик по этой проблеме.