2010-07-05 64 views
0

我想要繼承UIImageView以創建一個實例,它可以播放不同的動畫,具體取決於我發送的變量。我最初的代碼(在繼承之前)播放特定的2幀動畫看起來像這樣。 'bubbleAnimationTemp' 只是一個UIImageView對象我的頭部聲明:Subclassing 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; 
} 

正如你所看到的,我嘗試了兩種不同的方法來創建UIImage以添加到UIImageView。但是我遇到的問題是動畫播放時什麼也沒有顯示出來。

我也試着簡單地將代碼從第一個方法複製到這個子類中,所以這個過程本質上是一樣的,但仍然沒有出現。

我已經檢查了UIImageView的子類注意事項的文檔,但似乎沒有任何東西我失蹤。我已經確保將放置在Interface Builder中的'UIImageView'對象更改爲'BubbleAnimation'對象,所以不是這樣。

任何幫助,爲什麼什麼都不顯示將非常感激。一如既往地感謝!

邁克爾

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

好了,感謝卡勒的建議如下,這一切都是固定的。但是,現在又出現了類似的問題,我想知道我做錯了什麼。

基本上,我想有一個出現在思想泡泡中的小心臟,與動畫一起。我添加了一個UIImage到BubbleAnimation類,像這樣:

@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對象,並將其鏈接到一個UIImageView IBOutlet中在我的ViewController稱爲bubbleHeart。當思想泡沫出現時,我用下面的代碼來顯示動畫和心臟:

[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];那麼大概我正在重新初始化變量,以至於不起作用。任何想法爲什麼它不出現?

非常感謝!

邁克爾

+0

順便說一句,這是我我打電話的動畫播放(抱歉格式化!): bubbleAnimation = [[BubbleAnimation alloc] initWithMood:charcter.mood]; \t bubbleAnimation.animationDuration = 0.5; \t bubbleAnimation.animationRepeatCount = 5; \t [bubbleAnimation startAnimating]; – Smikey 2010-07-05 15:12:06

+0

括號,但:您可以編輯您的問題(這是首選),以獲得漂亮的格式等。 ;) – Kalle 2010-07-06 09:49:12

回答

0

在你的原代碼,你永遠不分配的BubbleAnimation一個新的實例,這就是爲什麼它工作得很好。

你在XIB文件中有一個BubbleAnimation對象,這一切都很好,但問題是你正在分配一個BubbleAnimation的新實例,而不是使用你修改過的代碼中的一個。

即使您要使用您擁有的那個,您也必須更改init方法,因爲系統將調用initWithCoder:而不是initWithMood:

最好的事情是最有可能改變init函數爲其他東西,例如,一個setMood:,它修改圖像視圖。然後每次重新使用相同的圖像視圖。

然後你設置好它使用類似...

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

Aaaaah好吧我想我明白了。因此,即使我將BubbleAnimation的實例聲明爲IBOutlet,並將其與IB中的實例關聯 - 因爲我使用alloc方法,它創建了一個新實例,而不是使用IB創建的實例。好的,我現在嘗試setMood方法,並讓你知道它是如何發生的。非常感謝你的幫助!! – Smikey 2010-07-08 13:11:03

+0

它工作完美。非常感謝您的幫助:D – Smikey 2010-07-08 15:50:20

+0

我的榮幸! :) – Kalle 2010-07-08 17:10:42