ios - subrayado - Cómo eliminar todo el título del botón de retroceso de la barra de navegación
ocultar barra de navegacion s9 (27)
Cuando
UIViewController
un
UIViewController
, tiene algún título en el botón Atrás en el nuevo
UIViewController
, si el título tiene mucho texto, no se ve bien en el iPhone 4s, así que quiero eliminarlo.
Si agrego algo de código en la función
prepareForSegue
, será un problema.
Cualquier mejor manera de lograr esto?
Agregar una segunda respuesta aquí ya que la primera solo funciona parcialmente. Este método es menos elegante en el hecho de que requiere llamar a un método en cada vista de la aplicación, sin embargo, funciona sin efectos secundarios.
En primer lugar, cree una clase de extensión UIViewController con una función para eliminar el texto del botón de retroceso y agregue un botón de retroceso personalizado:
extension UIViewController {
func setBackButton() {
navigationController?.navigationBar.backIndicatorImage = R.image.backArrow()
navigationController?.navigationBar.backIndicatorTransitionMaskImage = R.image.backArrow()
navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: nil, action: nil)
}
En segundo lugar, simplemente podemos llamar a esta función en
viewDidLoad
de cada controlador de vista en el que lo necesite.
El trabajo es como encanto en Swift 3
self.navigationController?.navigationBar.topItem?.title = " "
Estoy usando esta línea de código en el archivo
AppDelegate
en el método
didFinishLaunchingWithOptions
para eliminar el
title
botón de retroceso.
Swift 2.x
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), forBarMetrics:UIBarMetrics.Default)
Swift 3.x
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
Swift 4.x
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: UIControlState.highlighted)
Funciona en Swift 5 :
self.navigationItem.backBarButtonItem?.title = ""
Tenga en cuenta que será efectivo para el próximo controlador de vista presionado, no el actual en la pantalla, ¡por eso es muy confuso!
Además, verifique el guión gráfico y seleccione el elemento de navegación del controlador de vista anterior , luego escriba algo en el Botón Atrás (Inspector).
Funciona para Swift 4.2
Usando la línea de código en el archivo
AppDelegate
en
didFinishLaunchingWithOptions
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .highlighted)
Me gustaría compartir una solución que funcione para mí. Además, se puede ajustar según sus necesidades y requisitos.
Tenga en cuenta que, en mi caso, uso un guión gráfico para especificar CustomNavigationBar
Swift 4.2
class CustomNavigationBar: UINavigationBar {
override func awakeFromNib() {
super.awakeFromNib()
guard let topItem = topItem else { return }
removeBackButtonTitle(for: topItem)
}
override func pushItem(_ item: UINavigationItem, animated: Bool) {
removeBackButtonTitle(for: item)
super.pushItem(item, animated: animated)
}
func removeBackButtonTitle(for item: UINavigationItem) {
item.backBarButtonItem = UIBarButtonItem()
}
}
No estaba satisfecho con la solución
setBackButtonTitlePositionAdjustment
, así que aquí hay una alternativa rápida para ocultar todos los textos de los botones de retroceso en toda la aplicación:
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal) UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
didFinishLaunchingWithOptions
llamarlos desde
AppDelegate
en la función
didFinishLaunchingWithOptions
.
La apariencia debe configurarse en el estado
.Highlighted
también para evitar que se muestren textos cuando el usuario toca el botón Atrás.
No sé por qué, pero encontré un problema al ocultar el título del botón de retroceso en iPhone plus pero en el dispositivo sin plus se muestra correcto con
leftBarButtonItem.title = ""
Entonces encontré la manera simple. Se establece el color de tinte para borrar en NavigationBar de NavigationViewController en autolayout. Puede ser un problema si usa iconos o mosaicos de texto con tinte. Pero en mi caso no lo uso como todo.
Ponga el siguiente código en cualquiera de las
UIViewcontroller extension
, ocultará todo el texto posterior de
UIViewcontroller
open override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
Por lo general, agrego o cambio el botón Atrás en viewDidLoad del UIViewController.
Algo así debería funcionar:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
No olvide cambiar e implementar la función que se llama para cerrar la vista.
Aún más fácil, solo cambia el título:
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
Puede agregar esta extensión a UIViewController y luego llamar a esta función en cada viewDidLoad () como: self.updateBackButton ()
extension UIViewController {
func updateBackButton(){
if self.navigationController != nil {
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .done, target: self, action: nil)
}
}}
Puede crear una subclase para todos los
UIViewController
los que desea este comportamiento, y en
viewDidLoad
la subclase:
class CustomNavigationBar: UINavigationBar {
override func layoutSubviews() {
backItem?.title = ""
super.layoutSubviews()
}
}
De esta manera, puede elegir para qué controladores desea el comportamiento, sin duplicar el código. Prefiero que mis controladores solo digan "Atrás", en lugar del título del controlador anterior, así que configuré ese título aquí.
Puede usar xcode 8 y swift 3.0
self.navigationController?.navigationBar.backItem?.title = " "
Si desea la flecha hacia atrás, siga el código que se coloca en el archivo
AppDelegate
en el método
didFinishLaunchingWithOptions
.
For Objective-C
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault];
For Swift
let BarButtonItemAppearance = UIBarButtonItem.appearance()
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
Otra opción da a continuación.
En el
Objective C
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
En
Swift
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
ACTUALIZACIÓN
let BarButtonItemAppearance = UIBarButtonItem.appearance()
let attributes: [NSAttributedStringKey: Any] = [
BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
NSAttributedStringKey.font: UIFont.systemFont(ofSize: 0.1),
NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
ACTUALIZACIÓN SWIFT 4.1:
let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 0.1)!, NSAttributedStringKey.foregroundColor: UIColor.clear]
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .normal)
BarButtonItemAppearance.setTitleTextAttributes(attributes, for: .highlighted)
Usando Offset
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
Entonces puede ser que su problema haya sido resuelto.
Feliz codificación
Simplemente copie este código en
didFinishLaunchingWithOptions launchOptions
Swift 5
let barAppearace = UIBarButtonItem.appearance()
barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
Swift 4
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(
title: "", style: .plain, target: nil, action: nil)
}
Simplemente cree la extensión de
UIViewController
con la función de anulación
awakeFromNib()
y
UIBarButtonItem
con un título vacío y dele a la
navigation backBarButtonItem
.
extension UIViewController { open override func awakeFromNib() { let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarBtnItem } }
Solo necesita ir a su ViewController principal desde donde dependen sus otros ViewControllers.
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
Solo usa esto:
func removeBackButton(vc:UIViewController) {
let button = UIButton.init(type: .custom)
button.setImage(UIImage.init(named:""), for: .normal)
let leftBarButton = UIBarButtonItem.init(customView: button)
vc.navigationItem.leftBarButtonItem = leftBarButton
}
Entonces llame a este método en viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
removeBackButton(vc:self)
}
Swift 3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
para swift 4,5
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Normal)
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: barbuttonFont, NSForegroundColorAttributeName:UIColor.clearColor()], forState: UIControlState.Highlighted)
Respuesta actualizada para Swift 4.2
Trabajar con
UIAppearance
es una forma más limpia de resolver el problema, pero provocaría que todo el
UIBarButtonItem
tenga un texto claro.
Una versión mejorada de la solución podría ser verificar si el
UIBarButtonItem
está contenido en un
UINavigationBar
.
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
Solución simple :
Mientras empuja el segundo controlador del primer controlador, coloque self.navigationItem.title = "" en viewWillDisappear del primer controlador. Oculta el título del botón de retroceso del segundo controlador.
El estado anterior oculta el título del primer controlador, por lo tanto, cuando regresamos, queremos el título para el primer controlador nuevamente. Para eso hemos agregado el título para el primer controlador en el método viewWillAppear del primer controlador.
Consulte los siguientes métodos (del primer controlador)
override func viewWillDisappear(_ animated: Bool) {
self.navigationItem.title = ""
}
override func viewWillAppear(_ animated: Bool) {
self.navigationItem.title = "Title"
}
Swift 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
Swift 4.2 y 5
En lugar de jugar con el color de tinte de la barra de navegación, que tendrá efectos secundarios si está utilizando el selector de imágenes en cualquier momento posterior en su código.
Use el siguiente código:
extension UIViewController {
open override func awakeFromNib() {
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
Llámalo desde tu primer ViewController:
self.awakeFromNib()
rordulu''s respuesta de rordulu''s here , terminé creando un UINavigationController y una barra de UINavigation personalizados que parecen manejar todos los casos de este complicado problema.
1) Inicialice el nuevo
UINavigationController
con su
UINavigationBar
personalizado:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:")
self.navigationItem.leftBarButtonItem = leftButton
2) Establezca la propiedad
backItem.title
de la barra de navegación en una cadena vacía, cada vez que se despliegue la vista
self.navigationItem.leftBarButtonItem.title = "Back"
Ahora, cada vez que use este controlador de navegación y combinación de barra, ¡nunca tendrá texto de botón de retroceso! 🎉
Nota: esto debería funcionar bien si también usa guiones gráficos, solo asegúrese de soltar el componente de la barra de navegación personalizada en la vista
class CustomNavigationController: UINavigationController {
convenience init() {
self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil)
}
}
usó esta línea de código en swift 3.0