How do you create a wiggle animation similar to iphone deletion animation

前端 未结 8 2315
-上瘾入骨i
-上瘾入骨i 2020-12-12 16:57

We are currently developing an application that contains a series of icons. We want the icons to wiggle like the app deletion animations when pressed. What would be the be

8条回答
  •  -上瘾入骨i
    2020-12-12 17:30

    Looking at the iOS implementation a bit closer, there are two things that make theirs a bit more realistic than the code mentioned here:

    • The icons appear to have a bounce as well as a rotation
    • Every icon has its own timing -- they are not all synchronized

    I based myself on the answers here (and with some help from this answer) to add the rotation, the bounce and a bit of randomness to the duration of each animation.

    #define kWiggleBounceY 4.0f
    #define kWiggleBounceDuration 0.12
    #define kWiggleBounceDurationVariance 0.025
    
    #define kWiggleRotateAngle 0.06f
    #define kWiggleRotateDuration 0.1
    #define kWiggleRotateDurationVariance 0.025
    
    -(void)startWiggling {
        [UIView animateWithDuration:0
                         animations:^{
                             [self.layer addAnimation:[self rotationAnimation] forKey:@"rotation"];
                             [self.layer addAnimation:[self bounceAnimation] forKey:@"bounce"];
                             self.transform = CGAffineTransformIdentity;
                         }];
    }
    
    -(CAAnimation*)rotationAnimation {
        CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
        animation.values = @[@(-kWiggleRotateAngle), @(kWiggleRotateAngle)];
    
        animation.autoreverses = YES;
        animation.duration = [self randomizeInterval:kWiggleRotateDuration
                                        withVariance:kWiggleRotateDurationVariance];
        animation.repeatCount = HUGE_VALF;
    
        return animation;
    }
    
    -(CAAnimation*)bounceAnimation {
        CAKeyframeAnimation* animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.y"];
        animation.values = @[@(kWiggleBounceY), @(0.0)];
    
        animation.autoreverses = YES;
        animation.duration = [self randomizeInterval:kWiggleBounceDuration
                                        withVariance:kWiggleBounceDurationVariance];
        animation.repeatCount = HUGE_VALF;
    
        return animation;
    }
    
    -(NSTimeInterval)randomizeInterval:(NSTimeInterval)interval withVariance:(double)variance {
        double random = (arc4random_uniform(1000) - 500.0) / 500.0;
        return interval + variance * random;
    }
    

    I implemented this code on a UICollectionView which had 30 items bouncing and the performance was flawless on an iPad 2.

提交回复
热议问题