如何为 UIImageview 添加弹跳动画?

How to add bouncing animation for UIImageview?

动画对我来说不熟悉,但现在我想学习它。所以我用谷歌搜索并得到 spring 和 CAanimation,重力,碰撞之类的。

我尝试了什么:

-(void)longpress:(UILongPressGestureRecognizer *)longg
{


    UIGestureRecognizerState state =[longg state];
    if(state ==UIGestureRecognizerStateBegan ||state ==UIGestureRecognizerStateChanged)
    {
        int temptag=[longg.view tag];
        UIImageView *views=(UIImageView *)arrimgstore[temptag];
                NSLog(@"got it to super view %@",views);
        [UIImageView animateWithDuration:0.1 delay:1 usingSpringWithDamping:2 initialSpringVelocity:2 options:UIViewAnimationOptionLayoutSubviews animations:^{

            [_imgfull bringSubviewToFront:views];
        } completion:nil];
    }
}

当 bringsubviewtoFront 动作发生时,我想添加一些有吸引力的动画。

上面的代码有些错误,请帮助我实现这个:) 谢谢。

对于简单的弹跳动画,可以使用CAKeyFrameAnimation:

CAMediaTimingFunction *linearTiming = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
CAMediaTimingFunction *easeOutTiming = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

CAKeyframeAnimation *fbTranslationYAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"];
fbTranslationYAnimation.duration = 0.700;
fbTranslationYAnimation.values = @[@(0.000), @(-35.000), @(-55.000), @(-45.000), @(-35.000), @(-39.000), @(-43.000), @(-39.000), @(-35.000), @(-37.000), @(-35.000)];
fbTranslationYAnimation.keyTimes = @[@(0.000), @(0.143), @(0.286), @(0.429), @(0.571), @(0.643), @(0.714), @(0.786), @(0.857), @(0.929), @(1.000)];
fbTranslationYAnimation.timingFunctions = @[easeOutTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming, linearTiming];
fbTranslationYAnimation.beginTime = CACurrentMediaTime()+delay;
fbTranslationYAnimation.fillMode = kCAFillModeBoth;
fbTranslationYAnimation.removedOnCompletion = removedOnCompletion;
[[self.imgView layer] addAnimation:fbTranslationYAnimation forKey:@"BounceAnimation_TranslationY"];

这给出了效果:

有关 CoreAnimation 时序的更多信息,请阅读 this

如果你想使用 UIKitDynamics 来做,你可以避免这么多代码。你可以这样做:

   - (void)viewDidLoad
{
    [super viewDidLoad];

    // Initialize the animator.
    self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
}

然后给imageview添加重力(下落),碰撞(当它接触到其他视图时做出反应),弹性(反弹):

 UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[self.imgView]];

[self.animator addBehavior:gravityBehavior];

UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.imgView]];

[collisionBehavior addBoundaryWithIdentifier:@"tabbar"
                                   fromPoint:self.tabBarController.tabBar.frame.origin
                                     toPoint:CGPointMake(self.tabBarController.tabBar.frame.origin.x + self.tabBarController.tabBar.frame.size.width, self.tabBarController.tabBar.frame.origin.y)];

[self.animator addBehavior:collisionBehavior];

UIDynamicItemBehavior *bounceBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[self.imgView]];
    bounceBehavior.elasticity = 0.75;
[self.animator addBehavior:bounceBehavior];