0

コア アニメーション (CAKeyframeAnimation) を使用して、指定されたパスを使用してビューを移動し、同時にパス (点線) を表示します。指定されたパスに沿ってビューをアニメーション化しながら、ビューが向かう方向に向くようにします。つまり、移動中にビューを徐々に回転させたいのです。

いくつかの調査の後、キータイムと値を使用して CAKeyFrameAnimation で実行できる可能性があることがわかりましたが、成功しませんでした。実装方法がわかりません。

私はまだIOSプログラミングに慣れていないので、そのようなアニメーションを行う別の(より良い?)方法があるかどうかはわかりません。

ここに私が使用するコードがあります:

- (CGMutablePathRef) getPathFromPoints:(NSMutableArray*)points {
        CGMutablePathRef path = CGPathCreateMutable();
        CGPoint p = [points[0] CGPointValue];
        CGPathMoveToPoint(path, NULL, p.x, p.y);
        for (int i = 1; i < points.count; ++i) {
            p = [points[i] CGPointValue];
            CGPathAddLineToPoint(path, NULL, p.x, p.y);
        }
        return path;
    }

    - (void)animateView:(UIView*)view
             withPoints:(NSMutableArray*)points
           withFillMode:(NSString*)fillMode
           withDuration:(int)duration
        withRepeatCount:(int)repeat
              withSpeed:(int)speed
             withDashed:(BOOL)dashed{

        CGMutablePathRef path = [self getPathFromPoints:points];

        if (dashed) {
            CAShapeLayer* pathLayer = [CAShapeLayer layer];
            pathLayer.frame = view.superview.layer.bounds;
            pathLayer.bounds = view.superview.layer.bounds;
            pathLayer.geometryFlipped = NO;
            pathLayer.path = path;
            pathLayer.strokeColor = [[UIColor blackColor] CGColor];
            pathLayer.fillColor = nil;
            pathLayer.lineWidth = 10.0f;
            pathLayer.lineJoin = kCALineJoinBevel;
            [pathLayer setLineDashPattern:[[NSArray alloc] initWithObjects:
                                           [NSNumber numberWithInt:15],
                                           [NSNumber numberWithInt:15],
                                           nil]];
            [view.superview.layer addSublayer:pathLayer];

            CABasicAnimation *dottedAnimation = [CABasicAnimation     animationWithKeyPath:@"strokeEnd"];
            dottedAnimation.duration = duration;
            dottedAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
            dottedAnimation.toValue = [NSNumber numberWithFloat:1.0f];
            [pathLayer addAnimation:dottedAnimation forKey:@"strokeEnd"];

            [view.superview bringSubviewToFront:view];
        }

        CAKeyframeAnimation* pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
        pathAnimation.calculationMode = kCAAnimationPaced;
        pathAnimation.fillMode = fillMode;
        pathAnimation.duration =  duration;
        pathAnimation.repeatCount = repeat;
        pathAnimation.speed = speed;
        pathAnimation.path = path;
        [view.layer addAnimation:pathAnimation forKey:_myAnimationKey];
        CGPoint p = [[points lastObject] CGPointValue];
        view.layer.position = CGPointMake(p.x, p.y);
    }

よろしくお願いします。

4

1 に答える 1

0

CAKeyframeAnimation の rotationMode プロパティを見てください。それはあなたが望んでいることを正確に達成するはずです。

*pathAnimation CAKeyframeAnimation インスタンスのプロパティが設定されている -animateView: メソッドに次の行を追加します。

pathAnimation.rotationMode = kCAAnimationRotateAuto;

別の設定値 kCAAnimationRotateAutoReverse もあります。これにより、アニメートされたオブジェクトがパス接線に対して反平行の向きを維持できるようになります。

Apple ドキュメントへのリンク: CAKeyframeAnimation

于 2014-03-20T17:02:32.243 に答える