2010-01-18 5 views
0

Existe-t-il un moyen de définir une image animée comme le périphérique de rotation Apple sur un UIBarButtonItem?SDK iPhone: définissez l'image de chargement animée (engrenage) sur UIBarButtonItem

J'ai essayé cette ligne de code, mais l'image GIF animée coutume de jouer:

myButton.image = [UIImage imageNamed:@"spinningGear.gif"]; 
+0

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

Répondre

2

Essayez de créer un UIActivityIndicatorView et l'attribuer à votre bouton avec -[UIBarButtonItem initWithCustomView:].

+0

Cela ne fonctionne pas. Je ne sais pas où vous l'avez essayé - ne fonctionne pas dans iOS 3, et ne semble pas fonctionner dans iOS 4 non plus – Adam

0

Je ne pense pas que ce soit possible avec UIBarButtonItem.

Vous pouvez utiliser customView pour cela (la propriété ou initWithCustomView) et utiliser UIImageView comme vue. Cela ne va pas encore animer gif "out of the box" (juste vérifié).

Si vous le faites, vous avez deux options:

  • utilisation animatedImages de la classe UIImageView et utiliser des images séparées pour chaque image (écriture de la tête - le code peut avoir des erreurs):

 
NSMutableArray * imgs = [NSMutableArray array]; 
for(int i = 0; i < NUMBER_OF_FRAMES; i++) { 
    [imgs addObject: [UIImage imageNamed: [NSString stingWithFormat: @"anim%d.png", i]]]; 
} 
UIImageView * imgview = [[UIImageView alloc] init]; 
imgview.animatedImages = imgs; 
[imgview startAnimating]; 

0

Je trouve que cette ligne était incorrecte:

[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; 

... la taille réelle de la valeur par défaut bouton Actualiser d'Apple est un peu différent. Si vous avez d'autres éléments faisant la mise en page automatique sur cette barre d'outils, vous devez obtenir la bonne taille.

Malheureusement, Apple fournit aucune API pour connaître la taille. Par tâtonnement, il semble que ce soit correct:

[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 28, 28)]; 
+0

Vous pouvez également 'sizeToFit', puis regardez les' bounds'. – kevboh

0

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:

  1. Si vous ne voulez pas changer le bouton Lorsque l'action est active, vous pouvez supprimer les lignes addTarget et removeTarget.
  2. 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).
  3. 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.