Cambiar la altura de UINavigationBar

¿Puede alguien decirme cómo cambiar la altura de la barra de navegación?

Esto es lo que tengo hasta ahora:

CGFloat navBarHeight = 10; self.navigationController.navigationBar.frame.size.width = navBarHeight; 

Puede crear una clase de categoría basada en UINavigationBar como esta

archivo .h

 #import UIKit/UIKit.h @interface UINavigationBar (myNave) - (CGSize)changeHeight:(CGSize)size; @end 

y archivo .m

 #import "UINavigationBar+customNav.h" @implementation UINavigationBar (customNav) - (CGSize)sizeThatFits:(CGSize)size { CGSize newSize = CGSizeMake(320,100); return newSize; } @end 

Funciona muy bien.

No debe cambiar la altura de la barra de navegación. De Apple Programing Guide en View Controller:

Personalizar la apariencia de la barra de navegación

En una interfaz de navegación, un controlador de navegación posee su objeto UINavigationBar y es responsable de su administración. No está permitido cambiar el objeto de la barra de navegación o modificar sus límites, fotogtwigs o valores alfa directamente. Sin embargo, hay algunas propiedades que está permitido modificar, incluidas las siguientes:

● propiedad barStyle

● propiedad translúcida

● Propiedad tintColor

(tomado de Apple: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html )

– ACTUALIZACIÓN – IOS 7 — todavía solo se pueden cambiar las propiedades disponibles, pero a continuación se muestra un excelente tutorial sobre cómo lograr flexibilidad en la barra de navegación http://www.appcoda.com/customize-navigation-status-bar -ios 7/

He resuelto este problema, creé la subclase de UINavigationController. En este archivo MainNavigationViewController.m reescribo el método viewDidLayoutSubviews (), donde establezco el marco para self.navigationBar

Intenta usar –

 CGFloat navBarHeight = 10.0f; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); [self.navigationController.navigationBar setFrame:frame]; 

Anular – (nulo) el método viewWillAppear en viewController y probar el siguiente código,

 - (void)viewWillAppear { UINavigationBar *navigationBar = [[self navigationController] navigationBar]; CGRect frame = [navigationBar frame]; frame.size.height = 82.0f; [navigationBar setFrame:frame]; } 

sizeThatFits: ya no funciona con las subclases UINavigationBar de iOS11. Apple Engineering ha confirmado que esta técnica nunca fue compatible y con iOS11 cambia sizeThatFits: ya no se consulta.

La solución más simple y efectiva es agregar una categoría a la barra de navegación. (pero tal vez no sea la mejor solución)

 @interface UINavigationBar (CustomHeight) @end @implementation UINavigationBar (CustomHeight) - (CGSize)sizeThatFits:(CGSize)size { CGRect screenRect = [[UIScreen mainScreen] bounds]; return CGSizeMake(screenRect.size.width, kNavBarHeightNoStatus); } @end 

knavBarHeightNoStatus es la altura de tu barra de navegación. Usamos límites UIScreen porque el marco de UINavigationBar es incorrecto

PD: ten cuidado, puedes tener algunos problemas al usarlo con un menú lateral

self.navigationController.navigationBar.frame es una propiedad de readonly en iOS versión 4.x

se cambiará aunque, verá un comportamiento anormal.

por ejemplo, cuando el estado de la aplicación cambió a fondo y vuelve al primer plano, la barra de navegación mostrará la altura del tamaño original

Me encontré con muchos problemas dependiendo del método elegido. En mi caso específico, la barra de navegación estaba oculta en toda la aplicación, excepto en el Controlador de Vista de Configuración. Como necesitaba especificar una altura personalizada de la barra de navegación y mostrar la barra de navegación al mismo tiempo, la transición entre el controlador de vista de la fuente y el Controlador de Vista de Configuración tuvo una animación muy descuidada.

La mejor solución absoluta se puede encontrar aquí: https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2 . Acabo de importar la categoría en el Controlador de Vista de Configuración, y en viewDidLoad llamé al método setHeight: `self.navigationController.navigationBar ‘. ¡Se ve muy bien!

El siguiente código no afectará a otros parámetros en el cuadro, excepto la altura

  [self.navigationController.navigationBar setFrame:CGRectMake(self.navigationController.navigationBar.frame.origin.x, self.navigationController.navigationBar.frame.origin.y, self.navigationController.navigationBar.frame.size.width, 150)]; 

si quiere cambiar otros parámetros, simplemente edite cualquiera de los parámetros …

Pruebe este código dentro del método - (void)viewDidLayoutSubviews ,

 CGFloat navBarHeight = 10.0f; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, navBarHeight); [self.navigationController.navigationBar setFrame:frame]; 

Creando categoría y reemplazando sizeThatFits (_ size: CGSize) -> El método CGSize cambia el tamaño de UINavigationBar en toda la aplicación. Suponiendo que desea cambiar la altura / el tamaño de UINavigationBar solo en un ViewController en particular (en mi caso)

Así es como lo hice.

 extension UINavigationBar { open override func sizeThatFits(_ size: CGSize) -> CGSize { let v = self.value(forKey: "frame") as? CGRect return v?.size ?? CGSize(width: UIScreen.main.bounds.width, height: 44) } } 

en la persona que llama ViewController se vería como

 override func viewDidLoad() { super.viewDidLoad() configureNavigationBar() } private func configureNavigationBar() { var naviBarFrame = self.navigationController?.navigationBar.frame naviBarFrame?.size.height = 74 let rect = naviBarFrame ?? CGRect(x: 0, y: 20, width: UIScreen.main.bounds.width, height: 74) self.navigationController?.navigationBar.setValue(rect, forKey: "frame") } 
    Intereting Posts