2011-09-05 99 views
0

Im循環漸變動畫。當用戶觸摸它時,屏幕會發出紅光。我有它循環使用動畫委託方法來刪除圖層,然後在每個週期結束時調用動畫。這工作正常。重新啓動CABasicAnimation

我想實現的是如果用戶再次觸摸屏幕,動畫將被刪除並重新啓動。它目前進入快速反饋循環。

#import "AGradient.h" 
#import <QuartzCore/CoreAnimation.h> 


@implementation AGradient 
@synthesize loopStat,animDuration,resetLoop; 

-(void)animateGradient 
{ 
    layer = [CAGradientLayer layer]; 
    layer.frame = self.bounds; 

    color = [UIColor blackColor].CGColor; 
    UIColor *color1 = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0]; 
    UIColor *color2 = [UIColor colorWithRed:0.80 green:0.0 blue:0.00 alpha:1.0]; 
    UIColor *color3 = [UIColor colorWithRed:0.40 green:0.0 blue:0.0 alpha:1.0]; 
    NSArray *colors = [NSArray arrayWithObjects:(id)[color1 CGColor],[color2 CGColor],[color3 CGColor],nil]; 

    layer.colors = [NSArray arrayWithObjects:(id)color,color,color, nil]; 
    layer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],[NSNumber numberWithFloat:0.4],[NSNumber numberWithFloat:0.9], nil]; 
    layer.startPoint = CGPointMake(0.5, 0); 
    layer.endPoint = CGPointMake(0, 1); 

    CABasicAnimation *animateLayer = [CABasicAnimation animationWithKeyPath:@"colors"]; 
    animateLayer.delegate = self; 
    animateLayer.fromValue = colors; 
    animateLayer.toValue = [NSArray arrayWithObjects:(id)color,color,color, nil]; 
    animateLayer.duration = animDuration; 
    animateLayer.removedOnCompletion = YES; 
    animateLayer.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 

    [layer addAnimation:animateLayer forKey:@"animation"]; 
    [self.layer insertSublayer:layer atIndex:0]; 
} 




- (void)animationDidStart:(CAAnimation *)theAnimation { 
} 

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
{ 
    if (loopStat) { 
    if (self.layer == nil) { 
      NSLog(@"do nothing"); 

    } else 
    { 
     [layer removeAllAnimations]; 
     [layer removeFromSuperlayer]; 
     layer = nil; 
     NSLog(@"remove layers"); 
    } 
    NSLog(@"animate layers"); 
    [self animateGradient]; 
} 

而且在視圖 - 控制

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    tmpGrad = [[[AGradient alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width,self.view.frame.size.height)]retain]; 
    [self.view addSubview:tmpGrad]; 

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapScreen:)]; 
    [singleTap setNumberOfTapsRequired:1]; 
    [self.view addGestureRecognizer:singleTap]; 
    [singleTap release]; 
} 


- (void)tapScreen:(UIGestureRecognizer *)gestureRecognizer { 
    tmpGrad.loopStat = 1; 
    tmpGrad.animDuration = 2; 
    [tmpGrad animateGradient]; 
} 

回答

0

我不知道,但是當用戶觸摸屏幕再次,如果你想刪除的動畫以下行應該不會執行。

tmpGrad.loopStat = 1;

tmpGrad.animDuration = 2; 

[tmpGrad animateGradient]; 

相反運行一些代碼,刪除層,然後將其釋放。