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)];
¡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
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.
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
}
}
}
Verifica esta respuesta
¿Cómo cambiar el nombre del botón de retroceso de UINavigationController?
configure el texto del title
en una string
con un espacio en blanco como se muestra abajo
title = " "
No tengo suficiente reputación para agregar comentarios :)
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.