iphone - guidelines - Cambiar la altura de UINavigationBar
tab bar ios (12)
¿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;
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];
}
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")
}
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 ...
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];
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
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!
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, fotogramas 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/
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];
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.
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.
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