0

送信する変数に応じて、さまざまなアニメーションを再生するサブクラスのインスタンスを作成するために、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;

@終わり

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

ご覧のとおり、UIImageView に追加する UIImages を作成するための 2 つの異なる方法を試しました。しかし、私が抱えている問題は、アニメーションの再生時に何も表示されないことです。

また、最初のメソッドのコードをこのサブクラスに単純にコピーしようとしたため、プロセスは本質的に同じですが、まだ何も表示されません。

UIImageView のサブクラス化に関する注意事項についてドキュメントを確認しましたが、不足しているものはないようです。Interface Builderに配置した「UIImageView」オブジェクトを「BubbleAnimation」オブジェクトに変更したことを確認したので、そうではありません。

なぜ何も表示されないのかについての助けをいただければ幸いです。いつもありがとう!

マイケル

****************アップデート****************

さて、以下のKalleのアドバイスのおかげで、これはすべて修正されました. しかし、現在、同様の問題が再発しており、何が間違っているのだろうか。

基本的には、アニメーションと一緒に、ふきだしに表示される小さなハートが欲しいです。次のように 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 オブジェクトを追加し、bubbleHeart という ViewController の UIImageView IBOutlet にリンクしました。吹き出しが表示されたら、次のコードを使用してアニメーションとハートを表示します。

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

問題は、アニメーションは表示されますが、小さなハートが表示されないことです。UIImage を使用する代わりに、BubbleAnimation クラスで UIImageView を作成し、さまざまな方法で初期化しようとしましたが、喜びはありませんでした。そのようなものを呼び出すとself.bubbleHeart = [[UIImageView alloc] initWithImage:bubbleAnimation.heart];、おそらく変数を再初期化しているため、機能しません。なぜそれが表示されないのですか?

どうもありがとう!

マイケル

4

1 に答える 1

0

元のコードでは、 の新しいインスタンスを割り当てなかったBubbleAnimationので、正常に動作しました。

XIB ファイルに BubbleAnimation オブジェクトのオブジェクトがあり、それで問題ありませんが、問題は、修正したコードにあるインスタンスを使用する代わりに、BubbleAnimation の新しいインスタンスを割り当てていることです。

持っているものを使用する場合でも、システムはinitWithCoder:ではなくを呼び出すため、init メソッドを変更する必要がありますinitWithMood:

最善の方法は、 init 関数を別のものに変更することです。たとえばsetMood:、画像ビューを変更する a などです。次に、毎回同じ画像ビューを再利用します。

次に、次のようなものを使用してセットアップするだけです...

[bubbleAnimation setMood:character.mood];
bubbleAnimation.animationDuration = 0.5; 
bubbleAnimation.animationRepeatCount = 5; 
[bubbleAnimation startAnimating];
于 2010-07-06T09:54:21.600 に答える