Je l'ai fait en réglant le CustomView du UIBarButtonItem à un UIButton avec une image d'icône, puis en ajoutant un UIActivityIndicator comme sous-vue du UIButton.
Pour le configurer, j'ai simplement fait glisser un UIButton sur le UIBarButtonItem dans Interface Builder (vous pouvez également le faire dans votre code). Ensuite, pour afficher l'indicateur d'activité:
UIButton *customButton = (UIButton *)self.refreshButton.customView;
[customButton setImage:nil forState:UIControlStateNormal];
[customButton removeTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[customButton addTarget:self action:@selector(altButtonAction) forControlEvents:UIControlEventTouchUpInside];
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
self.activityIndicator.frame = CGRectMake(round((customButton.frame.size.width - 25)/2), round((customButton.frame.size.height - 25)/2), 25, 25);
self.activityIndicator.userInteractionEnabled = FALSE; // this allows the button to remain tappable
[customButton addSubview:self.activityIndicator];
[self.activityIndicator startAnimating];
Et pour revenir à l'état par défaut du bouton:
UIButton *customButton = (UIButton *)self.refreshButton.customView;
[customButton setImage:[UIImage imageNamed:@"IconRefresh"] forState:UIControlStateNormal];
[customButton removeTarget:self action:@selector(altButtonAction) forControlEvents:UIControlEventTouchUpInside];
[customButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
[self.activityIndicator removeFromSuperview];
[self.activityIndicator release];
Quelques notes:
- Si vous ne voulez pas changer le bouton Lorsque l'action est active, vous pouvez supprimer les lignes addTarget et removeTarget.
- Si vous ne voulez pas que le bouton soit tappable lorsqu'il est dans l'état "actif", vous pouvez ignorer la ligne userInteractionEnabled pour l'indicateur d'activité (ou supprimer la cible et l'ajouter de nouveau).
- Un UIBarButtonItem avec un CustomView n'affichera pas la bordure du bouton. Si vous voulez cette bordure, vous devrez créer votre propre image et l'ajouter en tant qu'image de fond de l'UIButton.
Les tailles sur ce sont légèrement fausses - bien que la technique elle-même est bonne - voir ci-dessous pour la correction – Adam