我刚接触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
答案 0 :(得分:2)
您似乎没有正确地保留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;
}