Подкласс UIImageView - анимационные изображения не отображаются или не отображаются - PullRequest
0 голосов
/ 05 июля 2010

Я пытаюсь создать подкласс 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;
}

Как видите, я попробовал два разных подхода к созданию UIImages для добавления в UIImageView. Но проблема в том, что при воспроизведении анимации ничего не появляется.

Я также попытался просто скопировать код из первого метода в этот подкласс, поэтому процесс по сути такой же, но все равно ничего не появляется.

Я проверил документацию на предмет замечаний о создании подкласса UIImageView, но, похоже, я ничего не пропустил. Я удостоверился, что изменил объект 'UIImageView', который я поместил в Интерфейсном Разработчике, в объект 'BubbleAnimation', так что это не так.

Любая помощь относительно того, почему ничего не появляется, будет очень цениться. Спасибо как всегда!

Майкл

**************** ***************** UPDATE 1020 *

Что ж, благодаря совету Калле ниже, это все исправлено. Тем не менее, сейчас повторяется похожая проблема, и мне интересно, что я делаю не так.

По сути, я хочу иметь маленькое сердце, которое появляется в пузыре мысли, рядом с анимацией. Я добавил 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;

Проблема в том, что появляется анимация, а маленькое сердце - нет. Я пробовал разные подходы - я создал UIImageView в классе BubbleAnimation вместо использования UIImage и попытался инициализировать его различными способами, но без радости. Если я вызываю что-то вроде self.bubbleHeart = [[UIImageView alloc] initWithImage:bubbleAnimation.heart];, то, вероятно, я переинициализирую переменную, чтобы она не работала. Любая идея, почему это не появляется?

Большое спасибо!

Майкл

1 Ответ

0 голосов
/ 06 июля 2010

В исходном коде вы никогда не выделяли новый экземпляр BubbleAnimation, и поэтому он работал нормально.

У вас есть объект в файле XIB, который является объектом BubbleAnimation, и это все нормально, но проблема в том, что вы выделяете новый экземпляр BubbleAnimation вместо того, чтобы использовать тот, который у вас есть в пересмотренном коде.

Даже если вы используете тот, который у вас есть, вам придется изменитьметод init, так как система будет вызывать initWithCoder:, а не initWithMood:.

. Лучше всего изменить функцию init на что-то другое, например setMood:, которая изменяет вид изображения,Затем вы снова используете один и тот же вид изображения каждый раз.

Затем вы просто настраиваете его, используя что-то вроде ...

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