usar una propiedad poner para img imagen funciona emplea ejemplo como atributos atributo agregar ios ios11

ios - una - propiedad alt imagen



Imagen del indicador de respaldo personalizado y iOS 11 (9)

Estoy usando un botón de retroceso personalizado en mi aplicación. Este botón de retroceso personalizado se configura globalmente de esta manera:

UINavigationBar.appearance().backIndicatorImage = UIImage(named: "Back").withRenderingMode(.alwaysOriginal) UINavigationBar.appearance().backIndicatorTransitionMaskImage = UIImage(asset: .back).withRenderingMode(.alwaysOriginal)

Antes de iOS 11, este código funcionó, pero ahora en iOS 11, el botón ya no está centrado verticalmente, como puede ver aquí:

Podría cambiar la altura de la imagen del botón de retroceso a 44, pero eso lo rompería en iOS <11. También podría usar dos imágenes diferentes, pero estaba buscando algo más limpio, como una forma de centrar verticalmente la imagen en la parte posterior Botón contenedor de vista.

EDITAR:

Resulta que, como dijo banxii1988, el problema es causado por setBackButtonTitlePositionAdjustment cuando los valores mueven deliberadamente el título fuera de la pantalla visible. Eso fue un truco para evitar eliminar el título del botón Atrás en cada controlador de vista. Decidí eliminar este truco e hice lo correcto que es:

  1. establezca el elemento del botón Atrás en el guión gráfico en " " .
  2. en cada controlador de vista sin un guión gráfico asociado, configuro el backBarButtonItem programm navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Tenga en cuenta que el título del botón Atrás que ve en un controlador de vista se establece en el anterior en la pila de navegación.


PARA SWIFT 3+

if #available(iOS 11, *) { UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal) UIBarButtonItem.appearance().setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .highlighted) } else { UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default) }


1) elimine el ajuste de posición si tiene alguno. como

bap.setBackButtonTitlePositionAdjustment(UIOffset(horizontal: 0, vertical: -64), for: .default)

2) comprobar si el ViewController anterior en la pila de navegación tiene un título


1.

extension UINavigationController { func pushViewC(_ viewController: UIViewController, animated: Bool) { viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "return").withRenderingMode(.alwaysOriginal), style: .plain, target: navigationController, action: #selector(popViewController(animated:))) pushViewController(viewController, animated: animated) } }

2.Utilice pushViewC en lugar de pushViewController

navigationController?.pushViewC(otherVC, animated: true)


Creo que este método está bien! Es útil para mí.

if(@available(iOS 11, *)) { [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal]; [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted]; } else { [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault]; }


Después de varios intentos y fallos, esto nos funcionó para iOS 11:

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, -5) forBarMetrics:UIBarMetricsDefault];

El truco consistió en mover el texto "Atrás" en el eje x bastante hacia atrás, y un poco en el eje y, ya que setBackButtonTitlePositionAdjustment resultó afectar tanto la imagen como el texto.

Sin embargo, no sabemos por cuánto tiempo funcionará esta solución, podría ser "arreglada" por Apple en cualquier momento


Esta solución me funciona para iOS 9, 10 y 11.

var backButtonImage: UIImage = UIImage(named: "backButton")! UINavigationBar.appearance().backIndicatorImage = backButtonImage UINavigationBar.appearance().backIndicatorTransitionMaskImage = backButtonImage if #available(iOS 11, *) { UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-300, 0), for:UIBarMetrics.default) } else { UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -200), for:UIBarMetrics.default) }


Recomendaría el método swizzling para resolverlo, he usado esta solución en algunos de mis proyectos y funciona bien.

1 - crear una categoría de UIViewController .

2- importar #import <objc/runtime.h> .

3- pega el siguiente método

#import "UIViewController+Extras.h" #import <objc/runtime.h> @implementation UIViewController (Extras) + (void)load { static dispatch_once_t once_token; dispatch_once(&once_token, ^{ SEL viewDidLoadSelector = @selector(viewDidLoad); SEL viewDidLoadModifyBackButtonSelector = @selector(modifyBackButton_viewDidLoad); Method originalMethod = class_getInstanceMethod(self, viewDidLoadSelector); Method extendedMethod = class_getInstanceMethod(self, viewDidLoadModifyBackButtonSelector); method_exchangeImplementations(originalMethod, extendedMethod); }); } - (void)modifyBackButton_viewDidLoad { [self modifyBackButton_viewDidLoad]; self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:self.navigationItem.backBarButtonItem.style target:nil action:nil]; } @end


Para quien no pudo resolverlo:

1) Busque "setBackButtonTitle" en su proyecto (cmd + shift + f), encontrará un código como el siguiente:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[xController class]]] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

2) Cambie el código de arriba con este:

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[xController class]]] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, 0) forBarMetrics:UIBarMetricsDefault];

Desde iOS 11, sobre el código que usamos para ocultar los títulos de los botones de retroceso, el botón de retroceder junto con el título mismo. Sin embargo, si simplemente mueve el título del botón Atrás horizontalmente, todo funciona bien y no hay remates.


if(@available(iOS 11, *)) { [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal]; [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateHighlighted]; } else { [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault]; }

La solución anterior de @Tonin funciona, pero la única preocupación es que el texto del botón izquierdo de la barra de navegación (como "Cancelar") sea transparente (color claro) cuando se comparte con otra aplicación (correo electrónico, mensaje, etc.), color de la tapa si es necesario compartir la función:

UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[title, URL] applicationActivities:nil]; [activityViewController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { // set clear color when back from share [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]} forState:UIControlStateNormal]; }]; [self presentViewController:activityViewController animated:YES completion:^{ // set white color when share to other app [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} forState:UIControlStateNormal]; }];