3

この SO の質問に基づいて、円形パスで他の CALayers を通常アニメーション化する方法を理解しています: iPhone - CAKeyframeAnimation の円パスを作成する方法は?

ただし、GMSMarkerLayer は、「位置」キーパスに応答しないように見える CALayers の特別なサブクラスです (そのリンクの指示に従っても、目に見えることは何もありません)、代わりに「緯度」および「経度」キーパスに応答します。代わりは。

私が試したコードは次のとおりです。

CAKeyframeAnimation *circlePathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGMutablePathRef circularPath = CGPathCreateMutable();
CGRect pathRect = CGRectMake(marker.position.latitude, marker.position.longitude, 0.001, 0.001);
CGPathAddEllipseInRect(circularPath, NULL, pathRect);
circlePathAnimation.path = circularPath;
circlePathAnimation.duration = 1.0f;
circlePathAnimation.repeatCount = HUGE_VALF;

[marker.layer addAnimation:circlePathAnimation forKey:[NSString stringWithFormat:@"circular-%@", marker.description]];
CGPathRelease(circularPath);

キーフレーム アニメーションは「位置」キーパスを使用するため、それを 2 つの個別のキーパス (緯度と経度) に変換して、マップ上の円でマーカーをアニメーション化するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

1 に答える 1

4

現在、アニメーションに「位置」キーパスを使用できないため、「緯度」と「経度」キーパスを別々に使用してアニメーション化することになりました。

最初にポイントを計算し、それらを緯度値 (y) 用と経度 (x) 用の 2 つの個別の配列に追加してから、CAKeyFrameAnimation の値プロパティを使用してアニメーション化します。2 つの CAKeyFrameAnimation オブジェクト (軸ごとに 1 つ) を作成し、CAAnimationGroup を使用してそれらをグループ化し、一緒にアニメーション化して円を形成します。

私の方程式では、楕円形のパスも生成できるように、各軸の半径の長さを変えています。

    NSMutableArray *latitudes = [NSMutableArray arrayWithCapacity:21];
    NSMutableArray *longitudes = [NSMutableArray arrayWithCapacity:21];
    for (int i = 0; i <= 20; i++) {
        CGFloat radians = (float)i * ((2.0f * M_PI) / 20.0f);

        // Calculate the x,y coordinate using the angle
        CGFloat x = hDist * cosf(radians);
        CGFloat y = vDist * sinf(radians);

        // Calculate the real lat and lon using the
        // current lat and lon as center points.
        y = marker.position.latitude + y;
        x = marker.position.longitude + x;


        [longitudes addObject:[NSNumber numberWithFloat:x]];
        [latitudes addObject:[NSNumber numberWithFloat:y]];
    }

    CAKeyframeAnimation *horizontalAnimation = [CAKeyframeAnimation animationWithKeyPath:@"longitude"];
    horizontalAnimation.values = longitudes;
    horizontalAnimation.duration = duration;

    CAKeyframeAnimation *verticleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"latitude"];
    verticleAnimation.values = latitudes;
    verticleAnimation.duration = duration;

    CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
    group.animations = @[horizontalAnimation, verticleAnimation];
    group.duration = duration;
    group.repeatCount = HUGE_VALF;
    [marker.layer addAnimation:group forKey:[NSString stringWithFormat:@"circular-%@",marker.description]];
于 2013-10-11T10:57:15.770 に答える