bar ios user-interface uinavigationbar

search bar ios



Botón de retroceso personalizado de UINavigationBar sin título (30)

¿Cómo puedo personalizar el botón de retroceso de navegación en iOS 7 y superior sin título? (es decir, solo con la flecha)

self.navigationItem.leftBarButtonItem = self.editButtonItem;

Me pregunto si tienen algún self.backButtonItem;

O

¿algo como esto?

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemBACK target:self action:@selector(back)];


  1. Agregar nuevo UIBarButtonItem a UINavigationItem a la izquierda
  2. Cambie UIBarButtonItem cómo desea usar
  3. Ahora, haga clic en UINavigationItem y deslice barBackButtonItem desde los puntos de venta hacia la izquierda UIBarButtonItem


¡Solo usa una imagen!

OBJ-C :

- (void)viewDidLoad { [super viewDidLoad]; UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Icon-Back"] style:UIBarButtonItemStylePlain target:self.navigationController action:@selector(popViewControllerAnimated:)]; self.navigationItem.leftBarButtonItem = backButton; }

SWIFT 4 :

let backBTN = UIBarButtonItem(image: UIImage(named: "Back"), style: .plain, target: navigationController, action: #selector(UINavigationController.popViewController(animated:))) navigationItem.leftBarButtonItem = backBTN navigationController?.interactivePopGestureRecognizer?.delegate = self

Icon-Back.png

[email protected]

[email protected]


Apliqué el siguiente código en viewDidLoad y funciona:

// this will set the back button title self.navigationController.navigationBar.topItem.title = @"Test"; // this line set the back button and default icon color //[[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor blackColor]]; this line change the back default icon to your custom icon [[self.navigationController.navigationBar.subviews lastObject] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"menuicon"]]];

Solo para actualizar utilizo Vector Icon


Así es como lo hago y la forma más simple, funciona y más clara de hacerlo.

Esto funciona si está incrustado en el Navigation Controller

Swift 3

En viewDidLoad , agrego esto al controlador de vista que desea que el botón de retroceso sea solo una flecha.

if let topItem = self.navigationController?.navigationBar.topItem { topItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }

La diferencia de esto con la respuesta de @Kyle Begeman es que usted lo llama en el controlador de vista y quiere que el botón de retroceso sea solo una flecha, no en el controlador de la vista de pila.


Atrás el título vacío

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleDone target:self action:@selector(handleBack:)]; [backButton setTintColor:Color_WHITE]; [self.navigationItem setBackBarButtonItem:backButton];

Cambio de imagen

UIImage *backImg = [[UIImage imageNamed:@"ic_back_white"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; [UINavigationBar appearance].backIndicatorImage = backImg; [UINavigationBar appearance].backIndicatorTransitionMaskImage = backImg;


Cree una UILabel con el título que desea para su controlador de vista de raíz y asígnele el elemento de navigationItem.titleView del controlador de vista.

Ahora establezca el título en una cadena vacía y el siguiente controlador de vista que presione tendrá un botón de retroceso sin texto.

self.navigationItem.titleView = titleLabel; //Assuming you''ve created titleLabel above self.title = @"";


El hack simple de iOS6 también funciona en iOS7:

[UIBarButtonItem.appearance setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];

Edit: No uses este truco. Ver comentario para más detalles.


En el método prepareForSegue: de su primer ViewController, establece el título de las vistas en @ "", por lo que cuando se presione la siguiente vista, se mostrará el título anterior de ViewController que será @ "".

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ self.navigationItem.title = @" "; }

El único problema con esto es que cuando presionas el botón Atrás, tu vista anterior no tendrá un título, por lo que puedes agregarlo nuevamente en viewWillAppear:

-(void)viewWillAppear:(BOOL)animated{ self.navigationItem.title = @"First View Title"; }

No me gusta mucho esta solución pero funciona y no encontré otra forma de hacerlo.


En realidad es bastante fácil, esto es lo que hago:

C objetivo

// Set this in every view controller so that the back button displays back instead of the root view controller name self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];

Swift 2

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)

Swift 3

self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

Coloque esta línea en el controlador de vista que empuja hacia la pila ( el controlador de vista anterior ). El nuevo botón de retroceso del controlador de vista ahora mostrará lo que pones para initWithTitle, que en este caso es una cadena vacía.


Encontré una manera fácil de hacer mi botón Atrás con una sola flecha de iOS.

Supongamos que tiene un controlador de navegación que va a ViewA desde ViewB. En IB, seleccione la barra de navegación de ViewA, debería ver estas opciones: Título, Solicitud y Botón Atrás.

Opciones de la barra de navegación de ViewA

El truco es elegir el título del botón de retroceso de su controlador de vista de destino (ViewB) en las opciones del controlador de vista anterior (Vista A). Si no llena la opción "Botón Atrás", iOS colocará el título "Atrás" automáticamente, con el título del controlador de vista anterior . Por lo tanto, debe completar esta opción con un solo espacio.

Rellene el espacio en la opción "Botón Atrás"

El resultado:


Esto funciona, pero eliminará el título del elemento anterior, incluso si vuelves a aparecer:

self.navigationController.navigationBar.topItem.title = @"";

Simplemente configure esta propiedad en viewDidLoad del controlador de vista viewDidLoad .


He estado usando esta solución desde iOS 5 o algo así sin ningún problema. Hice una función de utilidad que llamo en mis controladores de vista. Necesitas hacerlo ya sea en viewDidLoad o en cualquier otro punto después de eso.

void updateBackButtonTextForViewController(UIViewController *viewController, NSString *text) { if(! viewController.navigationItem.backBarButtonItem) { viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:text style:UIBarButtonItemStylePlain target:nil action:nil]; } else { viewController.navigationItem.backBarButtonItem.title = text; } }

