5

このコードを作成して CAKeyframeAnimation を作成しましたが、結果はまったく跳ねません

-(CAKeyframeAnimation *)keyframeBounceAnimationFrom:(NSValue *)from
                                                    to:(NSValue *)to
                                         forKeypath:(NSString *)keyPath
                                       withDuration:(CFTimeInterval)duration
{

    CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:keyPath];

    NSMutableArray * valuesArray = [NSMutableArray array];
    NSMutableArray * timeKeyArray = [NSMutableArray array];

    [self createBounceFrom:from to:to Values:valuesArray keyTimes:timeKeyArray];

    [animation setValues:valuesArray];
    [animation setKeyTimes:timeKeyArray];

    animation.duration = duration;
    return animation;
}

-(void)createBounceFrom:(NSValue *)from to:(NSValue *)to Values:(NSMutableArray *)values keyTimes:(NSMutableArray *)keyTimes
{

    CGPoint toPoint= [to CGPointValue];
    CGFloat offset = 60;
    CGFloat duration = 1.0f;
    NSUInteger numberOfOscillations= 4;


    [values addObject:from];
    [keyTimes addObject:[NSNumber numberWithFloat:0.0f]];
    //============
    //ideally bouncing will depend from starting position to end poisiton as simulating real Dumping Oscillations
    //============

    for (NSUInteger index= 0; index <numberOfOscillations ; index++)
    {


        CGPoint viaPoint = CGPointMake(toPoint.x,  toPoint.y + offset);
        NSValue * via = [NSValue valueWithCGPoint:viaPoint];
        [values addObject:via];
        //add time consumed for each oscillation
        [keyTimes addObject:[NSNumber numberWithFloat:duration]];
       // duration = duration - 0.1;

        offset = - offset ;
    }

    [values addObject:to];
    [keyTimes addObject:[NSNumber numberWithFloat:0.6]];

}
4

1 に答える 1

3

これを使用する方法のいくつかの例を含む素晴らしいリンクを次に示します。

(さらに調べた後、これを見つけました:http://www.cocoanetics.com/2012/06/lets-bounce/これは、はるかに優れたバウンスを実現すると思いますが、より高度です。したがって、ここにコードを配置しません)

http://www.touchwonders.com/some-techniques-for-bounce-animations-in-ios/

CAKeyframeAnimation の例は次のようになります: (リンクから取得)

-(void)animateGreenBall
{
    NSValue *from = @(greenBall.layer.position.y);
    CGFloat bounceDistance = 20.0;
    CGFloat direction = (greenUp? 1 : -1);

    NSValue *via = @((greenUp ? HEIGHT_DOWN : HEIGHT_UP) + direction*bounceDistance);
    NSValue *to = greenUp ? @(HEIGHT_DOWN) : @(HEIGHT_UP);
    NSString *keyPath = @"position.y";
    CAKeyframeAnimation *animation = [self keyframeBounceAnimationFrom:from
                                                                   via:via
                                                                    to:to
                                                            forKeyPath:keyPath
                                                          withDuration:.6];

    [greenBall.layer addAnimation:animation forKey:@"bounce"];
    [greenBall.layer setValue:to forKeyPath:keypath];
    greenUp = !greenUp;
}

-(CAKeyframeAnimation *)keyframeBounceAnimationFrom:(NSValue *)from 
                                                via:(NSValue *)via 
                                                 to:(NSValue *)to 
                                         forKeyPath:(NSString *)keyPath 
                                       withDuration:(CFTimeInterval)duration
{
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:keyPath];
    [animation setValues:@[from, via, to, nil]];
    [animation setKeyTimes:@[@(0), @(.7), @(1), nil]];

    animation.duration = duration;
    return animation;
}
于 2013-04-06T14:07:57.830 に答える