iOS 8 Swift Xcode 6-Establecer barra de navegación superior bg color y altura
ios8 navbar (3)
He buscado en todas partes y probado todos los fragmentos de código publicados en Stack, pero nada funciona para mí, ya que necesito que funcione.
Simplemente quiero establecer:
- Altura de la barra de navegación
- Barra de navegación bg color en RGB
- Logotipo centrado en la barra de navegación
Estoy trabajando con iOS8, Xcode 6 y Swift.
Muchas gracias por una respuesta clara!
Este es mi código en ViewController.swift
// Set nav bar height
navigationController?.navigationBar.frame.origin.y = -10
// Set nav bar bg color
var navBarColor = UIColor(red: 4 / 255, green: 47 / 255, blue: 66 / 255, alpha: 1)
navigationController?.navigationBar.barTintColor = navBarColor
// Set nav bar logo
let navBarImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
navBarImageView.contentMode = .ScaleAspectFit
let navBarImage = UIImage(named: "navBarLogo.png")
navBarImageView.image = navBarImage
navigationItem.titleView = navBarImageView
Altura de la barra de navegación:
En una subclase de controlador de navegación personalizada ...
El truco con este es NO cambiar la altura real de la barra de navegación y ajustar su origen.
func viewDidLoad() {
super.viewDidLoad()
navigationBar.frame.origin.y = -10
}
Barra de navegación bg color en RGB:
En una subclase de controlador de navegación personalizada ...
func viewDidLoad() {
super.viewDidLoad()
navigationBar.barTintColor = // YOUR COLOR
}
o use el proxy de apariencia
UINavigationBar.appearance().barTintColor = // YOUR COLOR
Logotipo centrado en la barra de navegación
En un controlador de vista personalizada ...
func viewDidLoad() {
super.viewDidLoad()
navigationItem.titleView = UIImageView(image: // YOUR LOGO)
}
¡Gran respuesta de Bon Bon !
En Swift 3, sin embargo, asegúrese de reemplazar
let classNamesToReposition: [String] = ["_UINavigationBarBackground"]
con
let classNamesToReposition: [ String ] = [ "_UIBarBackground" ]
De lo contrario, no funcionará.
Después de aplicar el código en la respuesta aceptada, la altura no parece cambiar en absoluto.
No es un trabajo fácil ... y he encuestado varios artículos en línea (la mayoría de ellos en Objective-C).
El más útil es este: http://www.emdentec.com/blog/2014/2/25/hacking-uinavigationbar
Pero su solución final no coloca los artículos en el medio, y no está en Swift.
Así que se me ocurrió una versión viable en Swift . Espero que ayude a algunas personas, ya que me salvó mucho tiempo precioso en SO.
Solución en Swift:
El siguiente código resolverá algunos problemas que puede haber encontrado:
- El título y los elementos no se colocan en el medio de la barra de navegación
- El título y los elementos se moverían cuando el usuario navega entre los controladores de vista
Primero debe subclasificar el UINavigationBar y, en el guión gráfico, seleccionar el elemento de la barra de navegación y, en la pestaña "Inspector de identidad" , configurar la nueva clase como clase personalizada.
import UIKit
class UINavigationBarTaller: UINavigationBar {
///The height you want your navigation bar to be of
static let navigationBarHeight: CGFloat = 64
///The difference between new height and default height
static let heightIncrease:CGFloat = navigationBarHeight - 44
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
private func initialize() {
let shift = UINavigationBarTaller.heightIncrease/2
///Transform all view to shift upward for [shift] point
self.transform =
CGAffineTransformMakeTranslation(0, -shift)
}
override func layoutSubviews() {
super.layoutSubviews()
let shift = UINavigationBarTaller.heightIncrease/2
///Move the background down for [shift] point
let classNamesToReposition: [String] = ["_UINavigationBarBackground"]
for view: UIView in self.subviews {
if classNamesToReposition.contains(NSStringFromClass(view.dynamicType)) {
let bounds: CGRect = self.bounds
var frame: CGRect = view.frame
frame.origin.y = bounds.origin.y + shift - 20.0
frame.size.height = bounds.size.height + 20.0
view.frame = frame
}
}
}
override func sizeThatFits(size: CGSize) -> CGSize {
let amendedSize:CGSize = super.sizeThatFits(size)
let newSize:CGSize = CGSizeMake(amendedSize.width, UINavigationBarTaller.navigationBarHeight);
return newSize;
}
}
También en mi esencia: https://gist.github.com/pai911/8fa123d4068b61ad0ff7
Actualización iOS 10:
Lamentablemente, este código se rompe en iOS 10, hay alguien que ayuda a solucionarlo, aquí tienes:
Altura de la barra de navegación personalizada iOS 10
Y, para que quede claro, este código es bastante hacky ya que depende de la estructura interna de la barra de navegación ... por lo que si decides usarlo de todos modos, prepárate para cualquier cambio que pueda romper este código ...