子类化UIImageView - 不显示或显示动画图像

时间:2010-07-05 11:44:22

标签: objective-c animation uiimageview uiimage subclassing

我正在尝试子类化UIImageView以创建一个子类的实例,它根据我发送的变量播放不同的动画。我用于播放特定2帧动画的初始代码(在子类化之前)看起来像这样。 'bubbleAnimationTemp'只是我在标题中声明的UIImageView对象:

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

然后我尝试了如下子类化UIImageView:

#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;
}

正如您所看到的,我尝试了两种不同的方法来创建UIImages以添加到UIImageView。但我遇到的问题是动画播放时没有任何显示。

我也试过简单地将代码从第一个方法复制到这个子类中,所以这个过程基本相同,但仍然没有出现。

我已经检查了文档中有关子类化UIImageView的注释,但似乎没有任何我遗漏的内容。我确保将我在Interface Builder中放置的'UIImageView'对象更改为'BubbleAnimation'对象,所以不是这样。

任何关于为什么没有出现的任何帮助都将非常感激。一如既往地谢谢!

迈克尔

**************** UPDATE ****************

好吧,多亏Kalle的建议,这一切都是固定的。然而,现在一个类似的问题再次出现,我想知道我做错了什么。

基本上,我希望在动画旁边有一个出现在思想泡泡中的小心脏。我已经像这样在BubbleAnimation类中添加了一个UIImage:

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

@property (nonatomic, retain) UIImage *heart;

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

@end

并像往常一样在实现中合成它。然后我在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 ...

在IB中,我添加了一个隐藏的UIImageView对象,并将其链接到我的ViewController中名为bubbleHeart的UIImageView IBOutlet。当思想泡泡出现时,我使用以下代码来显示动画和心脏:

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

问题是,动画出现了,但小小的心却没有。我尝试了各种方法 - 我在BubbleAnimation类中创建了UIImageView,而不是使用UIImage,并尝试以各种不同的方式初始化它,但没有快乐。如果我打电话给self.bubbleHeart = [[UIImageView alloc] initWithImage:bubbleAnimation.heart];之类的东西,那么我可能会重新初始化变量,这样就行不通了。知道为什么它没有出现吗?

非常感谢!

迈克尔

1 个答案:

答案 0 :(得分:0)

在您的原始代码中,您从未分配过BubbleAnimation的新实例,这就是它工作正常的原因。

你在XIB文件中有一个对象,它是BubbleAnimation对象,这很好,但问题是你正在分配一个新的BubbleAnimation实例,而不是使用修改过的代码中的那个。

即使您使用的是自己的,也必须更改init方法,因为系统会调用initWithCoder:,而不是initWithMood:

最好的事情是将init函数更改为其他内容,例如:一个setMood:,用于修改图像视图。然后每次都重复使用相同的图像视图。

然后你只需要使用像......这样的东西进行设置。

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