En algunos casos, el elemento de navegación ya puede existir, en otros casos debe crearse. Esto explica ambos casos sin alterar el título del elemento de navegación. Le permite eliminar el título simplemente pasando @"" .


La única forma en que funcionó para mí fue:

navigationController?.navigationBar.backItem?.title = ""

ACTUALIZAR:

Cuando cambié el indicador de animación segue a verdadero (antes era falso), la única manera que funcionó para mí fue:

navigationController?.navigationBar.topItem?.title = ""


No tiene acceso a la navegación backButtonItem con la forma que desea, necesita crear su propio botón de retroceso como el siguiente:

- (void)loadView { [super loadView]; UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 44.0f, 30.0f)]; [backButton setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal]; [backButton addTarget:self action:@selector(popVC) forControlEvents:UIControlEventTouchUpInside]; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; }

Y por supuesto:

- (void) popVC{ [self.navigationController popViewControllerAnimated:YES]; }


No tienes mucho que hacer. Puedes lograr lo mismo a través del guión gráfico.

Sólo tienes que ir al controlador de navegación de la raíz y dar un espacio. Recuerde no al controlador que deseaba el botón Atrás sin título, sino al controlador de navegación raíz.


Para agregar a la respuesta anterior de Thomas C , a veces poner un solo espacio no funciona y tienes que seguir agregando espacios.

Sabrá que tuvo éxito cuando vea "Elemento del botón de barra -" debajo del "Elemento de navegación". Eso está en el esquema del documento (Editor-> Mostrar esquema del documento). Una vez que vea la imagen de arriba, puede eliminar algunos espacios y ver si todavía funciona.


Ponga atrás el título del elemento del botón como Cadena vacía.

[self.navigationController.navigationBar.backItem setTitle: @ ""];


Puede colocar esa categoría en el archivo AppDelegate.m para eliminar texto de todos los botones de retroceso predeterminados en UINavigation. Solo la flecha "<" o establecer imagen personalizada si es necesario.

C objetivo:

...

@fin

