Saltar al contenido

¿Cómo puedo cambiar la fuente del botón Atrás de mi barra de navegación?

La guía o código que verás en este artículo es la solución más fácil y efectiva que hallamos a tu duda o dilema.

Solución:

Si necesita cambiar el estilo de fuente enteramente a través de su aplicación (también conocido como cada botón de navegación), el método preferido es utilizar UIBarButtonItem.appearance() apoderado.

El fragmento de código de muestra se vería así:

SWIFT 3.0+

//make sure font name u use below *actually* exists in the system !
//if it doesn't app will crash because we're force unwrapping an optional (see below) !!!
let customFont = UIFont(name: "customFontName", size: 17.0)!
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], for: .normal)

Es aconsejable colocar este fragmento de código en algún lugar al comienzo de su AppDelegate.swift archivo porque la estilización de la fuente debe ocurrir cada vez que se inicia la aplicación. Además, puedes poner este código en cualquier otro lugar (p.ej. Presenter class) donde realiza la personalización y estilización de la interfaz de usuario. Tan pronto como se ejecute este código, todos sus BarButtons se personalizarán a partir de entonces.


PERO como un true Swift, primero debe desenvolver opcionalmente su fuente y eventualmente recurrir a la fuente del sistema si no se encuentra o si surge algún otro problema durante la carga de la fuente.

var textAttributes: [String:Any]

//custom font setup
let fontColor = UIColor.purple
let barItemCustomFont = UIFont(name: "", size: 14)  //note we're not forcing anything here

//can we use our custom font 
if let customFont = barItemCustomFont 
    //hooray we can use our font 
    textAttributes = [NSForegroundColorAttributeName: fontColor, NSFontAttributeName: customFont]
 else 
    // not found -> omit setting font name and proceed with system font
    textAttributes = [NSForegroundColorAttributeName: fontColor]


//finally
UIBarButtonItem.appearance().setTitleTextAttributes(textAttributes, for: .normal)

Ejemplo del mundo real

En una aplicación real, normalmente necesitaría personalizar ambos UINavigationBar y UIBarButton estilo de fuente (además de otros parámetros) para que sean visualmente coherentes. Aquí es útil stylizeNavigationFontOfMyAmazingApp función que puede utilizar:

func stylizeNavigationFontOfMyAmazingApp() 
    //custom font
    let customFont = UIFont(name: "someFancyFont", size: 16)!  //note we're force unwrapping here

    //navigation bar coloring:
    UINavigationBar.appearance().tintColor = UIColor.white
    UINavigationBar.appearance().barTintColor = UIColor.blue

    //unique text style:
    var fontAttributes: [String: Any]
    fontAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: customFont]

    //navigation bar & navigation buttons font style:
    UINavigationBar.appearance().titleTextAttributes = fontAttributes
    UIBarButtonItem.appearance().setTitleTextAttributes(fontAttributes, for: .normal)


Ventajas de usar appearance() apoderado

  • Fragmento de código de dos líneas para estilizar cadaUIBarButtonItem en su aplicación / proyecto.
  • Puedes mezclar appearance() proxies de varias clases para obtener un estilo visual verdaderamente único
  • Si necesita un mayor control de personalización, puede volver a personalizar cada botón más (por ejemplo, colocando vistas personalizadas, botones, imágenes, etc.), en una instancia específica de UIBarButtonItem.

Referencia

Apple Docs en appearance protocolo.

Acabo de probar su código y parece que la razón por la que la línea está regresando nil es en realidad porque name: "FONTNAME" devuelve nil. Así que si pones eso name attribute a un nombre de fuente válido, el código debe ejecutarse sin errores, incluso si navigationController?.navigationItem.leftBarButtonItem se establece explícitamente en nil.

Pero independientemente, también como he visto a través de las pruebas, esta línea no le dará el resultado que aparentemente desea. El líder navigationController opcional no debería estar allí, ya que accede a su UINavigationController y no la vista actual. Simplemente use el UIViewControlleres propio navigationItem propiedad para acceder a su leftBarButtonItem directamente, ex:

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
navigationItem.leftBarButtonItem = backButton
navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)

Editar: Por el comentario que publicó debajo de esta respuesta, parece que en realidad no desea establecer el leftBarButtonItem pero el backBarButtonItem porque no desea implementar una acción personalizada más allá de volver al controlador de vista anterior.

Entonces, en ese controlador de vista anterior (es decir, la vista antes de que desee mostrar su elemento de botón de retroceso personalizado), puede configurar su botón de retroceso personalizado sin una acción como esta:

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
backButton.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)
navigationItem.backBarButtonItem = backButton

Si desea aplicar este cambio a toda su aplicación, puede usar el siguiente código:

Rápido 4

He añadido estas líneas a AppDelegate.swift en application función:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
       UINavigationBar.appearance().titleTextAttributes = [
            NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 20)!
        ]

        UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)

  return true

Swift 3

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 

    UINavigationBar.appearance().titleTextAttributes = [
        NSFontAttributeName: UIFont(name: "IranSansMobile", size: 20)!
    ]

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)


    return true

Finalizando este artículo puedes encontrar los informes de otros desarrolladores, tú de igual manera tienes la habilidad insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *