aligner verticalement UINavigationItems

J'ai personnalisé la hauteur de UINavigationBar à 100px et j'aimerais append des buttons sur cette barre personnalisée.

Tout est bon sauf que le button semble vouloir s'asseoir au fond de la barre de navigation, quoi qu'il arrive. Je ne peux pas l'aligner avec le centre ou le haut de la barre de navigation.

entrez la description de l'image ici

Voici le code; Je crée d'abord un controller de navigation dans le délégué de l'application et j'ajoute un button sur la droite.

// set main navigation controller temp *tempc = [[temp alloc] initWithNibName:@"temp" bundle:nil]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:tempc]; UIBarButtonItem *navItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil]; [tempc.navigationItem setRightBarButtonItem:navItem]; [self.window addSubview:self.navigationController.view]; [self.window makeKeyAndVisible]; 

puis je redimensionne la barre de navigation dans le controller de vue "temp" comme ceci:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 100.0f); [self.navigationController.navigationBar setFrame:frame]; [self.navigationController.navigationBar setAutoresizingMask:UIViewAutoresizingFlexibleBottomMargin]; } 

J'ai également essayé d'append une vue personnalisée à rightBarButtonItem mais je ne peux pas get l'affichage personnalisé ajouté pour toucher complètement le dessus.

entrez la description de l'image ici

Et le code pour cette tentative malheureuse:

 // set main navigation controller temp *tempc = [[temp alloc] initWithNibName:@"temp" bundle:nil]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:tempc]; UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 36.0f, 80.0f)]; [customView setBackgroundColor:[UIColor blueColor]]; UIButton *customButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [customButton setFrame:CGRectMake(0, 22.0f, 36.0f, 36.0f)]; [customButton setTitle:@"+" forState:UIControlStateNormal]; [customView addSubview:customButton]; UIBarButtonItem *customItem = [[UIBarButtonItem alloc] initWithCustomView:customView]; 

Est-ce que quelqu'un sait comment aligner verticalement UIBarButtonItems sur un UINavigationBar?

Option 1:

  • créer la sous-class UINavigationBar
  • à l'intérieur de cette class override - (void)layoutSubviews où vous allez repositionner UIBarButtonItems
  • dans Interface Builder, définissez la class UINavigationBar sur la sous-class UINavigationBar

Exemple:

sous-class à l'intérieur de UINavigationBar:

 - (void)layoutSubviews { int index = 0; for ( UIButton *button in [self subviews] ) { if(index == 1) { [button setFrame:CGRectMake(5,40,60,40)]; //leftBarButtonItem } else if(index == 2) { [button setFrame:CGRectMake(275,40,40,40)]; //rightBarButtonItem } ++index; } } 

controller de vue:

 - (void)viewDidLoad { ... UIBarButtonItem *navItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil]; UIBarButtonItem *navItem2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:nil action:nil]; [self.navigationItem setRightBarButtonItem:navItem1]; [self.navigationItem setLeftBarButtonItem:navItem2]; CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 100.0f); [self.navigationController.navigationBar setFrame:frame]; ... } 

Option 2 (l'insertion de UIBarButtonItem ne fonctionne pas):

 UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0,0,320,100)]; [self.view addSubview:navigationBar]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button setFrame:CGRectMake(0,25,50,50)]; [navigationBar addSubview:button]; 

Cela va déplacer le titre de la page et tous les buttons jusqu'à 20 px:

 [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:-20.0 forBarMesortingcs:UIBarMesortingcsDefault]; [[UIBarButtonItem appearance] setBackgroundVerticalPositionAdjustment:-20.0 forBarMesortingcs:UIBarMesortingcsDefault]; 

La réponse actuellement acceptée par alhcr (Option 1) ne fonctionne pas si vous avez seulement un rightBarButtonItem et pas de left. Il fait également une supposition à propos de l'ordre de sous-visualisation de l'UINavigationBar qui n'est pas garanti et pourrait très bien changer dans une future version d'iOS. Voici une meilleure façon de personnaliser les frameworks des buttons de navigation:

 // UINavigationBar subclass - (void)layoutSubviews { [super layoutSubviews]; UINavigationItem *navigationItem = [self topItem]; for (UIView *subview in [self subviews]) { if (subview == [[navigationItem rightBarButtonItem] customView]) { CGRect newRightButtonRect = CGRectMake(...new rect...); [subview setFrame:newRightButtonRect]; } else if (subview == [[navigationItem backBarButtonItem] customView]) { CGRect newBackButtonRect = CGRectMake(...new rect...); [subview setFrame:newBackButtonRect]; } } } 

J'ai trouvé la solution de ce problème en faisant des ajustements dans les encarts de bord d'image du button personnalisé. J'ai eu l'exigence dans l'application pour augmenter la hauteur de la barre de navigation et après l'augmentation de la hauteur rend le problème rightBarButtonItem et leftBarButtonItem des images sans poser de problème.

Trouvez le code ci-dessous: –

 UIImage *image = [[UIImage imageNamed:@"searchbar.png"]; UIButton* searchbutton = [UIButton buttonWithType:UIButtonTypeCustom]; [searchbutton addTarget:self action:@selector(searchBar:) forControlEvents:UIControlEventTouchUpInside]; searchbutton.frame = CGRectMake(0,0,22, 22); [searchbutton setImage:image forState:UIControlStateNormal]; [searchbutton setImageEdgeInsets:UIEdgeInsetsMake(-50, 0,50, 0)]; // Make BarButton Item UIBarButtonItem *navItem = [[UIBarButtonItem alloc] initWithCustomView:searchbutton]; self.navigationItem.rightBarButtonItem = navItem;