iPhone SDK: почему следующий код анимирует только первый кадр?

Я пытался анимировать с помощью NSTimer и настроил свой код следующим образом:

- (IBAction)startClick:(id)sender{

animationTimer = [NSTimer scheduledTimerWithTimeInterval:(.1/25.0) target:self selector:@selector(tick) userInfo:nil repeats:YES];

}

- (void)tick{
    [self animatePig];
}

- (void)animatePig{

    UIImage *pigImage1 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0004.png" ofType:nil] ];
    UIImage *pigImage2 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0005.png" ofType:nil] ];
    UIImage *pigImage3 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0006.png" ofType:nil] ];
    UIImage *pigImage4 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0007.png" ofType:nil] ];
    UIImage *pigImage5 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0008.png" ofType:nil] ];
    UIImage *pigImage6 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0009.png" ofType:nil] ];
    UIImage *pigImage7 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0010.png" ofType:nil] ];
    UIImage *pigImage8 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0011.png" ofType:nil] ];
    UIImage *pigImage9 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0012.png" ofType:nil] ];
    UIImage *pigImage10 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0013.png" ofType:nil] ];
    UIImage *pigImage11 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0014.png" ofType:nil] ];
    UIImage *pigImage12 =[UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"gordonapple0015.png" ofType:nil] ];

    if(gordon.image == pigImage1)
        gordon.image = pigImage2;
    else if(gordon.image == pigImage2)
        gordon.image = pigImage3;
    else if(gordon.image == pigImage3)
        gordon.image = pigImage4;
    else if(gordon.image == pigImage4)
        gordon.image = pigImage5;
    else if(gordon.image == pigImage6)
        gordon.image = pigImage7;
    else if(gordon.image == pigImage7)
        gordon.image = pigImage8;
    else if(gordon.image == pigImage8)
        gordon.image = pigImage9;
    else if(gordon.image == pigImage9)
        gordon.image = pigImage10;
    else if(gordon.image == pigImage10)
        gordon.image = pigImage11;
    else if(gordon.image == pigImage11)
        gordon.image = pigImage12;
    else
        gordon.image = pigImage12;


}

Кто-нибудь знает, почему это только анимирует первый кадр? Проблему, вероятно, очень просто исправить, я слишком новичок в разработке iPhone, чтобы это заметить. ----------Редактировать----------

Хорошо, у меня NSTimer работает правильно, и следующим моим шагом было остановить повторение анимации снова и снова, поэтому я отключил свой таймер следующим образом:

[animationTimer invalidate];

И теперь, когда таймер вызывается снова, он не работает, так как мне проверить его снова? (создайте его повторно, я думаю)

(Кстати, я создал еще один вопрос SO для этого)

Мой код на данный момент:

- (IBAction)startClick:(id)sender{

animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick) userInfo:nil repeats:YES];

} - (void) галочка {[self animatePig]; } - (void) animatePig {

UIImage *pigImage1=[UIImage imageNamed:@"gordonapple0004.png"];
UIImage *pigImage2=[UIImage imageNamed:@"gordonapple0005.png"];
UIImage *pigImage3=[UIImage imageNamed:@"gordonapple0006.png"];
UIImage *pigImage4=[UIImage imageNamed:@"gordonapple0007.png"];
UIImage *pigImage5=[UIImage imageNamed:@"gordonapple0008.png"];
UIImage *pigImage6=[UIImage imageNamed:@"gordonapple0009.png"];
UIImage *pigImage7=[UIImage imageNamed:@"gordonapple0010.png"];
UIImage *pigImage8=[UIImage imageNamed:@"gordonapple0011.png"];
UIImage *pigImage9=[UIImage imageNamed:@"gordonapple0012.png"];
UIImage *pigImage10=[UIImage imageNamed:@"gordonapple0013.png"];
UIImage *pigImage11=[UIImage imageNamed:@"gordonapple0014.png"];
UIImage *pigImage12=[UIImage imageNamed:@"gordonapple0015.png"];
UIImage *pigImage13=[UIImage imageNamed:@"gordonapple0016.png"];


if(gordon.image == pigImage1)
    gordon.image = pigImage2;
else if(gordon.image == pigImage2)
    gordon.image = pigImage3;
else if(gordon.image == pigImage3)
    gordon.image = pigImage4;
else if(gordon.image == pigImage4)
    gordon.image = pigImage5;
else if(gordon.image == pigImage5)
    gordon.image = pigImage6;
else if(gordon.image == pigImage6)
    gordon.image = pigImage7;
else if(gordon.image == pigImage7)
    gordon.image = pigImage8;
else if(gordon.image == pigImage8)
    gordon.image = pigImage9;
else if(gordon.image == pigImage9)
    gordon.image = pigImage10;
else if(gordon.image == pigImage10)
    gordon.image = pigImage11;
else if(gordon.image == pigImage11)
    [animationTimer invalidate];

else
    gordon.image = pigImage1;

}


person Community    schedule 15.06.2009    source источник


Ответы (3)


Вы идете по твердому пути.

  • Создайте UIImageView и поместите его на экран.
  • Загрузите свои изображения в NSArray.
  • Установите свойство animationImages UIImageView в массив.
  • Вы также можете настроить свойства animationDuration и animationRepeatCount.
  • Когда пользователь нажимает кнопку запуска, вызовите метод startAnimating просмотра изображения.

Вам не нужны ни таймер, ни код ручного перехода между кадрами.

person Ramin    schedule 15.06.2009
comment
Хм, я вижу, что ж, я настроил его сейчас таким образом, чтобы он работал, однако мне нужен мой таймер только для однократной анимации моих изображений, без его повторения снова и снова, поэтому я аннулировал свой таймер, но у меня возникли проблемы с его повторным созданием, есть идеи, как это сделать? - person ; 15.06.2009
comment
После аннулирования таймер исчезает. Выбросьте его и начните новый. Убедитесь, что он правильно выпущен, если он сохранен как переменная экземпляра. - person Ramin; 18.06.2009

Нет хорошего способа узнать, не увидев от вас еще кода. Как вы храните «гордон»? Что это за тип? предположительно какой-то тип UIImageView?

Однако ваша настоящая проблема (если я могу перейти на более высокий уровень) - это вся ваша структура. Попробуйте что-нибудь еще вроде этого:

// Интерфейсный файл

NSMutableArray *pigImages;
int pigImageIndex;

// Файл реализации

const int firstImageIndex = 4;
const int lastImageIndex = 15;
const int imageCount = (lastImageIndex + 1 - firstImageIndex);

- (void) initPigImages
{
    pigImages = [[NSMutableArray alloc] initWithCapacity: imageCount];
    for (int i = firstImageIndex; i <= lastImageIndex; ++i)
    {
        [pigImages addObject: [self makePigImageWithIndex: i]];
    }
    pigImageIndex = 0;
}

- (UIImage*) makePigImageWithIndex: (int) imageIndex
{
    NSString *imageName = [NSString stringWithFormat: @"gordonapple%4d.png", imageIndex]; // Formatting may be a little off.
    return [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: imageName ofType: nil]]];
}

- (void )animatePig
{
    if (pigImageIndex < imageCount)
    {
        gordon.image = pigImages[pigImageIndex++];
    }
}
person Amagrammer    schedule 15.06.2009
comment
Да, gordon - это UIImageView, и его можно перемещать с помощью touchMoved. - person ; 15.06.2009

Чтобы перезапустить таймер, вы можете использовать -[NSRunLoop addTimer:forMode:] или просто отпускать и каждый раз создавать новый таймер.

person Daniel Dickison    schedule 16.06.2009