首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTimer在iPhone中无法正常运行..in动画

NSTimer在iPhone中无法正常运行..in动画
EN

Stack Overflow用户
提问于 2010-07-14 06:51:05
回答 1查看 729关注 0票数 0

我是iPhone programming..in的新手,我的应用程序计时器不能正常工作。有没有人能帮帮我...下面的代码用于在我们触摸或swipe..they跌倒时对几个图像进行动画处理

我想用计时器限制几秒钟的接触...(在使用计时器之前,它会在设备上崩溃,但在simulator..im中可以正常工作,试图解决崩溃的问题。)

代码语言:javascript
复制
//  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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-16 21:26:03

您似乎没有正确保留NSTimer,这可能是您的问题所在。

将其更改为:

代码语言:javascript
复制
touchTimer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(sleeping) userInfo:nil repeats:NO] retain];

理想情况下,您应该将touchTimer声明为属性并对其进行合成,但请先尝试此操作。

更改睡眠以释放计时器:

代码语言:javascript
复制
-(void)sleeping{

    NSLog(@"....Hiiii");
    isAnimating = FALSE;
    [touchTimer invalidate];
    [touchTimer release];
    touchTimer = nil;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3242178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档