dispositivos - iphone con ios 8 o posterior
Falta el fondo de la barra de pestañas en iOS 7.1 después de presentar y descartar un controlador de vista (3)
Ha pasado un tiempo, así que reitero el problema. La barra de pestañas de iOS 7 (en el dispositivo) se vuelve completamente transparente en el dispositivo, pero funciona bien en el simulador. Parece suceder después de pulsar Back
desde una página de detalles que tiene hidesBottomBarWhenPushed
habilitado.
La configuración del Tab Bar Controller
> Tab Bar
> Background
a White Color
en el Storyboard
solucioné para mí. Esta solución mantiene intacta la translucidez.
Por alguna razón, tabBar.translucent
y apagar tabBar.translucent
nuevamente en ViewDidAppear
no funcionó para mí.
Utilizando Xcode 6.3.1 con Swift.
Probé mi aplicación en iOS 7.1 y descubrí que el fondo de la barra de pestañas desaparece en algunas ocasiones. Pude localizarlos; sucede cuando
- presionando un controlador de vista colocado dentro del controlador de navegación (que está dentro del controlador de la barra de pestañas) con
hidesBottomBarWhenPushed = YES
- presentando un controlador de vista y luego descartándolo (es decir,
MFMailComposeViewController
)
He creado una aplicación de muestra (usé la plantilla de la barra de pestañas + el botón agregado para mostrar el controlador de vista, y un mapView para poder saber si la barra desapareció), y el problema está ahí.
Aquí está todo el código para la aplicación de muestra que cambié:
#import "FirstViewController.h"
@import MessageUI;
@interface FirstViewController () <MFMailComposeViewControllerDelegate>
@end
@implementation FirstViewController
- (IBAction)presentVCButtonPressed:(id)sender {
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
mailer.mailComposeDelegate = self;
[mailer setSubject:@"Feedback for Routie"];
[mailer setToRecipients:@[@"[email protected]"]];
[self presentViewController:mailer animated:YES completion:nil];
}
}
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
Aquí puedes descargar todo el proyecto de muestra .
Ahora, lo importante: esto parece no afectar al iPhone 5, ni al simulador. El problema está en el iPhone 4 y el iPod Touch (última generación a partir de la redacción de esta publicación).
¿Alguno de ustedes tiene el mismo problema? ¿Fuiste capaz de arreglarlo? ¡Gracias!
Actualización: he encontrado una solución. Vea mi respuesta a continuación.
Vaya a su Main.storyboard y seleccione su MKMapView para resaltarlo (consulte en el área del navegador, puede seleccionar «Vista de mapa»). Luego mire con cuidado dónde está el "cuadrado blanco" inferior: ¡muévalo hacia arriba en la barra inferior! En el inspector de tamaño, puede verificar dónde se encuentra el «ancla» o ver el origen de esta vista (consulte la parte superior izquierda de su proyecto). Esto explica por qué está bien para el iPhone 5 que tiene una pantalla de mayor altura.
Arreglo encontrado
Así que después de un poco de investigación (y dolor de cabeza), descubrí que hay una solución simple. Solo alterna la propiedad translucent
, de esta manera:
tabBar.translucent = NO;
tabBar.translucent = YES;
Ahora en cuanto a cuándo hacer esto, hay varios lugares para cada caso:
1) presionando viewController con hidesBottomBarWhenPushed = YES
El fondo de la barra desaparece justo después de que finalice la animación pop, así que agregue la corrección al método viewDidAppear:
del controlador de vista que lo presentó:
- (void)viewDidAppear:(BOOL)animated {
self.navigationController.tabBarController.tabBar.translucent = NO;
self.navigationController.tabBarController.tabBar.translucent = YES;
...
}
2) Presentar un controlador de vista y luego descartarlo:
En este caso, el fondo de la barra de pestañas ya desapareció durante la animación de descartar. Puede hacerlo en cada viewController que presente por separado o, si ha subclasificado en UITabBarController
(como el que tengo), puede agregarlo a su método viewWillAppear
. Solo tenga en cuenta que llamar a la solución de inmediato no ayudará (lo he intentado); Es por eso que utilicé la función dispatch_after GCD:
- (void)viewWillAppear:(BOOL)animated {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.tabBar.translucent = NO;
self.tabBar.translucent = YES;
});
...
}
Sé que esta no es la forma más limpia, pero está claro que es un error del lado de Apple, y es probable que se quede con nosotros por un tiempo (supongo que no habrá iOS 7.2, así que lo más probable es que nos quedemos con esto hasta iOS 8 sale).