TransWikia.com

Personalizar UINavigationController [código]

Stack Overflow en español Asked by Kevtho on December 2, 2021

Necesito definir 3 templates de barras de navegación para una app, todas con un mismo color de fondo, una sin botones, otra con un solo botón de retorno en el lazo izquierdo y otra con un botón de retorno (izquierda) y uno de redirección en el lado derecho de la barra.

Personalizacion de colores y aspecto gráfico general

class BackNavController: UINavigationController {
override init(rootViewController: UIViewController) {
    super.init(rootViewController: rootViewController)
    confView()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    confView()
}

func confView() {
    navigationBar.barTintColor = Constants.primaryColor
    navigationBar.isTranslucent = false
    navigationBar.barStyle = .black
}
}

Para agregar el botón de retorno del segundo template tengo el siguiente codigo dentro del ViewController

class LoginVC: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "Inicar sesion"
    let backButton = UIBarButtonItem(image: UIImage(named: "back-arrow")?.withRenderingMode(.automatic),style: .plain,target: nil,action: #selector(closeView))
    backButton.target = self
    backButton.tintColor = .white
    navigationItem.leftBarButtonItem = backButton
}

@objc func closeView() {
    self.dismiss(animated: true, completion: nil)
}
}

El código funciona, sin embargo el definir los botones dentro de cada ViewController no es la mejor práctica pues debería repetir una y otra vez en cada controllador. La pregunta es cómo podría redefinir este código para poder usarlo cuantas veces sea necesario. Intenté agregar los botones en la subclase BackNavController pero el botón no se muestra.

class BackNavController: UINavigationController {
override init(rootViewController: UIViewController) {
    super.init(rootViewController: rootViewController)
    confView()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    confView()
}

func confView() {
    navigationBar.barTintColor = Constants.primaryColor
    navigationBar.isTranslucent = false
    navigationBar.barStyle = .black
    
    let backButton = UIBarButtonItem(image: UIImage(named: "back-arrow")?.withRenderingMode(.automatic),style: .plain,target: nil,action: #selector(closeView))
    backButton.target = self
    backButton.tintColor = .white
    navigationItem.leftBarButtonItem = backButton
}

@objc func closeView() {
    self.dismiss(animated: true, completion: nil)
}
}

Muchas gracias por su ayuda

One Answer

Lo que puedes hacer es agregar o quitar botones al Navigation Bar después de personalizar el Navigation Controller, en un proyecto lo tengo así:

En una clase puedes crear una función que te devuelva un UIButton

static func crearBoton(_ image: String, target: Any, selector: Selector, rect: CGRect?) -> UIButton {
    let newButton = UIButton(type: .custom)
    newButton.setImage(UIImage(named: image), for: .normal)
    newButton.addTarget(target, action:selector, for:.touchUpInside)
    
    if let buttonRect = rect {
        newButton.frame = buttonRect
    }
    
    return newButton
}

Una función que permita crear los UIBarButtonItem:

func createItem(target: Any, selector: Selector) -> UIBarButtonItem {
        let rightButton = crearBoton(imagen: String, target, selector: selector, rect: CGRect)
        
        return UIBarButtonItem(customView: rightButton)
}

Otra función para agregar los UIBarButtonItem al NavigationBar:

func addItems(_ type: String, target: Any, selector: Selector) {
    let barItem = createItem(target: target, selector: selector)
    if type == "left" {
        navigationItem.leftBarButtonItem = barItem
    } else {
        navigationItem.rightBarButtonItem = barItem
    }
}

En los controller que hereden esa clase y solo llamarías a esa función:

class LoginVC: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "Inicar sesion"
    //Llamas a la función de agregar según lo que necesites
    addItems(_ type: "left", target: Any, selector: selector)
    addItems(_ type: "right", target: Any, selector: selector)
}

El selector lo defines de acuerdo a la funcionalidad del botón.

El parámetro CGRect es opcional y lo puedes omitir.

Answered by Bicho on December 2, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP