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];
}