Прозрачный фон с модальным UIViewController
У меня есть дилемма, я хочу представить пользователю полупрозрачный вид.
Я узнал, экспериментируя, что если я просто подтолкнув прозрачный вид к вершине моего стека NavigationController, это не сделает уровень прозрачности, который я хотел. Поэтому я решил просто добавить представление в виде подсмотра текущего представления в верхней части стека.
Это решение работает, вид ниже все еще виден, а представление является "полумодальным". Проблема в том, что если родительский вид наследуется от UITableViewController (как и мой), то представление, которое я нажимаю на него, не распространяется на панель навигации вверху.
Я действительно не хочу попасть в ситуацию, когда я вынужден включать/отключать элементы управления на панели навигации каждый раз, когда я нажимаю это представление, поэтому мне было интересно, если бы кто-нибудь знал о любых решениях, которые я мог бы использовать так что вид, который я нажимаю на UITableViewController, фактически "нажмет" панель навигации?
Ответы
Ответ 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.