2009-05-21 12 views
22

Qualcuno può dirmi come modificare l'altezza della barra di navigazione?Cambia UINavigationBar Height

Ecco quello che ho finora:

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

Questo è un duplicato di questa domanda: http://stackoverflow.com/questions/892905/change-iphone-navigation-bars-height. –

+2

frame.size. ** width **? –

risposta

6

Prova utilizzando -

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

In realtà non cambia nulla. Ho provato a impostare il frame quando creo UINavigationController nel mio AppDelegate. Non ci sono messaggi di errore o altro, ma l'altezza della barra di navigazione non cambia affatto. Testato con Xcode 4.4 e iOS 4.3, 5.0, 5.1. –

+0

@Cliff Viegas Grazie – nivritgupta

3

self.navigationController.navigationBar.frame è una struttura readonly su iOS versione 4.x

verrà cambiato anche se , vedrai un comportamento anomalo.

ad esempio, quando lo stato di app cambiato in background e tornare al primo piano la barra di navigazione mostrerà altezza originaria dimensioni

21

Si consiglia di non modificare l'altezza della barra di navigazione. da Apple Guida Programmazione on View Controller:

Personalizzare la barra di navigazione Aspetto

In un'interfaccia di navigazione, un controller di navigazione possiede il suo oggetto UINavigationBar ed è responsabile per la sua gestione. Non è consentito modificare l'oggetto della barra di navigazione o modificare direttamente i suoi limiti, frame o valori alfa. Tuttavia, ci sono alcune proprietà che è permesso di modificare, tra cui i seguenti:

● barStyle proprietà

● proprietà traslucido

proprietà ● tintColor

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

- UPDATE - IOS 7 --- ancora solo le proprietà disponibili possono essere modificate ma di seguito è un ottimo tutorial su come ottenere flessibilità nella barra di navigazione http://www.appcoda.com/customize-navigation-status-bar-ios-7/

+1

Questo non sembra più essere presente nelle linee guida di iOS7. Elenca ancora le proprietà direttamente accessibili, ma non dice che nulla è vietato modificare. –

+1

Sembra ancora vedere - https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html –

+1

In effetti lo è - mi è mancato. Grazie. –

25

È possibile creare una classe di categoria sulla base UINavigationBar come questo

file h

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

e il file .m

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

Funziona molto bello.

+0

funziona ma sposta UINavigationItem in alto, il titolo e gli elementi non sono più allineati al centro orizzontalmente – Anand

+0

@Anand: lo stesso problema esiste per questo? – iBapu

+1

Per il più recente uso del titolo '[self.navigationBar setTitleVeritcalPositionAdjustment: (float) forBarMetrics: UIBarMetricsDefault]; 'where' float' è un valore positivo per spingere il titolo verso il basso e un valore negativo per reinserirlo. Quindi se la barra di navigazione era 44 (impostazione predefinita) e la si imposta a 60, impostare 'float' su -8 ((60-44)/2) per ripristinarlo –

6

Override - (void) metodo viewWillAppear nel viewController e provare il codice qui sotto,

- (void)viewWillAppear { 

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

Chiudi, ma questo si sovrapporrà alla vista sottostante invece di spostarsi esso. – rwyland

+1

Potrebbe dipendere dallo stile della barra di navigazione. Se è di tipo traslucido, si sovrapporrà alle visualizzazioni. Penso che se è opaco, le sottoview potrebbero spostarsi automaticamente verso il basso. –

+2

No, il primo 44px andrà bene su opaco, ma tutto dopo viene sovrapposto. Ho anche scoperto che il frame di navigazioneBar verrà reimpostato sulla rotazione dello schermo o sulla ripresa delle app (viewWillAppear non viene richiamato sul resume dell'app). Quindi, purtroppo, questo hack non funzionerà correttamente. – rwyland

7

ho risolto questo problema, ho creato la sottoclasse di UINavigationController. In questo file MainNavigationViewController.m riscrivo il metodo viewDidLayoutSubviews(), dove ho impostato il frame per self.navigationBar

4

Soluzione più semplice ed efficace è aggiungere una categoria alla barra di navigazione.(ma forse non la soluzione migliore)

@interface UINavigationBar (CustomHeight) 

@end 


@implementation UINavigationBar (CustomHeight) 

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

knavBarHeightNoStatus è l'altezza della barra di navigazione. Usiamo limiti UIScreen perché fotogramma di UINavigationBar è sbagliato

PS: Attenzione, è possibile avere alcuni problemi di utilizzarlo con un SideMenu

+1

Ho provato tutte le altre risposte. Solo questo ha funzionato. –

2

mi sono imbattuto in un sacco di problemi a seconda del metodo scelto. Nel mio caso specifico, la barra di navigazione era nascosta in tutta l'app tranne che in Impostazioni View Controller. Poiché avevo bisogno di specificare un'altezza personalizzata della barra di navigazione e di mostrare la barra di navigazione allo stesso tempo, il passaggio tra il controller della vista sorgente e il Controller vista impostazioni aveva un'animazione molto sciatta.

La soluzione migliore in assoluto può essere trovata qui: https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2. Ho appena importato la categoria in Controller vista impostazioni e in viewDidLoad chiamato il metodo setHeight: su `self.navigationController.navigationBar '. Sembra fantastico!

1

Seguendo codice non influenzerà gli altri parametri a telaio, eccetto altezza

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

se si desidera modificare altri parametri significa, basta modificare l'uno qualsiasi dei parametri ....

0

Prova questo codice all'interno - (void)viewDidLayoutSubviews metodo,

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

Creazione di categoria e prioritario sizeTha Formato tFits (_ size: CGSize) -> CGSize cambia UINavigationBar in tutta l'app. Supponendo che tu voglia modificare UINavigationBar height/size solo in un particolare ViewController (nel mio caso)

Ecco come l'ho fatto.

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) 
    } 
} 

nel chiamante ViewController sarebbe simile

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: non funziona più con sottoclassi iOS11 UINavigationBar. Apple Engineering ha confermato che questa tecnica non è mai stata supportata e con iOS11 cambia sizeThatFits: non viene più consultato.