NSTimer не работает нормально .. в анимации в iPhone - PullRequest
0 голосов
/ 14 июля 2010

Я новичок в программировании iPhone ... в моем приложении таймер не работает нормально. кто-нибудь может мне помочь, пожалуйста ... Ниже приведен код для анимации нескольких изображений, к которым мы прикасаемся или проводим пальцем .. они падают

Я хочу ограничить касания на несколько секунд с использованием таймера ... Есть ли другой способ сделать это ..? (перед использованием таймера его сбой на устройстве, но работает нормально в симуляторе .. я пытаюсь найти решение для сбоя ..)

//  HomeViewController.m


#import "HomeViewController.h"

@implementation HomeViewController

@synthesize dustImage, myAnimatedView;

@synthesize _isAnimating = isAnimating;

float ver_X, ver_Y;
BOOL rotated;
NSTimer *touchTimer;


- (void)viewDidLoad {

    [super viewDidLoad];
    self.view.frame  = [[UIScreen mainScreen] bounds];
    //[self playAudio];

}

-(void)blowingTheSparkles:(NSSet *) touches {

    if(!isAnimating){
        float a, aa; 
        float b, bb;

        CGRect frame1;
        myAnimatedView = [UIImageView alloc];

        //NSLog(@"touch count...%d",[touches count]);
        for (int i=0; i< (int)[touches count]; ++i) {
            UITouch* touch = [[touches allObjects] objectAtIndex:i];
            CGPoint location = [touch locationInView:dustImage];

            NSArray *myImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"starburst1.png"],
                                 [UIImage imageNamed:@"starburst2.png"], 
                                 [UIImage imageNamed:@"starburst3.png"], 
                                 [UIImage imageNamed:@"starburst4.gif"],
                                 [UIImage imageNamed:@"starburst5.png"],
                                 [UIImage imageNamed:@"starburst6.png"],
                                 [UIImage imageNamed:@"starburst7.png"],nil]; 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
            a=(location.x)-80;
            b=(location.y)-80;
            ver_X=768;
            ver_Y=1024;     

            frame1 = CGRectMake(a,b,160,160);

#else

            a=(location.x)-40;
            b=(location.y)-40;
            ver_X=320;
            ver_Y=480;

            frame1 = CGRectMake(a,b,80,80);

#endif
            aa= location.x;
            bb= location.y;
            [myAnimatedView initWithFrame:frame1]; 
            myAnimatedView.animationImages = myImages; 
            myAnimatedView.animationDuration = 0.25;
            myAnimatedView.animationRepeatCount = 0;

            [dustImage addSubview:myAnimatedView];


            CABasicAnimation *fadeOutAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
            [fadeOutAnimation setToValue:[NSNumber numberWithFloat:0.3]];
            fadeOutAnimation.fillMode = kCAFillModeForwards;
            fadeOutAnimation.removedOnCompletion = NO;

            //Set up scaling
            CABasicAnimation *resizeAnimation = [CABasicAnimation animationWithKeyPath:@"bounds.size"];
            [resizeAnimation setToValue:[NSValue valueWithCGSize:CGSizeMake(0.0f, frame1.size.height * (1.0f /1.0))]];
            resizeAnimation.fillMode = kCAFillModeForwards;
            resizeAnimation.removedOnCompletion = NO;

            // Set up path movement
            CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
            pathAnimation.calculationMode = kCAAnimationPaced;
            pathAnimation.fillMode = kCAFillModeForwards;
            pathAnimation.removedOnCompletion = NO;

            CGPoint endPoint = CGPointMake(aa ,ver_Y);
            CGMutablePathRef curvedPath = CGPathCreateMutable();
            CGPathMoveToPoint(curvedPath, NULL, aa, bb);
            CGPathAddCurveToPoint(curvedPath, NULL, endPoint.x, bb,endPoint.x, bb,endPoint.x,endPoint.y);
            pathAnimation.path = curvedPath;
            CGPathRelease(curvedPath);

            CAAnimationGroup *group = [CAAnimationGroup animation]; 
            group.fillMode = kCAFillModeForwards;
            group.removedOnCompletion = NO;
            [group setAnimations:[NSArray arrayWithObjects:fadeOutAnimation, pathAnimation, resizeAnimation, nil]];
            group.duration = 4.0f;
            group.delegate = self;
            [group setValue:myAnimatedView forKey:@"myAnimatedView"];

            [myAnimatedView.layer addAnimation:group forKey:@"savingAnimation"];
            [myAnimatedView startAnimating];


        }   
    }
}


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(!isAnimating)
        [self blowingTheSparkles:touches];

}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
}


-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    isAnimating=TRUE;
    touchTimer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(sleeping) userInfo:nil repeats:NO];

}

-(void)sleeping{

    NSLog(@"....Hiiii");
    isAnimating = FALSE;
    [touchTimer invalidate];
    touchTimer = nil;

}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

    if(!isAnimating){
        [self blowingTheSparkles:touches];

        }

}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    return NO;
}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];   

}

- (void)viewDidUnload {

    [super viewDidUnload];

}


- (void)dealloc {

    [myAnimatedView release];

    [super dealloc];

}

@end

1 Ответ

2 голосов
/ 16 августа 2010

Вы, похоже, неправильно сохраняете NSTimer, что может быть вашей проблемой здесь.

Измените его на:

touchTimer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(sleeping) userInfo:nil repeats:NO] retain];

В идеале вы должны объявить touchTimer как свойство и синтезировать его, но попробуйте сначала.

Изменить режим сна, чтобы освободить таймер:

-(void)sleeping{

    NSLog(@"....Hiiii");
    isAnimating = FALSE;
    [touchTimer invalidate];
    [touchTimer release];
    touchTimer = nil;
}
...