iphone - Fondo transparente con un controlador UIView modal
uiviewcontroller uinavigationcontroller (6)
Tengo un dilema, quiero presentar al usuario una vista semitransparente.
Descubrí experimentando que si simplemente empujaba la vista transparente a la parte superior de la pila de mi controlador de navegación, no generaría el nivel de transparencia que quería. Así que decidí simplemente agregar la vista como una subvista de la vista actual en la parte superior de la pila.
Esta solución funciona, la vista a continuación sigue siendo visible, y la vista es "semimodal". El problema es que si la vista principal se hereda de UITableViewController (como la mía), entonces la vista que "presiono" no cubre la barra de navegación en la parte superior.
Realmente no quiero entrar en una situación en la que me veo forzado a habilitar / deshabilitar los controles en la barra de navegación cada vez que presiono esta vista, así que me preguntaba si alguien sabía de alguna solución que pudiera usar para que la vista Presiono sobre el UITableViewController ¿realmente presionará sobre la barra de navegación?
¿Ha intentado recorrer en bucle las subvistas del Controlador de vista modal y configurar el color de fondo para que se vea cada vista? Esta es una función recursiva 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]];
}
}
Para usarlo llame:
[self setBackgroundToClearForView:self.view];
en viewDidLoad
.
Ahora hay una manera de lograr esto utilizando las transiciones personalizadas de iOS7:
MyController * controller = [MyController new];
[controller setTransitioningDelegate:self.transitionController];
controller.modalPresentationStyle = UIModalPresentationCustom;
[self controller animated:YES completion:nil];
Para crear su transición personalizada, necesita 2 cosas:
- Un objeto TransitionDelegate (implementando
<UIViewControllerTransitionDelegate>
) - Un objeto "AnimatedTransitioning" (implementando
<UIViewControllerAnimatedTransitioning>
)
Puede encontrar más información sobre transiciones personalizadas en este tutorial: http://www.doubleencore.com/2013/09/ios-7-custom-transitions/
Es gracioso, yo estaba haciendo lo mismo ayer. Desafortunadamente parece ser imposible. Una vez que el controlador de vista modal está en su lugar, la vista anterior se oculta. Ver esta pregunta anterior sobre el tema .
Aún puede usar el controlador de vista y los archivos NIB que ha configurado. Aquí está mi código de muestra
- (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;
}
Deberá almacenar una referencia al controlador de vista principal en el controlador de vista modal para que pueda acceder al método -hide
. Hice esto a través de un delegado.
También sería fácil agregar un poco de animación a -show
y -hide
si quieres que se anime desde la parte inferior de la pantalla. Era demasiado perezoso para hacer esto.
Esto hará el truco ... Prueba este.
// 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];
Para que la vista sea a pantalla completa a diferencia de UIModalPresentationFormSheet ..
Prueba esto:
ViewController *vc = [[ViewController alloc] init];
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[self presentViewController:vc animated:YES completion:nil];
iOS 8 agregó el estilo de presentación UIModalPresentationOverFullScreen
. Establézcalo como el estilo modalPresentationStyle
del controlador de vista presentado. Para necesidades más avanzadas, considere crear un controlador de presentación personalizado.