alinear verticalmente UINavigationItems

He personalizado la altura de UINavigationBar a 100 px y me gustaría agregar botones a esta barra personalizada.

Todo está bien, excepto que el button parece querer sentarse en el background de la barra de navigation sin importar qué. No puedo hacer que se alinee con el centro o la parte superior de la barra de navigation.

introduzca la descripción de la imagen aquí

Aquí está el código; primero creo un controller de navigation en el delegado de la aplicación y agrego un button a la derecha.

// 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]; 

luego cambio el tamaño de la barra de navigation en el controller de vista "temporal" de la siguiente manera:

 - (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]; } 

También intenté agregar una vista personalizada al rightBarButtonItem pero no puedo get la vista personalizada agregada para tocar la parte superior por completo.

introduzca la descripción de la imagen aquí

Y el código para este desafortunado bash:

 // 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]; 

¿Alguien sabe cómo alinear UIBarButtonItems verticalmente en un UINavigationBar?

Opción 1:

  • crear subclass UINavigationBar
  • dentro de esta class anular - (void)layoutSubviews donde reposicionará UIBarButtonItems
  • en el Generador de interfaces establece la class UINavigationBar en la subclass UINavigationBar

Ejemplo:

dentro de la subclass 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; } } 

ver controller:

 - (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]; ... } 

Opción 2 (insert UIBarButtonItem no funciona):

 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]; 

Esto moverá el título de la página y todos los botones de hasta 20 px:

 [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:-20.0 forBarMetrics:UIBarMetricsDefault]; [[UIBarButtonItem appearance] setBackgroundVerticalPositionAdjustment:-20.0 forBarMetrics:UIBarMetricsDefault]; 

La respuesta actual aceptada de alhcr (Opción 1) no funciona si solo tiene un rightBarButtonItem y no queda. También está haciendo una suposition sobre el order de la subview del UINavigationBar que no está garantizado y podría muy bien cambiar en una futura versión de iOS. Aquí hay una mejor manera de personalizar los frameworks de los botones 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]; } } } 

Encontré la solución de este problema haciendo ajustes en los recuadros de borde de image del button personalizado. Tuve el requisito de la aplicación para boost la altura de la barra de navigation y después de boost la altura hace que el problema rightBarButtonItem y leftBarButtonItem no estén posicionados.

Encuentre el código a continuación:

 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;