Pregunta Botón Atrás que extrañamente desaparece en UINavigationController pero sigue funcionando


En iOS7 he estado experimentando un problema en el que el elemento del botón de retroceso no se mostrará si se ha configurado con una imagen de fondo específica:

int imageSize = 21; //REPLACE WITH YOUR IMAGE WIDTH

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-400.f, 0)
                                                   forBarMetrics:UIBarMetricsDefault];
UIImage *barBackBtnImg = [[UIImage imageNamed:@"BackArrowDark.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, imageSize, 0, 0)];

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:barBackBtnImg
                                                forState:UIControlStateNormal
                                              barMetrics:UIBarMetricsDefault];

Al hacer esto, cualquier ViewController que presione en el controlador de navegación no tendrá ningún ítem de botón de retroceso, aunque presionando donde debería estar, lo hará aparecer, y cualquier empuje posterior de este controlador de vista tendrá el botón presente en la pantalla .

Este problema solo aparece en iOS7: todo funciona perfectamente en iOS6.

Cambiar el botón Atrás completamente con LeftBarButtonItem deshabilita el deslizamiento hacia atrás, por lo que no es una opción.

¿Alguna idea de lo que estoy haciendo mal?

Muchas gracias por su consideración.


8
2017-10-07 23:14


origen


Respuestas:


Después de probar diferentes soluciones, descubrí que cambiar el backIndicatorImage funciona mejor en iOS7, y parece estar en línea con el paradigma de la interfaz iOS7:

[[UINavigationBar appearance] setTintColor:[UIColor grayColor]];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault]; // Takes out title

UIImage *backButtonImage = [UIImage imageNamed:@"BackArrowDark.png"];

if ([UINavigationBar instancesRespondToSelector:@selector(setBackIndicatorImage:)]) {
  [[UINavigationBar appearance] setBackIndicatorImage:backButtonImage];
  [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backButtonImage];
} else {
  int imageSize = 21; // REPLACE WITH YOUR IMAGE WIDTH

  [[UIBarButtonItem appearance] setBackButtonBackgroundImage:[backButtonImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, imageSize, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
}

Con este método:

  • Cuando retrocede en el controlador de navegación, la transición de elementos del botón de retroceso es la misma que con el indicador predeterminado (una desviación del botón de retroceso también se desliza en iOS6);
  • En iOS6, el BackButton se cambia y mantiene su comportamiento iOS6 predeterminado.
  • ¡Estoy feliz!

14
2017-10-08 02:54



Asegúrese de que no está llamando a esto en el controlador de vista:

self.navigationController.navigationBar.tintColor = [UIColor redColor];

En iOS 7, esto tiñerá la barra de navegación pero también hará que sus botones sean invisibles, pero funcionales tal como lo describe.


3
2017-12-31 16:39