实现图片抛物线的效果
实现图片抛物线的效果
最近做项目,需要实现图片抛物线效果,研究了下,方法有二;
方法一:
-(void)isButtonClicked:(id)sender
{
CGRect rect = [self.viewconvertRect:((UIButton *)sender).boundsfromView:sender];
UIImageView *imageView = [[[UIImageViewalloc] initWithFrame:CGRectMake(0,10, 30, 30)]autorelease];
imageView.frame =CGRectMake(rect.origin.x+10, rect.origin.y,30, 30);
[self.viewaddSubview:imageView];
imageView.image = [UIImageimageNamed:@"forward.png"];
CAKeyframeAnimation *bounceAnimation = [CAKeyframeAnimationanimationWithKeyPath:@"position"];
CGMutablePathRef thePath =CGPathCreateMutable();
CGPathMoveToPoint(thePath, NULL, imageView.frame.origin.x, imageView.frame.origin.y);
CGPathAddQuadCurveToPoint(thePath,NULL, 220, 30,230, 440);
bounceAnimation.duration =1.0f;
bounceAnimation.path = thePath;
bounceAnimation.delegate =self;
[bounceAnimationsetValue:imageView forKey:@"image"];
[imageView.layeraddAnimation:bounceAnimation forKey:@"move"];
CGPathRelease(thePath);
imageView.layer.position =CGPointMake(1000,300);
}
方法二:
-(void)TransAnimation:(UIImage *)image
{
#define PI3.14159265
CGRect headImageOrgRect = headImageView.frame;
CGSize size = image.size;
CGFloat midX = headImageView.center.x;
CGFloat midY = headImageView.center.y;
[headImageView setFrame:CGRectMake(0,0, size.width, size.height)];
CALayer *TransLayer = headImageView.layer;
// Create a keyframe animation to follow a path back to the center
CAKeyframeAnimation *animation = [CAKeyframeAnimationanimationWithKeyPath:@"position"];
animation.removedOnCompletion =NO;
CGFloat animationDuration =0.3;
// Create the path for the bounces
CGMutablePathRef thePath =CGPathCreateMutable();
CGFloat originalOffsetX = headImageView.center.x - midX;
CGFloat originalOffsetY = headImageView.center.y - midY;
BOOL stopAnimation =NO;
CGPathMoveToPoint(thePath,NULL, headImageView.center.x, headImageView.center.y);
float xPosition ;
float yPosition ;
float angle =0.0f;
while (stopAnimation !=YES) {
xPosition = headImageView.center.x - originalOffsetX*sin(angle*(PI/180));
yPosition = headImageView.center.y - originalOffsetY*sin(angle*(PI/180));
CGPathAddLineToPoint(thePath,NULL, xPosition, yPosition);
angle = angle +1.0f;
if(angle ==90.0f||angle >90.0f)
stopAnimation =YES;
}
[headImageView setCenter:CGPointMake(midX,midY)];
animation.path = thePath;
CGPathRelease(thePath);
animation.duration = animationDuration;
// Create a basic animation
CABasicAnimation *shrinkAnimation = [CABasicAnimationanimationWithKeyPath:@"bounds"];
shrinkAnimation.removedOnCompletion =YES;
shrinkAnimation.duration = animationDuration;
shrinkAnimation.fromValue = [NSValue valueWithCGRect:headImageView.frame];
shrinkAnimation.byValue = [NSValuevalueWithCATransform3D:CATransform3DIdentity];
shrinkAnimation.toValue = [NSValuevalueWithCGRect:headImageOrgRect];
// Create an animation group to combine the keyframe and basic animations
CAAnimationGroup *theGroup = [CAAnimationGroupanimation];
// Set self as the delegate to allow for a callback to reenable user interaction
theGroup.delegate =self;
theGroup.duration = animationDuration;
theGroup.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn];
theGroup.animations = [NSArrayarrayWithObjects:animation, shrinkAnimation,nil];
// Add the animation group to the layer
[TransLayeraddAnimation:theGroupforKey:@"animatePlacardViewToCenter"];
// Set the view's center and transformation to the original values in preparation for the end of the animation
headImageView.transform = CGAffineTransformIdentity;
[headImageView setFrame:headImageOrgRect];
}