iPhone SDK: после аннулирования таймера, как я могу использовать его снова? - PullRequest
2 голосов
/ 17 июня 2009

Я настроил анимацию в XCode, используя NSTimer, и он продолжал повторяться снова и снова, поэтому я использовал эту команду:

else if(gordon.image == pigImage11)
    [animationTimer invalidate];

Итак, когда для изображения gordon (UIImageView) установлено значение pigImage11, таймер делает недействительным, это дало желаемый эффект остановки постоянно повторяющейся анимации, но остановил использование таймера снова, так как бы я сделал таймер снова доступным Но разве он лишил себя законной силы в этом кадре? Ради дальнейшего пояснения вот мой весь код:

- (IBAction)startClick:(id)sender{
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick) userInfo:nil repeats:YES];
}
- (void)tick{
    [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;
}

- (void)stopTimer
{
    [animationTimer invalidate];
    [animationTimer release];
}

Ответы [ 4 ]

4 голосов
/ 09 марта 2010

Вы можете использовать таймер следующим образом:

- (void) startTimer {
    if ( myTimer == nil ) {
        myTimer = [NSTimer scheduledTimerWithTimeInterval: 5.0f
                   target: self
                   selector: @selector(myTimerAction:)
                   userInfo: nil
                   repeats: NO];
    }
}

- (void) stopTimer {
    if ( myTimer || [myTimer isValid])
    {
        [myTimer invalidate];
        myTimer = nil;
    }
}
0 голосов
/ 17 июня 2009
[[NSRunLoop currentRunLoop] addTimer:animationTimer
                             forMode:NSDefaultRunLoopMode];

Но вы, конечно, не должны отпускать таймер после аннулирования.

0 голосов
/ 17 июня 2009

Почему бы не использовать встроенную анимацию UIImageView:

UIImageView* gordonView = [[UIImage alloc]init];
gordonview.animationImages = [NSArray arrayWithObjects: pigImage1, pigimage2, etc., nil];
gordonView.animationDuration = 0.5f; // about 30fps with your 13 images. 
//Set gordon's frame here
[gordonView startAnimating];

Раскрытие, я набрал это в SO, а не в Xcode. Я уверен, что он не скомпилируется, но, по крайней мере, вы знаете, что искать в SDK.

0 голосов
/ 17 июня 2009

Как насчет того, чтобы не аннулировать таймер и просто установить флаг "не анимировать"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...