Ahora en iOS 11, el sizeThatFits método no es llamado desde UINavigationBar subclases. Se cambia el marco de UINavigationBar causas de fallos y mal insertos.
Así, las ideas de cómo personalizar la barra de navegación de altura ahora?

  • La única nueva API con iOS 11 por ahora con UINavigationBar es : open var prefersLargeTitles: Bool y el valor predeterminado es false.
  • la salida para los problemas conocidos en las notas de lanzamiento como este está en beta.
  • Tengo el mismo problema, mi tamaño personalizado de la barra de navegación es muy lento y mi viejo código no está funcionando correctamente.
  • Este es todavía un problema con la Beta 2 aunque informó de problemas en la Beta 1 que supuestamente han sido corregidos: sizeThatFits no es invocada por UINavigationBar subclases.
  • He vuelto a probar, y la cuestión sigue siendo :(.
  • No, no es solucionado en la Beta 2
  • Probado con la Beta 3, de nuevo sin suerte ….
  • En la Beta 3, sizeThatFits se invoca, pero no parece hacer nada con una altura personalizada. Fue este problema en realidad se hace referencia en las notas de la versión?
  • Para mí el UINavigationBar obtener el tamaño, sólo el punto de vista todavía piensa que es el valor predeterminado de 44 píxeles de altura. Así que mi vista se consigue el empate debajo de la costumbre navigationBar. p.s. Los bordes extendidos están en none.
  • Actualización: Sigue teniendo el mismo problema en la Beta 4
  • Sí, la costumbre-la altura de las barras de navegación son todavía muy lento en la beta 4, a pesar de las notas de la versión que indica: «barras de Navegación debe ser correcta. (32076094)». Me permito sugerir la presentación de un duplicado del informe de error.
  • UINavigationBar intencionalmente ya no utiliza sizeThatFits para determinar su tamaño debido a la dinámica cambiante de la barra de navegación alturas en iOS 11 con los grandes títulos. Así que, no sé qué se puede hacer para obtener una altura fija en iOS 11, aparte de construir su propia barra de navegación que no es un UINavigationBar. Me animo a presentar una solicitud de mejora pidiendo una API para influir en la barra de navegación de altura para iOS 11+.
  • ver el mismo comportamiento que en la beta 4 – estaba bien hasta que la beta 4, la barra aumenta en tamaño, pero el fondo no se escala junto con él. He iniciado un error con ID 33539673
  • Aquí está mi solución : stackoverflow.com/questions/46325181/…

InformationsquelleAutor | 2017-06-06

11 Comentarios

  1. 29

    De acuerdo a los desarrolladores de Apple (mirar aquí, aquí y aquí), el cambio de la barra de navegación de altura en iOS 11 no es compatible. Aquí sugieren que para hacer soluciones como tener una vista en la barra de navegación (pero fuera de ella) y, a continuación, quitar la barra de navegación de la frontera. Como resultado, usted tendrá esto en el guión gráfico:

    iOS 11 de la barra de navegación de altura personalización

    este aspecto en el dispositivo:

    iOS 11 de la barra de navegación de altura personalización

    Ahora usted puede hacer una solución que se sugiere en las otras respuestas: crear una subclase personalizada de UINavigationBar, agregue su personalizados de gran subvista a ella, anular sizeThatFits y layoutSubviews, a continuación, establezca additionalSafeAreaInsets.top para la navegación de la parte superior del controlador a la diferencia customHeight - 44px, pero la vista de la barra será la predeterminada 44px, aunque visualmente todo se ve perfecto. Yo no intente reemplazar setFrame, a lo mejor funciona, sin embargo, como desarrollador de Apple, escribió en uno de los enlaces de arriba: «…y no es [compatibles] se cambia el marco de una barra de navegación que es de titularidad de un UINavigationController (el controlador de navegación estará feliz de pisar fuerte en el marco de los cambios siempre que lo considere oportuno para hacerlo).»

    En mi caso la solución anterior hizo vistas a este aspecto (vista debug para mostrar bordes):

    iOS 11 de la barra de navegación de altura personalización

    Como se puede ver, el aspecto visual es bastante buena, la additionalSafeAreaInsets correctamente empujó el contenido, la gran barra de navegación es visible, sin embargo tengo un botón personalizado en este bar y sólo el área que va por debajo de la norma 44 píxeles de la barra de navegación se puede hacer clic (en verde en la imagen). Toca por debajo del estándar de la barra de navegación de altura no llega a mi costumbre subvista, así que tengo la barra de navegación de sí mismo tamaño que el de los desarrolladores de Apple dicen que no es compatible.

    • para resolver el problema con los enlaces de área, trate de añadir a su costumbre UINavigationBar siguiente método de reemplazo de code override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { return subviews.reduce(super.hitTest(point, with: event)) { (result, subview) in return result ?? subview.hitTest(convert(point, to: subview), with: event) } } lo siento por el formato
    • El proyecto más reciente proporcionado por Apple no incluye el extendido de la barra de navegación.
    • puede descargar la versión antigua de github: github.com/robovm/apple-ios-samples/tree/master/…
    • ellos todavía tienen el código incluido pero el storyboard de la escena fue eliminado..
    • Como la muestra queda de Apple es incompleta, podría usted @frangulan proporcionar algo de código en cómo se implementa realmente esto?
    • Simplemente dejé de jugar con la barra de navegación, cambió mi aplicación del diseño para utilizar el valor predeterminado de la barra. De lo contrario, creo yo, tuve que implementar mi propia barra de navegación, que no valía la pena.

  2. 22

    Actualizado 07 Ene 2018

    Este código es el apoyo de XCode 9.2, iOS 11.2

    Yo tenía el mismo problema. A continuación es mi solución. Supongo que el tamaño de altura es de 66.

    Por favor, elige mi respuesta si te ayuda.

    Crear CINavgationBar.swift

       import UIKit
    
    @IBDesignable
    class CINavigationBar: UINavigationBar {
    
        //set NavigationBar's height
        @IBInspectable var customHeight : CGFloat = 66
    
        override func sizeThatFits(_ size: CGSize) -> CGSize {
    
            return CGSize(width: UIScreen.main.bounds.width, height: customHeight)
    
        }
    
        override func layoutSubviews() {
            super.layoutSubviews()
    
            print("It called")
    
            self.tintColor = .black
            self.backgroundColor = .red
    
    
    
            for subview in self.subviews {
                var stringFromClass = NSStringFromClass(subview.classForCoder)
                if stringFromClass.contains("UIBarBackground") {
    
                    subview.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: customHeight)
    
                    subview.backgroundColor = .green
                    subview.sizeToFit()
                }
    
                stringFromClass = NSStringFromClass(subview.classForCoder)
    
                //Can't set height of the UINavigationBarContentView
                if stringFromClass.contains("UINavigationBarContentView") {
    
                    //Set Center Y
                    let centerY = (customHeight - subview.frame.height) / 2.0
                    subview.frame = CGRect(x: 0, y: centerY, width: self.frame.width, height: subview.frame.height)
                    subview.backgroundColor = .yellow
                    subview.sizeToFit()
    
                }
            }
    
    
        }
    
    
    }

    Conjunto De Storyboard

    iOS 11 de la barra de navegación de altura personalización

    iOS 11 de la barra de navegación de altura personalización

    Configurar de forma Personalizada NavigationBar clase

    iOS 11 de la barra de navegación de altura personalización

    iOS 11 de la barra de navegación de altura personalización

    Agregar Vistaprueba + Set SafeArea

    ViewController.swift

    import UIKit
    
    class ViewController: UIViewController {
    
        var navbar : UINavigationBar!
    
        @IBOutlet weak var testView: UIView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            //update NavigationBar's frame
            self.navigationController?.navigationBar.sizeToFit()
            print("NavigationBar Frame : \(String(describing: self.navigationController!.navigationBar.frame))")
    
        }
    
        //Hide Statusbar
        override var prefersStatusBarHidden: Bool {
    
            return true
        }
    
        override func viewDidAppear(_ animated: Bool) {
    
            super.viewDidAppear(false)
    
            //Important!
            if #available(iOS 11.0, *) {
    
                //Default NavigationBar Height is 44. Custom NavigationBar Height is 66. So We should set additionalSafeAreaInsets to 66-44 = 22
                self.additionalSafeAreaInsets.top = 22
    
            }
    
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            //Dispose of any resources that can be recreated.
        }
    
    
    }

    SecondViewController.swift

    import UIKit
    class SecondViewController: UIViewController {
    override func viewDidLoad() {
    super.viewDidLoad()
    //Do any additional setup after loading the view.
    //Create BackButton
    var backButton: UIBarButtonItem!
    let backImage = imageFromText("Back", font: UIFont.systemFont(ofSize: 16), maxWidth: 1000, color:UIColor.white)
    backButton = UIBarButtonItem(image: backImage, style: UIBarButtonItemStyle.plain, target: self, action: #selector(SecondViewController.back(_:)))
    self.navigationItem.leftBarButtonItem = backButton
    self.navigationItem.leftBarButtonItem?.setBackgroundVerticalPositionAdjustment(-10, for: UIBarMetrics.default)
    }
    override var prefersStatusBarHidden: Bool {
    return true
    }
    @objc func back(_ sender: UITabBarItem){
    self.navigationController?.popViewController(animated: true)
    }
    //Helper Function : Get String CGSize
    func sizeOfAttributeString(_ str: NSAttributedString, maxWidth: CGFloat) -> CGSize {
    let size = str.boundingRect(with: CGSize(width: maxWidth, height: 1000), options:(NSStringDrawingOptions.usesLineFragmentOrigin), context:nil).size
    return size
    }
    //Helper Function : Convert String to UIImage
    func imageFromText(_ text:NSString, font:UIFont, maxWidth:CGFloat, color:UIColor) -> UIImage
    {
    let paragraph = NSMutableParagraphStyle()
    paragraph.lineBreakMode = NSLineBreakMode.byWordWrapping
    paragraph.alignment = .center //potentially this can be an input param too, but i guess in most use cases we want center align
    let attributedString = NSAttributedString(string: text as String, attributes: [NSAttributedStringKey.font: font, NSAttributedStringKey.foregroundColor: color, NSAttributedStringKey.paragraphStyle:paragraph])
    let size = sizeOfAttributeString(attributedString, maxWidth: maxWidth)
    UIGraphicsBeginImageContextWithOptions(size, false , 0.0)
    attributedString.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image!
    }
    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    //Dispose of any resources that can be recreated.
    }
    }

    iOS 11 de la barra de navegación de altura personalización
    iOS 11 de la barra de navegación de altura personalización

    Amarillo es barbackgroundView. Negro opacidad es BarContentView.

    Y he quitado BarContentView del fondo.

    iOS 11 de la barra de navegación de altura personalización

    Que Es.

    • Gracias! El setAdditionalSafeAreaInsets: me ayudó! 🙂 Por lo que la barra de navegación en iOS 11 es más corta en términos de la altura a la que en iOS 10?
    • Esta solución parece ser válida en iOS 11.2 porque la barra de navegación de las llamadas layoutSubviews() en numerosas ocasiones, que la aplicación de congelación.
    • También soy de las que se enfrenta el mismo problema de @Michael
    • Actualizado mi respuesta
    • Actualizado mi anwer
    • Este tipo de soluciones son totalmente hackish y garantizado para romper en un futuro cercano!
    • En el iPhone X, la barra de navegación de altura cambios, pero no se extiende hasta debajo de la barra de estado área. Las actualizaciones para que funcione en el iPhone X?
    • La búsqueda de subvistas por el nombre de la clase es extremadamente frágil. Cualquier persona en busca de una solución sólida debe evitar esto.

  3. 9

    Añadido:
    El problema es resuelto en iOS 11 beta 6 ,por lo que el código de abajo no sirve de nada ^_^


    Original respuesta:

    Resuelto con el siguiente código :

    (Siempre quiero el navigationBar.altura + barra de estado.height == 64 si la oculta de la barra de estado es verdadera o no)

     @implementation P1AlwaysBigNavigationBar
    - (CGSize)sizeThatFits:(CGSize)size {
    CGSize sizeThatFit = [super sizeThatFits:size];
    if ([UIApplication sharedApplication].isStatusBarHidden) {
    if (sizeThatFit.height < 64.f) {
    sizeThatFit.height = 64.f;
    }
    }
    return sizeThatFit;
    }
    - (void)setFrame:(CGRect)frame {
    if ([UIApplication sharedApplication].isStatusBarHidden) {
    frame.size.height = 64;
    }
    [super setFrame:frame];
    }
    - (void)layoutSubviews
    {
    [super layoutSubviews];
    if (![UIApplication sharedApplication].isStatusBarHidden) {
    return;
    }
    for (UIView *subview in self.subviews) {
    NSString* subViewClassName = NSStringFromClass([subview class]);
    if ([subViewClassName containsString:@"UIBarBackground"]) {
    subview.frame = self.bounds;
    }else if ([subViewClassName containsString:@"UINavigationBarContentView"]) {
    if (subview.height < 64) {
    subview.y = 64 - subview.height;
    }else {
    subview.y = 0;
    }
    }
    }
    }
    @end
    • En el aspecto de su subview es un UIView. Cómo estás haciendo subview.height más tarde??
    • Escribí un ayudante categoría de UIView.
    • Sigue teniendo este problema con iOS beta de 11 a 9. El uso de esta solución resuelve el problema. Pero espero que se arregle. Gracias @CharlieSu
    • ¿cómo puedo establecer esta clase como la barra de navegación de mi uinavigationcontroller?
    • Hay un rápido ejemplo de esto? Creo que me use una subclase de UINavigationBar?
    • auto.subvistas está vacía para mí

  4. 9

    esto funciona para mí :

    - (CGSize)sizeThatFits:(CGSize)size {
    CGSize sizeThatFit = [super sizeThatFits:size];
    if ([UIApplication sharedApplication].isStatusBarHidden) {
    if (sizeThatFit.height < 64.f) {
    sizeThatFit.height = 64.f;
    }
    }
    return sizeThatFit;
    }
    - (void)setFrame:(CGRect)frame {
    if ([UIApplication sharedApplication].isStatusBarHidden) {
    frame.size.height = 64;
    }
    [super setFrame:frame];
    }
    - (void)layoutSubviews
    {
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
    if ([NSStringFromClass([subview class]) containsString:@"BarBackground"]) {
    CGRect subViewFrame = subview.frame;
    subViewFrame.origin.y = 0;
    subViewFrame.size.height = 64;
    [subview setFrame: subViewFrame];
    }
    if ([NSStringFromClass([subview class]) containsString:@"BarContentView"]) {
    CGRect subViewFrame = subview.frame;
    subViewFrame.origin.y = 20;
    subViewFrame.size.height = 44;
    [subview setFrame: subViewFrame];
    }
    }
    }
    • Eso sólo funciona, thnx man!
    • Impresionante! Usted salvó mi día!
  5. 5

    Simplificado con Swift 4.

    class CustomNavigationBar : UINavigationBar {
    private let hiddenStatusBar: Bool
    //MARK: Init
    init(hiddenStatusBar: Bool = false) {
    self.hiddenStatusBar = hiddenStatusBar
    super.init(frame: .zero)
    }
    required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }
    //MARK: Overrides
    override func layoutSubviews() {
    super.layoutSubviews()
    if #available(iOS 11.0, *) {
    for subview in self.subviews {
    let stringFromClass = NSStringFromClass(subview.classForCoder)
    if stringFromClass.contains("BarBackground") {
    subview.frame = self.bounds
    } else if stringFromClass.contains("BarContentView") {
    let statusBarHeight = self.hiddenStatusBar ? 0 : UIApplication.shared.statusBarFrame.height
    subview.frame.origin.y = statusBarHeight
    subview.frame.size.height = self.bounds.height - statusBarHeight
    }
    }
    }
    }
    }
  6. 4

    Junto con primordial -layoutSubviews y -setFrame: usted debe comprobar fuera de la recién agregado UIViewController del additionalSafereaInsets propiedad (La Documentación De Apple) si usted no desea que el cambia el tamaño de la barra de navegación de ocultar su contenido.

    • Esto es importante, simplemente la actualización de su barra de exploración de fondo de la altura del caso a la superposición de contenido en la vista de los controladores. Lo que yo no soy capaz de trabajar es cómo utilizar correctamente addionalSafeAreaInsets y, en particular, para permitir iOS 10 y por debajo de la cual no admite esta propiedad
    • Esto es importante, simplemente la actualización de su barra de exploración de fondo de la altura del caso a la superposición de contenido en la vista de los controladores. Lo que yo no soy capaz de trabajar es cómo utilizar correctamente addionalSafeAreaInsets y, en particular, para permitir iOS 10 y por debajo de la cual no admite esta propiedad
    • Si usted encuentra una buena solución Podría compartir?
  7. 4

    Aunque es solucionado en la beta 4, parece que la imagen de fondo de la barra de navegación no se escala con la vista real (puedes comprobarlo mirando en en la vista de jerarquía visor). Una solución por ahora es reemplazar layoutSubviews personalizado UINavigationBar y, a continuación, utilizar este código:

    - (void)layoutSubviews
    {
    [super layoutSubviews];
    for (UIView *subview in self.subviews) {
    if ([NSStringFromClass([subview class]) containsString:@"BarBackground"]) {
    CGRect subViewFrame = subview.frame;
    subViewFrame.origin.y = -20;
    subViewFrame.size.height = CUSTOM_FIXED_HEIGHT+20;
    [subview setFrame: subViewFrame];
    }
    }
    }

    Si te das cuenta, la barra de fondo, de hecho, tiene un desplazamiento de -20 hacer aparecer detrás de la barra de estado, por lo que el cálculo anterior se agrega que en.

    • usted necesidad de declarar/instancias subviewFrame? o editar directamente el marco de la subvista?
    • se corrigió un error, debe ser una variable local
  8. 3

    en Xcode 9 Beta 6 todavía tengo el problema. La Barra siempre se ve 44 píxeles de altura y es empujado debajo de la barra de estado.

    Con el fin de resolver que he hecho una subclase con @strangetimes código Swift)

    class NavigationBar: UINavigationBar {
    override func layoutSubviews() {
    super.layoutSubviews()
    for subview in self.subviews {
    var stringFromClass = NSStringFromClass(subview.classForCoder)
    print("--------- \(stringFromClass)")
    if stringFromClass.contains("BarBackground") {
    subview.frame.origin.y = -20
    subview.frame.size.height = 64
    }
    }
    }
    }

    y me coloque la barra inferior de la barra de estado

    let newNavigationBar = NavigationBar(frame: CGRect(origin: CGPoint(x: 0,
    y: 20),
    size: CGSize(width: view.frame.width,
    height: 64)
    )
    ) 
  9. 2

    Esto es lo que yo uso. Funciona para regular el contenido (44.0 px) si utiliza UISearchBar como título o de otros puntos de vista que modificar el tamaño de la barra de contenido, debe actualizar los valores de acuerdo. El uso de esta en su propio riesgo ya que podría frenar en algún momento.

    Esta es la barra de navegación, con 90.0 px de altura codificado, trabajando tanto en iOS 11 y versiones anteriores. Usted puede agregar algunas inserciones a la UIBarButtonItem para pre iOS 11 a buscar el mismo.

    class NavBar: UINavigationBar {
    override init(frame: CGRect) {
    super.init(frame: frame)
    if #available(iOS 11, *) {
    translatesAutoresizingMaskIntoConstraints = false
    }
    }
    required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }
    override func sizeThatFits(_ size: CGSize) -> CGSize {
    return CGSize(width: UIScreen.main.bounds.width, height: 70.0)
    }
    override func layoutSubviews() {
    super.layoutSubviews()
    guard #available(iOS 11, *) else {
    return
    }
    frame = CGRect(x: frame.origin.x, y:  0, width: frame.size.width, height: 90)
    if let parent = superview {
    parent.layoutIfNeeded()
    for view in parent.subviews {
    let stringFromClass = NSStringFromClass(view.classForCoder)
    if stringFromClass.contains("NavigationTransition") {
    view.frame = CGRect(x: view.frame.origin.x, y: frame.size.height - 64, width: view.frame.size.width, height: parent.bounds.size.height - frame.size.height + 4)
    }
    }
    }
    for subview in self.subviews {
    var stringFromClass = NSStringFromClass(subview.classForCoder)
    if stringFromClass.contains("BarBackground") {
    subview.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 90)
    subview.backgroundColor = .yellow
    }
    stringFromClass = NSStringFromClass(subview.classForCoder)
    if stringFromClass.contains("BarContent") {
    subview.frame = CGRect(x: subview.frame.origin.x, y: 40, width: subview.frame.width, height: subview.frame.height)
    }
    }
    }
    }

    Y agregarlo a un UINavigationController subclase como este:

    class CustomBarNavigationViewController: UINavigationController {
    init() {
    super.init(navigationBarClass: NavBar.self, toolbarClass: nil)
    }
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
    override init(rootViewController: UIViewController) {
    super.init(navigationBarClass: NavBar.self, toolbarClass: nil)
    self.viewControllers = [rootViewController]
    }
    required public init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }
    }
    • Tengo un error -> error fatal: init(coder:) no se ha implementado:
    • Acaba de implementar init con coder si usted está usando que
    • Gracias por la respuesta. Pero la Zona Segura de la parte superior no está actualizado. Área de seguridad de la parte superior es todavía 44px. Cómo actualizar la Zona Segura de la parte superior después de configurar la barra de navegación de altura.
    • Usted podría tratar de usar safeAreaInsets propiedad en UIView para la actualización de su zona segura.
  10. 1

    Esto funciona bien para los regulares de la barra de navegación. Si el uso de la LargeTitle este no funciona bien, porque la titleView tamaño no va a ser un fijo de la altura de 44 puntos. Pero para la vista normal esto debería ser suficiente.

    Como @frangulyan apple sugirió agregar una vista por debajo de la barra de exploración y ocultar la delgada línea (imagen de la sombra). Esto es lo que me ocurrió a continuación. He añadido un uiview a la navigationItem del titleView y, a continuación, agrega un imageView interior que uiview. He quitado la delgada línea (imagen de la sombra). El uiview he añadido es el mismo color exacto como la navBar. He añadido un uiLabel dentro de ese punto de vista y eso es todo.

    iOS 11 de la barra de navegación de altura personalización

    Aquí está la imagen en 3d. La vista ampliada está detrás de la usernameLabel debajo de la barra de exploración. Su color gris y tiene una delgada línea debajo de ella. Sólo anclar su collectionView o lo que sea por debajo de la delgada separatorLine.

    iOS 11 de la barra de navegación de altura personalización

    Los 9 pasos explicados anteriormente cada línea de código:

    class ExtendedNavController: UIViewController {
    fileprivate let extendedView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .white
    return view
    }()
    fileprivate let separatorLine: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = .gray
    return view
    }()
    fileprivate let usernameLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.font = UIFont.systemFont(ofSize: 14)
    label.text = "username goes here"
    label.textAlignment = .center
    label.lineBreakMode = .byTruncatingTail
    label.numberOfLines = 1
    return label
    }()
    fileprivate let myTitleView: UIView = {
    let view = UIView()
    view.backgroundColor = .white
    return view
    }()
    fileprivate let profileImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.clipsToBounds = true
    imageView.backgroundColor = .darkGray
    return imageView
    }()
    override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    //1. the navBar's titleView has a height of 44, set myTitleView height and width both to 44
    myTitleView.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
    //2. set myTitleView to the nav bar's titleView
    navigationItem.titleView = myTitleView
    //3. get rid of the thin line (shadow Image) underneath the navigationBar
    navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")
    navigationController?.navigationBar.layoutIfNeeded()
    //4. set the navigationBar's tint color to the color you want
    navigationController?.navigationBar.barTintColor = UIColor(red: 249.0/255.0, green: 249.0/255.0, blue: 249.0/255.0, alpha: 1.0)
    //5. set extendedView's background color to the same exact color as the navBar's background color
    extendedView.backgroundColor = UIColor(red: 249.0/255.0, green: 249.0/255.0, blue: 249.0/255.0, alpha: 1.0)
    //6. set your imageView to get pinned inside the titleView
    setProfileImageViewAnchorsInsideMyTitleView()
    //7. set the extendedView's anchors directly underneath the navigation bar
    setExtendedViewAndSeparatorLineAnchors()
    //8. set the usernameLabel's anchors inside the extendedView
    setNameLabelAnchorsInsideTheExtendedView()
    }
    override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(true)
    //9. **Optional** If you want the shadow image to show on other view controllers when popping or pushing
    navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
    navigationController?.navigationBar.setValue(false, forKey: "hidesShadow")
    navigationController?.navigationBar.layoutIfNeeded()
    }
    func setExtendedViewAndSeparatorLineAnchors() {
    view.addSubview(extendedView)
    view.addSubview(separatorLine)
    extendedView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    extendedView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    extendedView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    extendedView.heightAnchor.constraint(equalToConstant: 29.5).isActive = true
    separatorLine.topAnchor.constraint(equalTo:  extendedView.bottomAnchor).isActive = true
    separatorLine.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    separatorLine.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    separatorLine.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
    }
    func setProfileImageViewAnchorsInsideMyTitleView() {
    myTitleView.addSubview(profileImageView)
    profileImageView.topAnchor.constraint(equalTo: myTitleView.topAnchor).isActive = true
    profileImageView.centerXAnchor.constraint(equalTo: myTitleView.centerXAnchor).isActive = true
    profileImageView.widthAnchor.constraint(equalToConstant: 44).isActive = true
    profileImageView.heightAnchor.constraint(equalToConstant: 44).isActive = true
    //round the profileImageView
    profileImageView.layoutIfNeeded()
    profileImageView.layer.cornerRadius = profileImageView.frame.width / 2
    }
    func setNameLabelAnchorsInsideTheExtendedView() {
    extendedView.addSubview(usernameLabel)
    usernameLabel.topAnchor.constraint(equalTo: extendedView.topAnchor).isActive = true
    usernameLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    usernameLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    }
    }
  11. 0

    Me subia a la altura de mi barra de navegación para que yo pudiera agregar una fila de iconos de estado por encima de la navegación por defecto de los controles, por subclases de UINavigationBar y el uso de sizeThatFits para anular la altura. Afortunadamente esto tiene el mismo efecto, y es más simple, con menos efectos secundarios. He probado con iOS 8 a la 11. Poner esto en su controlador de vista:

    - (void)viewDidLoad {
    [super viewDidLoad];
    if (self.navigationController) {
    self.navigationItem.prompt = @" "; //this adds empty space on top
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here