2010-07-05 11 views
0

J'essaye de sous-classer UIImageView afin de créer une instance de la sous-classe qui joue différentes animations, en fonction d'une variable que je lui envoie. Mon code initial (avant le sous-classement) pour la lecture d'une animation spécifique à 2 images ressemblait à ceci. 'BubbleAnimationTemp' est juste un objet UIImageView je déclarais dans l'en-tête:Sous-classe UIImageView - les images d'animation ne s'affichent pas ou apparaissent

UIImage *animImage1 = [UIImage imageNamed:@"HappyAnim1.png"]; 
    UIImage *animImage2 = [UIImage imageNamed:@"HappyAnim2.png"]; 
    NSArray *images = [[NSArray alloc] initWithObjects:animImage1, animImage2, nil]; 
    bubbleAnimationTemp.animationImages = images; 
    [images release]; 
    bubbleAnimationTemp.animationDuration = 0.5; 
    bubbleAnimationTemp.animationRepeatCount = 5; 
    [bubbleAnimationTemp startAnimating]; 

Alors j'ai essayé le sous-classement UIImageView comme ceci:

#import <UIKit/UIKit.h> 
#import "Interaction.h" 

@interface BubbleAnimation : UIImageView { 
    UIImage *emotAnim1; 
    UIImage *emotAnim2; 
} 

@property (nonatomic, retain) UIImage *emotAnim1; 
@property (nonatomic, retain) UIImage *emotAnim2; 

- (BubbleAnimation *)initWithMood:(NSString *)mood; 

@end

#import "BubbleAnimation.h" 

@implementation BubbleAnimation 

@synthesize emotAnim1; 
@synthesize emotAnim2; 

- (BubbleAnimation *)initWithMood:(NSString *)mood { 
    if (self = [super init]) { 
     NSLog(@"Mood: %@", mood); 
     if ([mood isEqualToString:kGood]) { 
      emotAnim1 = [[UIImage alloc] initWithContentsOfFile:([[NSBundle mainBundle] pathForResource:@"HappyAnim1" ofType:@"png"])]; 
      emotAnim2 = [[UIImage alloc] initWithContentsOfFile:([[NSBundle mainBundle] pathForResource:@"HappyAnim2" ofType:@"png"])]; 
      //emotAnim1 = [UIImage imageNamed:@"HappyAnim1.png"]; 
      //emotAnim2 = [UIImage imageNamed:@"HappyAnim2.png"]; 
     } 
     else if ([mood isEqualToString:kNeutral]) { 
      emotAnim1 = [UIImage imageNamed:@"NeutralAnim1.png"]; 
      emotAnim2 = [UIImage imageNamed:@"NeutralAnim2.png"]; 
     } 
     else { 
      emotAnim1 = [UIImage imageNamed:@"SadAnim1.png"]; 
      emotAnim2 = [UIImage imageNamed:@"SadAnim2.png"]; 
     } 
     NSArray *images = [[NSArray alloc] initWithObjects:emotAnim1, emotAnim2, nil]; 
     self.animationImages = images; 
     [images release]; 
    } 
    return self; 
} 

Comme vous pouvez le voir , J'ai essayé deux approches différentes pour créer les UIImages à ajouter à UIImageView. Mais le problème que j'ai est que rien ne se montre quand l'animation joue.

J'ai également essayé simplement de copier le code de la première méthode dans cette sous-classe, de sorte que le processus est essentiellement le même, mais toujours rien n'apparaît.

J'ai vérifié dans la documentation les notes sur le sous-classement de UIImageView mais il ne semble pas y avoir quelque chose qui me manque. Je me suis assuré de changer l'objet 'UIImageView' que j'ai placé dans Interface Builder dans un objet 'BubbleAnimation', donc ce n'est pas ça.

Toute aide pour expliquer pourquoi rien n'apparaît serait très appréciée. Merci comme toujours!

Michael

**************** MISE À JOUR ****************

Eh bien, grâce à Le conseil de Kalle ci-dessous, tout est fixé. Cependant, maintenant un problème similaire se reproduit et je me demande ce que je fais mal.

Fondamentalement, je veux avoir un petit cœur qui apparaît dans la bulle de pensée, à côté de l'animation. J'ai ajouté un UIImage à la classe BubbleAnimation comme ceci:

