image

实现过程:


 

#import "AnimView.h" 
@implementation AnimView

 

- (id)initWithFrame:(CGRect)frame { 
    
    self = [super initWithFrame:frame]; 
    if (self) { 
        [self setBackgroundColor:[UIColor clearColor]]; 
        UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchesPoint:)]; 
        [self addGestureRecognizer:tapGesture]; 
        [tapGesture release]; 
    } 
    return self; 

-(void) drawRect:(CGRect)rect 

    [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(stratAnim:) userInfo:nil repeats: NO]; 

-(void)stratAnim:(id)sender 

    //添加层 
    layer2 = [CALayer layer]; 
    [layer2 setBackgroundColor:[[UIColor redColor] CGColor]]; 
    layer2.bounds = CGRectMake(0, 0, 60,40);//层设置为图片大小 
    layer2.position = CGPointMake(25,25);//层在view的位置 
    [self.layer addSublayer:layer2];//将层加到当前View的默认layer下 
    
    [self startFlyStarAnimation]; 

-(void) startFlyStarAnimation 
{    
    //运动轨迹 
    CGMutablePathRef thePath=CGPathCreateMutable(); 
    CGPathMoveToPoint(thePath,NULL,self.center.x,self.center.y); 
    CGPathAddLineToPoint(thePath, NULL, self.center.x, self.center.y-45); 
    CGPathAddLineToPoint(thePath, NULL, self.center.x, self.center.y+45); 
    CGPathAddLineToPoint(thePath, NULL, self.center.x, self.center.y); 
    
    //添加动画 
    CAKeyframeAnimation * animation; 
    animation=[CAKeyframeAnimation animationWithKeyPath:@"position"]; 
    animation.path=thePath; 
    animation.duration=3.0; 
    animation.repeatCount=2; 
    CFRelease(thePath); 
    [animation setDelegate:self]; 
    //[self animationDidStop:animation finished:YES]; 
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]]; 
    [layer2 addAnimation:animation forKey:kCATransition]; 

//动画停止 
-(void) animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 

    NSLog(@">>>>动画停止了"); 

//touch事件 
-(void)touchesPoint:(UITapGestureRecognizer *)gestureRecognizer 

    CGPoint locationInView = [gestureRecognizer locationInView:self]; 
    //presentationLayer layer的动画层 
   CALayer *layer1=[[layer2 presentationLayer] hitTest:locationInView]; 
    if (layer1!=nil) { 
        NSLog(@"点击了运动的layer"); 
    } 

- (void)dealloc { 
    [super dealloc]; 

@end

 

其中presentationLayer是CALayer动画的位置层。

源代码:http://easymorse-iphone.googlecode.com/svn/trunk/iphone.presentlayer/