Cuando presiono a UIViewController
, tiene un título en el botón de retroceso en nuevo UIViewController
, si el título tiene mucho texto, no se ve bien en el iPhone 4s, así que quiero eliminarlo.
Si agrego algún código en prepareForSegue
función, será un problema.
Cualquier mejor forma de lograr esto?
ios
swift
uibarbuttonitem
jansma
fuente
fuente
Respuestas:
Si desea la flecha hacia atrás, coloque el siguiente código en el
AppDelegate
archivo en eldidFinishLaunchingWithOptions
método.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
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)
ACTUALIZAR:
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)
ACTUALIZAR 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)
Uso de compensación
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000, 0), for:UIBarMetrics.default)
Entonces puede ser que su problema haya sido resuelto.
Codificación feliz.
fuente
setBackButtonTitlePositionAdjustment
no siempre funciona, cuando el título del botón Atrás es muy largo, pero no lo suficiente para cambiar a "Atrás", el título del medio se moverá hacia la derecha.setBackButtonTitlePositionAdjustment:forBarMetrics:
si el usuario ha habilitado la forma del botón desde la configuración de accesibilidad, la forma aparecerá terminando en una barra de navegación fea.Trabajar es como un encanto en Swift 3
self.navigationController?.navigationBar.topItem?.title = " "
fuente
navigationController?.pushViewController(_, animated:)
viewWillAppear:
.Estoy usando esta línea de código en el
AppDelegate
archivo en eldidFinishLaunchingWithOptions
método para eliminar el botón traserotitle
.Rápido 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)
fuente
setBackButtonTitlePositionAdjustment
no siempre funciona, cuando el título del botón Atrás es muy largo, pero no lo suficiente para cambiar a "Atrás", el título del medio se moverá hacia la derecha.Solo tiene que ir a su ViewController principal de donde dependen sus otros ViewControllers.
override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(true) navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)}
fuente
Simplemente copie este código en
didFinishLaunchingWithOptions launchOptions
Rápido 5
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffset(horizontal: -1000.0, vertical: 0.0), for: .default)
Rápido 4
UIBarButtonItem.appearance().setBackButtonTitlePositionAdjustment(UIOffsetMake(-1000.0, 0.0), for: .default)
fuente
Es simple. pon un espacio en el título del botón de retroceso y listo. Recuerda que tiene que estar en la vista anterior donde quieres eliminar el texto.
fuente
Puede usar xcode 8 y swift 3.0
self.navigationController?.navigationBar.backItem?.title = " "
fuente
ViewController
losself.navigationController
Puede crear una subclase para todos los
UIViewController
s para los que desea este comportamiento, y en la subclaseviewDidLoad
:override func viewDidLoad() { super.viewDidLoad() self.navigationItem.backBarButtonItem = UIBarButtonItem( title: "", style: .plain, target: nil, action: nil) }
De esta manera, puede elegir para qué controladores desea el comportamiento, sin duplicar el código. Prefiero que mis controladores simplemente digan "Atrás", en lugar del título del controlador anterior, así que establezco ese título aquí.
fuente
let barAppearace = UIBarButtonItem.appearance() barAppearace.setBackButtonTitlePositionAdjustment(UIOffsetMake(0, -60), for:UIBarMetrics.default)
usé esta línea de código en swift 3.0
fuente
Inspirándome en la respuesta de rordulu aquí , terminé creando un UINavigationController personalizado y una barra de UINavigation que parece manejar todos los casos de este complicado problema.
1) Inicialice nuevo
UINavigationController
con su personalizadoUINavigationBar
:class CustomNavigationController: UINavigationController { convenience init() { self.init(navigationBarClass: CustomNavigationBar.self, toolbarClass: nil) } }
2) Establezca la
backItem.title
propiedad de la barra de navegación en una cadena vacía, cada vez que la vista se muestreclass CustomNavigationBar: UINavigationBar { override func layoutSubviews() { backItem?.title = "" super.layoutSubviews() } }
Ahora, cada vez que use esta combinación de barra y controlador de navegación, ¡nunca tendrá el texto del botón de retroceso! 🎉
Nota: esto debería funcionar bien si también usa guiones gráficos, solo asegúrese de colocar el componente de la barra de navegación personalizada en la vista
fuente
Por lo general, agrego o cambio el botón Atrás en viewDidLoad de UIViewController.
Algo así debería funcionar:
let leftButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "closeView:") self.navigationItem.leftBarButtonItem = leftButton
No olvide cambiar e implementar la función a la que se llama para cerrar la vista.
Aún más fácil, simplemente cambie el título:
self.navigationItem.leftBarButtonItem.title = "Back"
fuente
Swift 3:
self.navigationItem.backBarButtonItem = UIBarButtonItem(title:"", style:.plain, target:nil, action:nil)
fuente
Agregar una segunda respuesta aquí como 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.
Entonces, en primer lugar, cree una clase de extensión UIViewController con una función para eliminar el texto del botón de retroceso y agregar 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
cada controlador de vista en el que lo necesite.fuente
Solución simple :
Mientras presiona el segundo controlador desde el primer controlador, coloque self.navigationItem.title = "" en viewWillDisappear del primer controlador. Oculta el título del botón de retroceso del segundo controlador.
La declaración anterior oculta el título del primer controlador, por lo tanto, cuando regresamos, queremos el título del 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" }
fuente
Rápido 4.2
UIBarButtonItem.appearance().setTitleTextAttributes([.foregroundColor: UIColor.clear], for: .normal)
fuente
Respuesta actualizada para Swift 4.2
Trabajar con
UIAppearance
es una forma más limpia de resolver el problema, pero haría que todosUIBarButtonItem
tuvieran un texto claro. Una versión mejorada de la solución podría ser verificar siUIBarButtonItem
está contenido en unUINavigationBar
.UIBarButtonItem.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.clear], for: .normal)
fuente
Funciona en Swift 5 :
self.navigationItem.backBarButtonItem?.title = ""
Tenga en cuenta que será efectivo para el próximo controlador de vista empujado, 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).
fuente
Tengo una solución simple para aquellos que no quieren usar el método swizzling o duplicar un código similar en diferentes controladores de vista.
Para eliminar el título del botón Atrás, cree una subclase UINavigationController y anule el método pushViewController (_, animated :):
final class CustomNavigationController: UINavigationController { override func pushViewController(_ viewController: UIViewController, animated: Bool) { super.pushViewController(viewController, animated: animated) let backBarButtonItem = UIBarButtonItem() backBarButtonItem.title = nil viewController.navigationItem.backBarButtonItem = backBarButtonItem } }
fuente
No sé por qué, pero encontré un problema al ocultar el título del botón Atrás en las ventajas del iPhone, pero en el dispositivo sin el signo más se muestra correcto con
leftBarButtonItem.title = ""
Así que encontré una forma sencilla. Se establece el color del tinte para borrar en NavigationBar de NavigationViewController en el diseño automático. Puede ser un problema si utiliza iconos o mosaicos de texto con tinte. Pero en mi caso no lo uso como todo.
fuente
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 }
Así que llama a este método en viewDidLoad:
override func viewDidLoad() { super.viewDidLoad() removeBackButton(vc:self) }
fuente
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) } }}
fuente
Me gustaría compartir una solución que funcione para mí. Además, se puede ajustar en función de sus necesidades y requisitos.
Tenga en cuenta que, en mi caso, uso un guión gráfico para especificar CustomNavigationBar
Rápido 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() } }
fuente
Funciona para Swift 4.2
Usando la línea de código en el
AppDelegate
archivo endidFinishLaunchingWithOptions
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)
fuente
Swift 4.2 y 5
En lugar de jugar con el color de tinte de la barra de navegación, tendrá efectos secundarios si está utilizando el selector de imágenes en cualquier momento más adelante en su código.
Utilice el siguiente código:
extension UIViewController { open override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) } }
Llámelo desde su primer ViewController:
self.awakeFromNib()
fuente
para rápido 4,5
let BarButtonItemAppearance = UIBarButtonItem.appearance() BarButtonItemAppearance.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.clear], for: .normal)
fuente
Simplemente cree la extensión de
UIViewController
con la función de anulaciónawakeFromNib()
y hagaUIBarButtonItem
con un título vacío y dé anavigation backBarButtonItem
.extension UIViewController { open override func awakeFromNib() { let backBarBtnItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarBtnItem } }
fuente
Coloque el siguiente código en cualquiera de los
UIViewcontroller extension
que ocultará todo elUIViewcontroller
texto posterioropen override func awakeFromNib() { navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) }
fuente
en
viewDidLoad()
let backBarButtonItem = UIBarButtonItem(title: nil, style: .plain, target: nil, action: nil) navigationItem.backBarButtonItem = backBarButtonItem
fuente
He encontrado una solución simple: -
en el
PersingtingViewController's
viewWillDisappear
método jsut ponerself.title = ""
y establecer
title
paraPersingtingViewController's
elviewWillAppear
método. Y repetir esta operación para todos losviewControllers
denavigationStack
a excepción de la última.fuente
En iOS 14 ahora está presente la
backButtonDisplayMode
propiedad enUINavigationItem
clase. Entonces, para eliminar el título del botón de retroceso, puede usaren la
viewDidLoad
función del viewController donde desea eliminarlo.Para eliminarlo en toda la barra de navegación utilicé la técnica swizzling
import UIKit private let swizzling: (UIViewController.Type, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in if let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) { let didAddMethod = class_addMethod(forClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) if didAddMethod { class_replaceMethod(forClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) } else { method_exchangeImplementations(originalMethod, swizzledMethod) } } } extension UIViewController { static func swizzle() { let originalSelector1 = #selector(viewDidLoad) let swizzledSelector1 = #selector(swizzled_viewDidLoad) swizzling(UIViewController.self, originalSelector1, swizzledSelector1) } @objc open func swizzled_viewDidLoad() { if let _ = navigationController { if #available(iOS 14.0, *) { navigationItem.backButtonDisplayMode = .minimal } else { // Fallback on earlier versions navigationItem.backButtonTitle = "" } } swizzled_viewDidLoad() } }
Y en
application(_:didFinishLaunchingWithOptions:)
llamadaUIViewController.swizzle()
fuente