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

Прозрачный фон с модальным UIViewController

У меня есть дилемма, я хочу представить пользователю полупрозрачный вид.

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

Это решение работает, вид ниже все еще виден, а представление является "полумодальным". Проблема в том, что если родительский вид наследуется от UITableViewController (как и мой), то представление, которое я нажимаю на него, не распространяется на панель навигации вверху.

Я действительно не хочу попасть в ситуацию, когда я вынужден включать/отключать элементы управления на панели навигации каждый раз, когда я нажимаю это представление, поэтому мне было интересно, если бы кто-нибудь знал о любых решениях, которые я мог бы использовать так что вид, который я нажимаю на UITableViewController, фактически "нажмет" панель навигации?

4b9b3361

Ответ 1

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

Вы все равно можете использовать контроллер представления и файлы NIB, которые вы создали - здесь мой пример кода

- (void)showUpgrade {
    [self.upgradeVC viewWillAppear:NO];
    [self.view addSubview:self.upgradeVC.view];
    [self.upgradeVC viewDidAppear:NO];
}

- (void)hideUpgrade {
    [self.upgradeVC viewWillDisappear:NO];
    [self.upgradeVC.view removeFromSuperview];
    [self.upgradeVC viewDidDisappear:NO];
}

- (UpgradeViewController *)upgradeVC {
    if (_upgradeVC == nil) {
        _upgradeVC = [[UpgradeViewController alloc] initWithNibName:[NSString stringWithFormat:@"UpgradeView_%@", self.deviceType] bundle:nil];
        _upgradeVC.delegate = self;
    }
    return _upgradeVC;
}

Вам нужно будет сохранить ссылку на родительский контроллер представления в модульном контроллере просмотра, чтобы вы могли получить доступ к методу -hide. Я сделал это через делегата.

Также было бы легко добавить анимацию к -show и -hide, если вы хотите, чтобы она анимировалась снизу экрана - мне было слишком лениво сделать это.

Ответ 2

iOS 8 добавил стиль UIModalPresentationOverFullScreen . Установите это как представленные контроллеры представления modalPresentationStyle. Для более продвинутых потребностей изучите создание пользовательского контроллера презентаций.

Ответ 3

Теперь есть способ достичь этого с помощью пользовательских переходов iOS7:

MyController * controller = [MyController new];
[controller setTransitioningDelegate:self.transitionController];
controller.modalPresentationStyle = UIModalPresentationCustom;
[self controller animated:YES completion:nil];

Чтобы создать свой настраиваемый переход, вам нужно 2 вещи:

  • Объект TransitionDelegate (реализация <UIViewControllerTransitionDelegate>)
  • Объект "AnimatedTransitioning" (реализация <UIViewControllerAnimatedTransitioning>)

Дополнительную информацию о пользовательских переходах можно найти в этом уроке: http://www.doubleencore.com/2013/09/ios-7-custom-transitions/

Ответ 4

Попробуйте следующее:

ViewController *vc = [[ViewController alloc] init];
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:vc animated:YES completion:nil];

Ответ 5

Пробовали ли вы перебирать подзоны Modal View Controller и устанавливать цвет фона для очистки для каждого вида? Это рекурсивная функция DFS.

- (void)setBackgroundToClearForView:(UIView *)view {
    if ([view subviews]) {
        for (UIView *subView in [view subviews]) {
            [self setBackgroundToClearForView:subView];
        }
    }

    if ([view respondsToSelector:@selector(setBackgroundColor:)]) {
        [view performSelector:@selector(setBackgroundColor:)
                   withObject:[UIColor clearColor]];
    }
}

Чтобы использовать вызов:

[self setBackgroundToClearForView:self.view];

в viewDidLoad.

Ответ 6

Это сделает трюк. Попробуйте это.

// for clear color or you can easily adjust the alpha here
 YourVC *vc=[[YourVC alloc]initWithNibName:@"YourVC" bundle:nil] ;
 vc.view.backgroundColor = [UIColor clearColor];
 self.modalPresentationStyle = UIModalPresentationCurrentContext;
 [self presentViewController:vc animated:NO completion:nil];

Таким образом, представление будет полноэкранным, в отличие от UIModalPresentationFormSheet.