1 - (void)viewDidLoad { 2 3 [super viewDidLoad]; 4 5 // Do any additional setup after loading the view, typically from a nib. 6 7 UIView *view =[[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; 8 9 view.backgroundColor =[UIColor redColor]; 10 11 [self.view addSubview:view]; 12 13 [self heartbeatView:view duration:100]; 14 15 } 16 17 18 19 -(void)heartbeatView:(UIView *)view duration:(CGFloat)fDuration 20 21 { 22 23 [[self class] heartbeatView:view duration:fDuration maxSize:1.4f durationPerBeat:0.5f]; 24 25 } 26 27 +(void)heartbeatView:(UIView *)view duration:(CGFloat)fDuration maxSize:(CGFloat)fMaxSize durationPerBeat:(CGFloat)fDurationPerBeat 28 29 { 30 31 if (view && (fDurationPerBeat > 0.1f)) 32 33 { 34 35 CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 36 37 38 39 CATransform3D scale1 = CATransform3DMakeScale(0.8, 0.8, 1); 40 41 CATransform3D scale2 = CATransform3DMakeScale(fMaxSize, fMaxSize, 1); 42 43 CATransform3D scale3 = CATransform3DMakeScale(fMaxSize - 0.3f, fMaxSize - 0.3f, 1); 44 45 CATransform3D scale4 = CATransform3DMakeScale(1.0, 1.0, 1); 46 47 48 49 NSArray *frameValues = [NSArray arrayWithObjects: 50 51 [NSValue valueWithCATransform3D:scale1], 52 53 [NSValue valueWithCATransform3D:scale2], 54 55 [NSValue valueWithCATransform3D:scale3], 56 57 [NSValue valueWithCATransform3D:scale4], 58 59 nil]; 60 61 62 63 [animation setValues:frameValues]; 64 65 66 67 NSArray *frameTimes = [NSArray arrayWithObjects: 68 69 [NSNumber numberWithFloat:0.05], 70 71 [NSNumber numberWithFloat:0.2], 72 73 [NSNumber numberWithFloat:0.6], 74 75 [NSNumber numberWithFloat:1.0], 76 77 nil]; 78 79 [animation setKeyTimes:frameTimes]; 80 81 82 83 animation.fillMode = kCAFillModeForwards; 84 85 animation.duration = fDurationPerBeat; 86 87 animation.repeatCount = fDuration/fDurationPerBeat; 88 89 90 91 [view.layer addAnimation:animation forKey:@"heartbeatView"]; 92 93 }else{} 94 95 }