Прозрачный фон с модальным UIViewController - PullRequest
20 голосов
/ 05 апреля 2010

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

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

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

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

Ответы [ 6 ]

13 голосов
/ 25 августа 2015

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

13 голосов
/ 05 апреля 2010

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

. Вы все еще можете использовать настроенный вами контроллер представления и файлы 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, если вы хотите, чтобы она оживляла вверх от нижней части экрана - мне было просто леньсделай это.

11 голосов
/ 17 января 2014

Теперь есть способ добиться этого с помощью пользовательских переходов 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/

0 голосов
/ 31 июля 2015

Попробуйте это:

ViewController *vc = [[ViewController alloc] init];
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:vc animated:YES completion:nil];
0 голосов
/ 12 апреля 2013

Это поможет. Попробуйте это.

// 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 ..

0 голосов
/ 05 апреля 2010

Вы пробовали зацикливаться на подпредставлениях 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.

...