@interface BubbleAnimation : UIImageView { 
    UIImage  *emotAnim1; 
    UIImage  *emotAnim2; 
    UIImage  *heart; 
} 

@property (nonatomic, retain) UIImage *heart; 

- (void)setMood:(NSString *)mood; 

@end 

Et dans la LA SYNTHÈSE mise en œuvre comme d'habitude. Ensuite, je mets le cœur à la bonne couleur dans la méthode setMood:

- (void)setMood:(NSString *)mood { 
    if ([mood isEqualToString:kGood]) { 
     emotAnim1 = [UIImage imageNamed:@"Good1.png"]; 
     emotAnim2 = [UIImage imageNamed:@"Good2.png"]; 
     self.heart = [UIImage imageNamed:@"HeartRed.png"]; 
    } 
    else if ... 

Dans IB, j'ai ajouté un objet UIImageView caché et il est lié à un UIImageView IBOutlet dans mon ViewController appelé bubbleheart. Lorsque la bulle de pensée apparaît, j'utilise le code suivant pour afficher les animations et le cœur:

[bubbleAnimation setMood:charachter.mood]; 
self.bubbleHeart.image = bubbleAnimation.heart; 
     bubbleAnimation.animationDuration = kAnimationDuration; 
     bubbleAnimation.animationRepeatCount = kAnimationRepeatCount; 
     [bubbleAnimation startAnimating]; 
     bubbleHeart.hidden = FALSE; 

Le problème est, l'animation apparaît, mais le petit cœur ne fonctionne pas. J'ai essayé différentes approches - j'ai créé UIImageView dans la classe BubbleAnimation, au lieu d'utiliser un UIImage, et essayé de l'initialiser de différentes manières, mais pas de joie. Si j'appelle quelque chose comme self.bubbleHeart = [[UIImageView alloc] initWithImage:bubbleAnimation.heart]; alors probablement je réinitialise la variable de sorte que cela ne fonctionne pas. Une idée de pourquoi ça n'apparait pas?

Merci beaucoup!

Michael

+0

D'ailleurs, voici comment j'appelle l'animation à jouer (désolé pour le formatage!): bubbleAnimation = [[BubbleAnimation alloc] initWithMood: charcter.mood]; \t bubbleAnimation.animationDuration = 0,5; \t bubbleAnimation.animationRepeatCount = 5; \t [bubbleAnimation startAnimating]; – Smikey

+0

Parenthèse, mais: Vous pouvez éditer votre question (ceci est préféré) pour obtenir le bon formatage et ainsi de suite. ;) – Kalle

Répondre

0

Dans votre code d'origine, vous n'attribué une nouvelle instance de BubbleAnimation, et c'est la raison pour laquelle il a bien fonctionné.

Vous avez un objet dans le fichier XIB qui est l'objet BubbleAnimation, et tout va bien, mais le problème est que vous allouer une nouvelle instance de BubbleAnimation au lieu d'utiliser celui que vous avez dans votre code révisé.

Même si vous deviez utiliser celui que vous possédez, vous devrez modifier la méthode init, car le système appellera initWithCoder:, et non initWithMood:. La meilleure chose est la plus susceptible de changer la fonction init en quelque chose d'autre, par exemple,

un setMood:, qui modifie la vue de l'image. Ensuite, vous réutilisez la même vue d'image à chaque fois.

alors vous venez de mettre en place en utilisant quelque chose comme ...

[bubbleAnimation setMood:character.mood]; 
bubbleAnimation.animationDuration = 0.5; 
bubbleAnimation.animationRepeatCount = 5; 
[bubbleAnimation startAnimating]; 
+0

Aaaah ok je pense que je vois. Donc même si j'ai déclaré l'instance de BubbleAnimation comme une IBOutlet, et que je l'ai liée à l'instance dans IB - parce que j'utilise la méthode alloc, elle crée une nouvelle instance plutôt que d'utiliser celle créée par IB. Ok, je vais essayer l'approche de la méthode setMood maintenant et vous laisser savoir comment ça se passe. Merci beaucoup pour l'aide!! – Smikey

+0

Cela a fonctionné parfaitement. Merci beaucoup pour l'aide: D – Smikey

+0

Mon plaisir! :) – Kalle