@implementation UINavigationItem (Extension) - (UIBarButtonItem *)backBarButtonItem { return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @end


Puede subclase UINavigationController, establecerse como delegado y establecer backBarButtonItem en el método delegado navigationController:willShowViewController:animated:

@interface Custom_NavigationController : UINavigationController <UINavigationControllerDelegate> @end @implementation Custom_NavigationController - (void)viewDidLoad { [super viewDidLoad]; self.delegate = self; } #pragma mark - UINavigationControllerDelegate - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { viewController.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } @end


Puedes usar esto. Esto funciona perfectamente para mí, simplemente agregando un UIButton como custumview para el UIBarButtonItem .

Pruebe el siguiente código

self.navigationItem.leftBarButtonItem=[self backButton]; - (UIBarButtonItem *)backButton { UIImage *image = [UIImage imageNamed:@"back-btn.png"]; CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height); UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame]; [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [button setImage:image forState:UIControlStateNormal]; UIBarButtonItem *item= [[UIBarButtonItem alloc] initWithCustomView:button]; return item; }


Si bien la respuesta de Kyle Begeman resuelve el problema , es bastante molesto tener este código en cada controlador de vista posible. Terminé con una categoría simple de UINavigationItem . ¡Cuidado, aquí hay dragones! Lo siento, quiero decir, swizzling:

#import <objc/runtime.h> @implementation UINavigationItem (ArrowBackButton) static char kArrowBackButtonKey; + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method m1 = class_getInstanceMethod(self, @selector(backBarButtonItem)); Method m2 = class_getInstanceMethod(self, @selector(arrowBackButton_backBarButtonItem)); method_exchangeImplementations(m1, m2); }); } - (UIBarButtonItem *)arrowBackButton_backBarButtonItem { UIBarButtonItem *item = [self arrowBackButton_backBarButtonItem]; if (item) { return item; } item = objc_getAssociatedObject(self, &kArrowBackButtonKey); if (!item) { item = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL]; objc_setAssociatedObject(self, &kArrowBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } return item; } @end


Si configura la barra de navegación tintColor Of, agregue una imagen personalizada del botón Atrás sin título, el color del tinte reflejará el color de la imagen. Por favor siga este enlace de documentación de Apple.

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/index.html#//apple_ref/doc/uid/TP40012857-UIView-SW7

UINavigationItem *navItem = [[UINavigationItem alloc] init]; navBar.tintColor = self.tintColor; UIImage *myImage = [UIImage imageNamed:@"left_arrow.png"]; myImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithImage:myImage style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonFunction:)]; navItem.leftBarButtonItem = leftButton; navBar.items = @[ navItem ];


Si tiene dos ViewController (FirstVC, SecondVC) integrados en el controlador de navegación y desea que solo haya una flecha hacia atrás en SecondVC.

Puedes probar esto en FirstDV''s ViewDidLoad

override func viewDidLoad() { super.viewDidLoad() self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil) }

Luego, cuando ingresas a SecondVC, verás que solo hay una flecha hacia atrás


Todas las respuestas no resuelven el problema. No es aceptable restablecer el título del botón en cada controlador de vista y agregar un desplazamiento al título aún hace que el siguiente título del controlador de vista cambie a la derecha.

Aquí está el método que usa el método swizzling, simplemente cree una nueva extensión para UINavigationItem

import UIKit extension UINavigationItem { public override class func initialize() { struct Static { static var token: dispatch_once_t = 0 } // make sure this isn''t a subclass if self !== UINavigationItem.self { return } dispatch_once(&Static.token) { let originalSelector = Selector("backBarButtonItem") let swizzledSelector = #selector(UINavigationItem.noTitleBackBarButtonItem) let originalMethod = class_getInstanceMethod(self, originalSelector) let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) if didAddMethod { class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) } else { method_exchangeImplementations(originalMethod, swizzledMethod) } } } // MARK: - Method Swizzling struct AssociatedKeys { static var ArrowBackButtonKey = "noTitleArrowBackButtonKey" } func noTitleBackBarButtonItem() -> UIBarButtonItem? { if let item = self.noTitleBackBarButtonItem() { return item } if let item = objc_getAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey) as? UIBarButtonItem { return item } else { let newItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: nil, action: nil) objc_setAssociatedObject(self, &AssociatedKeys.ArrowBackButtonKey, newItem as UIBarButtonItem?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) return newItem } } }



iOS7 tiene nuevas reglas de interfaz, por lo que es mejor mantener al menos la flecha hacia atrás cuando presionas una vista UIV. Es muy fácil cambiar el texto "atrás" programáticamente. Simplemente agregue este código antes de insertar la vista (o prepareForSegue si está usando StoryBoards):

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"NEW TITLE" style:UIBarButtonItemStylePlain target:nil action:nil]; }

