读书人

兑现图片抛物线的效果

发布时间: 2012-09-05 15:19:34 作者: rapoo

实现图片抛物线的效果

实现图片抛物线的效果


最近做项目,需要实现图片抛物线效果,研究了下,方法有二;

方法一:

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

}

读书人网 >移动开发

热点推荐