/** * brief 弹跳动画 * * @param view 执行弹跳动画的view * @param height 弹跳的高度 * @param duration 弹跳的时间 */ - (void)bounceWithView:(UIView *)view height:(CGFloat)height duration:(CFTimeInterval)duration; { CGPoint center = CGPointMake(view.frame.origin.x + view.frame.size.width * 0.5f, view.frame.origin.y + view.frame.size.height*0.5f); /*创建一个关键帧动画对象,key值为layer的position属性*/ CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; /*创建一个可变数组,用于存储每帧执行后position的位置*/ NSMutableArray *valuesArray = [[NSMutableArray alloc] init]; /*第一帧的位置*/ [valuesArray addObject:[NSValue valueWithCGPoint:center]]; [valuesArray addObject:[NSValue valueWithCGPoint:CGPointMake(center.x, center.y+height)]]; [valuesArray addObject:[NSValue valueWithCGPoint:center]]; /*创建一个数组,用于存储每一帧的时间点*/ NSArray *timesArray = @[@(0), @(0.4),@(1)]; /*再创建一个数组,用于保存每一帧的动画曲线*/ NSArray *timingFunctions = @[[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut], [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; /*设置关键帧的值*/ animation.values = valuesArray; /*设置关键帧时间点的值*/ animation.keyTimes = timesArray; /*设置动画曲线*/ animation.timingFunctions = timingFunctions; /*设置动画时间*/ animation.duration = duration; /*设置代理*/ animation.delegate = self; /*设置动画完成后是否自动移除,默认是YES,此处改为NO,否则在animationDidStop里就找不到这个动画了*/ animation.removedOnCompletion = NO; /*重复执行*/ animation.repeatCount = HUGE_VAL; /*将动画添加近_menuView.layer中*/ [view.layer addAnimation:animation forKey:@"menuAnimation"]; }