web-dev-qa-db-ja.com

車(注釈)アニメーション(uberアプリなど)が機能しない

マップ上で車を移動するための1つのデモプロジェクト(Moving-githubのMKAnnotationViewデモから)を作成しました。そのリンクは次のとおりです。

https://github.com/pratikbhiyani/Moving-MKAnnotationView

私はvinautによる与えられた答えに基づいてコードを編集しますが、それでも問題は、マップをズームまたはスクロールすると、iOS7およびiOS6でマップをズームまたはスクロールすると気が散ることです。しばらくの間、注釈が元の角度に設定されました。

以下は私のデモプロジェクトのスクリーンショットです

enter image description here

これが私が変更するいくつかのコードです

- (void) setPosition : (id) posValue;
{
    NSLog(@"set position");

    //extract the mapPoint from this dummy (wrapper) CGPoint struct
    MKMapPoint mapPoint = *(MKMapPoint*)[(NSValue*)posValue pointerValue];

    CLLocationCoordinate2D coord = MKCoordinateForMapPoint(mapPoint);
    CGPoint toPos;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

        toPos = [self.mapView convertCoordinate:coord toPointToView:self.mapView];
    }
    else
    {
        CGFloat zoomFactor =  self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
        toPos.x = mapPoint.x/zoomFactor;
        toPos.y = mapPoint.y/zoomFactor;
    }



    [self setTransform:CGAffineTransformMakeRotation([self getHeadingForDirectionFromCoordinate:MKCoordinateForMapPoint(previousPoint) toCoordinate: MKCoordinateForMapPoint(mapPoint)])];

    if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {

        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];

        animation.fromValue = [NSValue valueWithCGPoint:self.center];
        animation.toValue = [NSValue valueWithCGPoint:toPos];
        animation.duration = 1.0;
        animation.delegate = self;
        animation.fillMode = kCAFillModeForwards;
        //[self.layer removeAllAnimations];
        [self.layer addAnimation:animation forKey:POSITIONKEY];

        //NSLog(@"setPosition ANIMATED %x from (%f, %f) to (%f, %f)", self, self.center.x, self.center.y, toPos.x, toPos.y);
    }

    self.center = toPos;

    previousPoint = mapPoint;
}

私の目標はuberアプリと同じように車を動かすことです。

25
pratik bhiyani

CLCoordinate2D/MKMapPoint/CGPointの変換関数で何かが変わったようです...

iOS7(CGPathContainsPoint)で壊れたMKPolygon内のポイントの検出

MkMapPointsとCGIPointsの間の変換が機能しなくなったため、注釈が消えます。CALayerの「位置」をログに記録すると、ビューの外側にポイントが表示されます。タッチイベントを行うときになぜそれが機能するのかわかりません。

関数を次のように変更した場合:

    - (void) setPosition : (id) posValue; 
{
    //extract the mapPoint from this dummy (wrapper) CGPoint struct
    MKMapPoint mapPoint = *(MKMapPoint*)[(NSValue*)posValue pointerValue];  
    CLLocationCoordinate2D coord = MKCoordinateForMapPoint(mapPoint);

    CGPoint toPos = [self.mapView convertCoordinate:coord toPointToView:self.mapView];


    if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {

        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];

        animation.fromValue = [NSValue valueWithCGPoint:self.center];
        animation.toValue = [NSValue valueWithCGPoint:toPos];   
        animation.duration = 0.8;
        animation.delegate = self;
        animation.fillMode = kCAFillModeForwards;
        //[self.layer removeAllAnimations];
        [self.layer addAnimation:animation forKey:POSITIONKEY];

        //NSLog(@"setPosition ANIMATED %x from (%f, %f) to (%f, %f)", self, self.center.x, self.center.y, toPos.x, toPos.y);
    }   

    self.center = toPos;


}

再び機能するはずです。

14
vinaut

私はMoving-MKAnnotationView( https://github.com/100grams/Moving-MKAnnotationView.git )の最初の寄稿者です。このコンポーネントは元々iOS4.3を使用して作成されており、その後多くの変更が加えられています。 :-)

ここでの根本的な原因は、MKMapPointからCGPoint(画面座標)への変換でした。コードは以前は機能していましたが、iOS7で壊れ、これを使用して緯度/経度座標を画面座標に変換することで修正しました。

convertCoordinate:toPointToView:

この修正を他のいくつかの更新とともに https://github.com/100grams/Moving-MKAnnotationView.git にコミットしたので、iOS7/Xcode5で動作するようになりました。

14
100grams

地図をズーム/スクロールしているときに車の気を散らす問題。実際には、注釈にアニメーションを追加することによってそれを達成することはできません。 補間関数 「From」座標と「To」座標の間の位置を取得して注釈に設定(ミリ秒単位で注釈座標を設定)すると、アニメーションのように見えることがわかりました。

IOSやマップの問題ではありません。アニメーションを注釈に追加する場合、マップポイントに関係なく注釈レイヤーに追加されます。

1
user1624741