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 cada
UIBarButtonItem
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 UIViewController
es 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.