2009-05-21 28 views
22

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

Esto es lo que tengo hasta ahora:

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

Este es un duplicado de esta pregunta: http://stackoverflow.com/questions/892905/change-iphone-navigation-bars-height. –

+2

frame.size. ** width **? –

Respuesta

6

Trate de usar -

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

En realidad, no cambia nada. Intenté establecer el marco cuando creo el UINavigationController en mi AppDelegate. No hay mensaje de error ni nada, pero la altura de la barra de navegación no cambia en absoluto. Probado con Xcode 4.4 y iOS 4.3, 5.0, 5.1. –

+0

@Cliff Viegas Thanks – nivritgupta

3

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

se va a cambiar a pesar de que , verá un comportamiento anormal.

por ejemplo, al estado de la aplicación cambia a fondo y volver poner en primer plano la barra de navegación mostrará altura, en tamaño natural

21

No debe cambiar la altura de la barra de navegación. De Guía de Programación Apple en Vista Controlador:

Personalizar la apariencia barra de navegación

En una interfaz de navegación, un controlador de navegación posee su objeto UINavigationBar y es responsable de su gestió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 es permisible para modificar, entre ellos los 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/

+1

Esto ya no parece estar presente en las pautas de iOS7. Todavía enumera las propiedades directamente accesibles, pero no menciona que está prohibido modificar nada. –

+1

Todavía está apareciendo, vea - https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html –

+1

De hecho, es - Eché de menos eso. Gracias. –

25

Puede crear una clase de categoría en función de UINavigationBar como esto

archivo .h

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

y el archivo .m

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

Su funcionamiento es muy agradable.

+0

esto funciona, pero mueve el UINavigationItem a la parte superior, el título y los elementos ya no están alineados en el centro horizontalmente – Anand

+0

@Anand: ¿Existe alguna solución para esto? – iBapu

+1

Para volver a centrar el título use '[self.navigationBar setTitleVeritcalPositionAdjustment: (float) forBarMetrics: UIBarMetricsDefault]; 'donde' float' es un valor positivo para empujar el título hacia abajo y un valor negativo para volverlo a presionar. Entonces, si su barra de navegación era 44 (valor predeterminado) y la convierte en 60, configure 'float' en -8 ((60-44)/2) para centrarlo –

6

de anulación - (void) Método viewWillAppear en el viewController y probar el código de abajo,

- (void)viewWillAppear { 

UINavigationBar *navigationBar = [[self navigationController] navigationBar]; 
CGRect frame = [navigationBar frame]; 
frame.size.height = 82.0f; 
[navigationBar setFrame:frame]; 
} 
+1

Close, pero esto se superpondrá a la vista subyacente en lugar de desplazarse eso. – rwyland

+1

Puede ser debido a su estilo de barra de navegación. Si es de tipo translúcido, se solapará con las vistas. Creo que si es opaco, las subvistas pueden cambiar automáticamente. –

+2

No, los primeros 44px estarán bien en opacos, pero todo después se superpone. También descubrí que el marco de NavigationBar se restablecerá en la rotación de la pantalla o en la reanudación de la aplicación (no se llamará aWillAppear en la reanudación de la aplicación). Por desgracia, este truco no funcionará correctamente. – rwyland

7

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

4

La solución más simple y efectiva es agregar una categoría a la barra de navegación.(Pero quizás 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 la barra de navegación. Utilizamos límites UIScreen porque el marco de UINavigationBar está mal

PS: Tenga cuidado, puede tener algunos problemas de usarla con un SideMenu

+1

Intenté todas las demás respuestas. Solo este funcionó. –

2

me encontré con un montón de 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: en `self.navigationController.navigationBar '. ¡Se ve muy bien!

1

siguiente código no afectará a otros parámetros en el marco excepto 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 desea cambiar otros parámetros significa, simplemente editar el uno cualquiera de los parámetros ....

0

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

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

Creación de categoría y primordial sizeTha tFits (_ size: CGSize) -> CGSize método cambia el tamaño de UINavigationBar en toda la aplicación. Suponiendo que quiera cambiar la altura/el tamaño de UINavigationBar solo en un ViewController 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) 
    } 
} 

al momento de llamar 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") 
} 
6

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

Cuestiones relacionadas