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

IOS - Полупрозрачный контроллер модального просмотра

Я хочу представить контроллер вида с слегка прозрачным фоном по сравнению с текущим видом, таким образом, чтобы первое представление было слегка видимым под модальным представлением.

Я установил альфа-значение модуля управления модальным изображением и установил modalPresentationStyle в UIModalPresentationCurrentContext, как это было предложено в другом сообщении.

Результат заключается в том, что во время анимации фон представления прозрачен, но когда контроллер просмотра находится на месте, он изменяется на непрозрачный черный. Он возвращается к прозрачности, оживляя увольнение.

Как я могу заставить его быть прозрачным, когда он активен?

Я тестировал в iOS 6 and 7. Код, который я использую, следующий:

MyModalViewController *viewController = [[MyModalViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
[navController setNavigationBarHidden:YES];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self.navigationController presentViewController:navController animated:YES completion:NULL];
4b9b3361

Ответ 1

iOS 8 специально для этой цели добавила новый стиль модальной презентации:

presentedViewController.modalPresentationStyle = UIModalPresentationOverFullScreen

Из spec:

UIModalPresentationOverFullScreen

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

Ответ 2

Если вы ориентируетесь на ios 8 и выше, вы можете установить стиль модальной презентации "по текущему контексту", и все готово. Если ios 7 и ниже, вам нужно будет создать собственный стиль перехода, чтобы экран представления не исчезал после перехода. Это довольно сложно.

Решение, предлагаемое мной, предлагает большую гибкость: сделайте снимок экрана перед показом модального диалога и установите его как фоновое изображение для окна приложения. По умолчанию этот фон черный (это то, что вы видите, когда контроллер заднего вида исчезает). Измените фон на скриншот приложения. Сделайте снимок экрана в режиме viewWillAppear или viewDidLoad вашего прозрачного представления. Это работает даже с push-сегментами, а не только с модальными диалогами, но вы должны избегать анимации. В общем, избегайте анимации, которые влияют на положение фонового представления, потому что это заставит его казаться, что он снова встает на место, когда переход завершается. Это хорошая идея для reset фона для его предыдущего черного изображения на viewDidDissapear, чтобы избежать нежелательных эффектов.

Вы можете поддерживать стек таких фоновых изображений, и вы можете выполнять несколько "прозрачных" нажатий. Или у вас есть сложное/глубокое меню, которое появляется поверх некоторого основного экрана. По этим многим причинам я считаю, что это решение лучше, чем сворачивание собственного кода перехода. Это более гибко и проще в реализации, и вам не обязательно иметь дело с анимацией.

Ответ 3

Причина того, что контроллеры представлений BG исчезают после отображения модальности, заключается в том, что переход по умолчанию в iOS 7 удаляет представление BG после завершения анимации. Если вы определите свой собственный переход и вы не сможете удалить BG-представление (просто изменив его альфу), вы получите прозрачный вид модальности.

Ответ 4

Вот решение.

Создайте свой контроллер представления. Добавьте backView к главному виду контроллера этого вида. Назовите это как backView.

В SecondViewController.m

-(void)viewDidLoad
{
    // Make the main view background clear, the second view background transparent.
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view addSubview:backView];
}

Теперь у вас есть контроллер вида с полупрозрачным фоном. Вы можете добавить все, что хотите, к self.view, остальные будут наполовину прозрачными.

После этого в FirstViewController.m

self.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:secondViewController animated:YES completion:nil];

Ответ 5

Мое решение таково:

Создайте пользовательский прозрачный оверлейный UIView, который выходит на любой вид, навигационную панель и панель табуляции.

- В контроллере навигации (или контроллере табуляции), в который встроен ваш контроллер представления, я создаю пользовательское представление, при этом кадр равен кадру вида контроллера навигации.

-Тогда я установил его на экране, установив его origin.y на navigationController.view.height

-Тогда я создаю 2 функции - (void) showOverlay и - (void) hideOverlay, которые оживляют отображение наложения и выходят за экран:

- (void)hideOverlay{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.3];

    CGRect frm = self.helpView.frame;//helpView is my overlay
    frm.origin.y = self.offscreenOffset; //this is an Y offscreen usually self.view.height
    self.helpView.frame = frm;

    [UIView commitAnimations];
}

- (void)showOverlay{

    [self.view bringSubviewToFront:self.helpView];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.3];

    CGRect frm = self.helpView.frame;
    frm.origin.y = self.onscreenOffset;
    self.helpView.frame = frm;

    [UIView commitAnimations];
}

- На мой взгляд, контроллер я могу просто позвонить

[(MyCustomNavCtrl *)self.navigationController showOverlay];
[(MyCustomNavCtrl *)self.navigationController hideOverlay];

И что об этом.

Ответ 6

FYI: Синтаксис теперь:

    childVC.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen

Ответ 7

Почему бы вам не попробовать установить это в AppDelegate

self.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;

затем изменение альфы на представленном представлении