Modifier la largeur d'un UIBarButtonItem dans un UINavigationBar

Je crée un UIBarButtonItem et l'ajoute à ma barre de navigation comme ceci:

(void)viewDidLoad { ... // Add the refresh button to the navigation bar UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom]; [refreshButton setFrame:CGRectMake(0,0,30,30)]; [refreshButton setImage:[UIImage imageNamed:@"G_refresh_icon.png"] forState:UIControlStateNormal]; [refreshButton addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *refreshBarButton = [[[UIBarButtonItem alloc] initWithCustomView:refreshButton] autorelease]; self.navigationItem.leftBarButtonItem = refreshBarButton; } 

Il semble correct quand je cours, mais je peux choisir l'élément de button de barre en appuyant sur la barre de navigation n'importe où de x = 0 à environ 100. Comment puis-je ajuster la zone sélectionnable pour avoir une largeur de 30 px?

Darren,

Une approche que vous pourriez envisager est la création d'un UIBarButtonItem en appelant initWithCustomView. Ce n'est pas idéal car vous n'obtenez pas les états "sélectionnés" et vous devez composer votre arrière-plan à bordure (si vous voulez ce look) avec votre image de button, mais avec cela vous pouvez spécifier plus directement un cadre pour votre élément de barre d'outils. Si vous utilisez du text pour votre titre au lieu d'images, vous devrez peut-être append une image d'arrière-plan en tant que sous-vue. De toute façon, j'ai le même problème en ce moment et ce code fonctionne pour moi:

 UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"button-image.png"]]; imageView.frame = CGRectMake(0, 0, 43, 30); UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageView]; self.navigationItem.leftBarButtonItem = barButtonItem; 

À l'heure actuelle, c'est la seule façon que je connaisse de restreindre l'auto-dimensionnement des UIBarButtonItems ajoutés à l'élément navigationItem de UINavigationController.

[ÉDITÉ]

Ou essayez la solution de Maggie, qui est plus complète que la mienne .

Vous pouvez le faire en déposant une image sur l'élément du button de la barre du constructor de l'interface et en modifiant la largeur de la vue personnalisée avec ce code:

 CGRect frame = self.navigationItem.leftBarButtonItem.customView.frame; frame.size.width = 141; self.navigationItem.leftBarButtonItem.customView.frame = frame; 

La chose key avec ceci est de réaliser que vous changez la largeur de la vue personnalisée, plutôt que le UIBarButton lui-même.

Le code est donc:

 CGRect resizedFrame = myBarButtonItem.customView.frame; resizedFrame.size.width = myNewWidth; myBarButtonItem.customView.frame = resizedFrame; 

Vous devrez également triggersr le changement de disposition:

 [myNavigationBar setNeedsLayout]; 

Tout cela va sans dire que la layout est en cours avec Auto Sizing et les frameworks. Les incursions dans les barres de navigation avec Auto Layout n'ont pas abouti. Voyez ma question Auto Layout avec UINavigationBar et UIBarButtonItem .

Désolé, je viens de réaliser que mon code est presque identique à @oscartzombie. Pas intentionnel! Je vais laisser cette réponse car je pense que cela vaut la peine d'append la layout et d'autres points, en plus d'expliquer sans reference à Interface Bulder ou des images en particulier.

L'approche suivante a fonctionné, voir le code pour changer la largeur et la hauteur du button et pour append un élément d'action.

 UIButton *imageButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 22, 22)]; [imageButton setBackgroundImage:[UIImage imageNamed:@"message_button"] forState:UIControlStateNormal]; [imageButton addTarget:self action:@selector(messageButtonTapped) forControlEvents:UIControlEventAllEvents]; UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageButton]; self.navigationItem.leftBarButtonItem = leftBarButtonItem; 

Remarque: La cible et l'action de UIBarButtonItem ne s'appliquent pas à l'affichage de l'image