Esto cambiará el texto predeterminado "Atrás", pero mantendrá la flecha hacia atrás con estilo de iOS7. También puede cambiar el color del tinte para la flecha de retroceso antes de presionar la vista:

- (void)viewDidLoad{ //NavBar background color: self.navigationController.navigationBar.barTintColor=[UIColor redColor]; //NavBar tint color for elements: self.navigationController.navigationBar.tintColor=[UIColor whiteColor]; }

¡Espero que esto te ayude!


Objetivo: personalizar todo el botón UINavigationBar en UINavigationBar a un icono blanco

Pasos: 1. en el método "didFinishLaunchingWithOptions" de AppDelete :

UIImage *backBtnIcon = [UIImage imageNamed:@"navBackBtn"]; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [UINavigationBar appearance].tintColor = [UIColor whiteColor]; [UINavigationBar appearance].backIndicatorImage = backBtnIcon; [UINavigationBar appearance].backIndicatorTransitionMaskImage = backBtnIcon; }else{ UIImage *backButtonImage = [backBtnIcon resizableImageWithCapInsets:UIEdgeInsetsMake(0, backBtnIcon.size.width - 1, 0, 0)]; [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault]; }

2.en el método viewDidLoad de la clase super ViewController común:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; [self.navigationItem setBackBarButtonItem:backItem]; }else{ //do nothing }


EDITAR: 2014-04-09: A medida que gané reputación, lo siento porque ya no uso este truco. Recomiendo la respuesta de Kyle. También self.navigationItem.backBarButtonItem cuenta que el self de self.navigationItem.backBarButtonItem no es el controlador de vista, se muestra el botón Atrás, sino el controlador de vista anterior para volver.

Si no necesita tener un texto de título para el controlador de vista anterior, simplemente complete el título con una cadena en blanco;

self.navigationItem.title = @""; [self.navigationController pushViewController:viewController animated:YES];

Esto evitará que se muestre "atrás" con chevron en el controlador de vista empujado.

EDITAR: Incluso si usa un texto de título que no esté en blanco, configurar el título del controlador de vista anterior en viewWillAppear: funciona, excepto que el título puede parpadear en un abrir y cerrar de viewWillAppear: cuando se visualiza el controlador de vista. Creo que "la aplicación de Twitter" parece hacer un truco más sutil para evitar el parpadeo.


// add left bar button item try this code: - (void)viewDidLoad { [super viewDidLoad]; UIImage* image_back = [UIImage imageNamed:@"your_leftarrowImage.png"]; CGRect backframe = CGRectMake(250, 9, 15,21); UIButton *backbutton = [[UIButton alloc] initWithFrame:backframe]; [backbutton setBackgroundImage:image_back forState:UIControlStateNormal]; [backbutton addTarget:self action:@selector(Btn_back:) forControlEvents:UIControlEventTouchUpInside]; [backbutton setShowsTouchWhenHighlighted:YES]; UIBarButtonItem *backbarbutton =[[UIBarButtonItem alloc] initWithCustomView:backbutton]; self.navigationItem.leftBarButtonItem=backbarbutton; [backbutton release]; } -(IBAction)Btn_back:(id)sender { [self.navigationController popViewControllerAnimated:YES]; }


- (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // Custom initialization self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil]; } return self; }

Al igual que Kyle Begeman, agrega el código anterior en su controlador de vista raíz. Se aplicará todo el controlador de subvista. Además, al agregar esto en el método initWithCoder:, puede aplicar el estilo para los controladores de vista raíz en xib, storyboard o enfoques basados ​​en código.