2009-05-21 8 views
22

Quelqu'un peut-il me dire comment changer la hauteur de la barre de navigation?Modifier UINavigationBar Height

Voici ce que j'ai jusqu'à présent:

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

Ceci est une copie de cette question: http://stackoverflow.com/questions/892905/change-iphone-navigation-bars-height. –

+2

frame.size. ** largeur **? –

Répondre

6

Essayez d'utiliser -

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

Ne change rien. J'ai essayé de définir le cadre lorsque je crée le UINavigationController dans mon AppDelegate. Il n'y a aucun message d'erreur ou quoi que ce soit, mais la hauteur de la barre de navigation ne change pas du tout. Testé avec Xcode 4.4 et iOS 4.3, 5.0, 5.1. –

+0

@Cliff Viegas Merci – nivritgupta

3

self.navigationController.navigationBar.frame est une propriété readonly sur la version iOS 4.x

il sera changé, même si , vous verrez un comportement anormal.

par exemple, lorsque l'état de l'application a changé à fond et revenir au premier plan la barre de navigation montrera la hauteur de taille originale

21

Vous ne devez pas modifier la hauteur de la barre de navigation. De Apple Guide sur Programing View Controller:

Personnalisation de la barre de navigation Apparence

Dans une interface de navigation, un contrôleur de navigation possède son objet UINavigationBar et est responsable de la gestion. Il n'est pas permis de modifier l'objet de la barre de navigation ou de modifier ses limites, son cadre ou ses valeurs alpha directement. Cependant, il y a quelques propriétés qu'il est permis de modifier, y compris les éléments suivants:

● barStyle propriété

● translucidité

● tintColor propriété

(prise d'Apple: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html)

- MISE À JOUR - IOS 7 --- seules les propriétés disponibles peuvent être modifiées mais voici un bon tutoriel sur la façon d'obtenir de la flexibilité dans la barre de navigation http://www.appcoda.com/customize-navigation-status-bar-ios-7/

+1

Cela ne semble plus être présent dans les directives iOS7. Il liste toujours les propriétés directement accessibles, mais ne mentionne pas qu'il est interdit de modifier quoi que ce soit. –

+1

Il semble toujours voir - https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html –

+1

En effet, il est - j'ai raté cela. Merci. –

25

Vous pouvez créer une classe de catégorie basée sur UINavigationBar comme celui-ci

.h

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

et le fichier .m

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

Il fonctionne très bien.

+0

cela fonctionne mais déplace UINavigationItem vers le haut, le titre et les éléments ne sont plus alignés horizontalement – Anand

+0

@Anand: Même problème est-il une solution pour cela? – iBapu

+1

Pour recentrer le titre, utilisez '[auto.navigationBar setTitleVeritcalPositionAdjustment: (float) forBarMetrics: UIBarMetricsDefault]; 'où' float' est une valeur positive pour pousser le titre vers le bas et une valeur négative pour le repousser vers le haut. Donc, si votre barre de navigation est à 44 (valeur par défaut) et que vous la définissez à 60, définissez float à -8 ((60-44)/2) pour la recoder –

6

Override - (void) méthode viewWillAppear dans le viewController et essayez le code ci-dessous,

- (void)viewWillAppear { 

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

Fermer, mais cela chevauchera la vue sous-jacente au lieu de la déplacer il. – rwyland

+1

Cela peut être dû au style de votre barre de navigation. S'il s'agit d'un type translucide, il chevauchera les vues. Je pense que si elle est opaque, alors les sous-vues peuvent être décalées automatiquement. –

+2

Non, le premier 44px ira bien sur opaque, mais tout se chevauche après. J'ai également découvert que le cadre navigationBar se réinitialisera à la rotation de l'écran ou sur le CV de l'application (viewWillAppear n'est pas appelé sur le CV de l'application). Donc, malheureusement, ce hack ne fonctionnera pas correctement. – rwyland

7

J'ai résolu cette question, j'ai créé la sous-classe de UINavigationController. Dans ce fichier MainNavigationViewController.m je réécrit la méthode viewDidLayoutSubviews(), où je définis le cadre pour self.navigationBar

4

La solution la plus simple et efficace consiste à ajouter une catégorie à la barre de navigation.(Mais peut-être pas la meilleure solution)

@interface UINavigationBar (CustomHeight) 

@end 


@implementation UINavigationBar (CustomHeight) 

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

knavBarHeightNoStatus est la hauteur de votre barre de navigation. Nous utilisons des limites parce que UIScreen cadre de UINavigationBar est erroné

PS: Attention, vous pouvez avoir des problèmes avec l'aide d'un SideMenu

+1

J'ai essayé toutes les autres réponses. Seul celui-ci a fonctionné. –

2

Je suis tombé sur beaucoup de problèmes en fonction de la méthode choisie. Dans mon cas particulier, la barre de navigation était masquée dans l'application, sauf dans le contrôleur d'affichage des paramètres. Comme j'avais besoin de spécifier une hauteur personnalisée de la barre de navigation et d'afficher la barre de navigation en même temps, la séquence entre le contrôleur de vue source et le contrôleur de vue des paramètres avait une animation très mouillée.

La meilleure solution absolue peut être trouvée ici: https://gist.github.com/maciekish/c2c903d9b7e7b583b4b2. Je viens d'importer la catégorie dans le contrôleur View View, et dans viewDidLoad appelé la méthode setHeight: sur `self.navigationController.navigationBar '. Ça a l'air génial!

1

code suivant n'affectera d'autres paramètres dans le châssis, sauf la hauteur

[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 vous souhaitez modifier d'autres paramètres signifie, il suffit d'éditer l'une des paramètres ....

0

Essayez ce code à l'intérieur - (void)viewDidLayoutSubviews méthode,

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

Création catégorie et dominante sizeTha tFits (_ size: CGSize) -> CGSize La méthode modifie la taille de UINavigationBar dans toute l'application. En supposant que vous voulez changer UINavigationBar hauteur/taille seulement dans un ViewController particulier (dans mon cas)

Voici comment je l'ai fait.

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 appelant ViewController ressemblerait

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: ne fonctionne plus avec les sous-classes iOS11 UINavigationBar. Apple Engineering a confirmé que cette technique n'a jamais été supportée et avec iOS11 change sizeThatFits: n'est plus consultée.

Questions connexes