2011-10-27 10 views
3

私は2種類の注釈を表示するマップを持っています:場所と場所のクラスタ。クラスタを拡大すると、クラスタが展開され、クラスタ内に含まれる場所が表示されます。これらの場所がマップに追加されると、親クラスターの座標が注釈オブジェクトに格納されます。私がやりたいことは、これらの場所が追加されると、それらの親クラスターの場所から広がるように、アニメーションを持たせることです。ここでのMapViewのための私のコードは次のとおりです。didAddAnnotationViews:緯度/経度の奇妙な座標を画面の位置に合わせる

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views 
{ 
    MKAnnotationView *aV; 
    for (aV in views) 
    { 
     if (([aV.annotation isKindOfClass:[PostLocationAnnotation class]]) && (((PostLocationAnnotation *)aV.annotation).hasParent)) 
     { 
      CLLocationCoordinate2D startCoordinate = ((PostLocationAnnotation *)aV.annotation).parentCoordinate; 

      CGPoint startPoint = [ffMapView convertCoordinate:startCoordinate toPointToView:self.view]; 

      CGRect endFrame = aV.frame; 

      aV.frame = CGRectMake(startPoint.x, startPoint.y, aV.frame.size.width, aV.frame.size.height); 

      [UIView beginAnimations:nil context:NULL]; 
      [UIView setAnimationDuration:1.00]; 
      [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
      [aV setFrame:endFrame]; 
      [UIView commitAnimations]; 

      ((PostLocationAnnotation *)aV.annotation).hasParent = NO; 
     } 
    } 
} 

これは、マップのポイントは、遠景の焦点外のいくつかの場所から飛ぶように思われます。デバッグを行うと、endFrame.originとstartPointの値の間に大きな矛盾があることがわかりました。特定のaVに対して、endFrame.originは(32657,21781)(CGFloats)とstartPoint(159.756256,247.213226 )(やはり両方のCGFloats)。私はendFrame.originが正しい値であると仮定していますが、ポイントは私が望むところに終わっているので、離れたところから来ています。私はコードの他の多くの部分でconvertCoordinate:toPointToView:メソッドを使用しましたが、問題はありませんでした。 startPointのX値とY値にさまざまな値を乗算しようとしましたが、startPointのすべての値に対して単一の係数が保持されません。何が起きているのか?

答えて

2

注釈ビューのフレームは、現在のズームレベルに基づいているように見え、画面の座標からずれているようです。これを補うにはstartPointannotationVisibleRect.originで相殺してください。

また、convertCoordinate:toPointToView:を呼び出すと、ではなくマップビューのフレームに変換する方が安全です。マップビューはコンテナビューとは異なるサイズになる可能性があるためです。

は、以下の変更を試してみてください。

CGPoint startPoint = [ffMapView convertCoordinate:startCoordinate 
            toPointToView:ffMapView]; 
//BTW, using the passed mapView parameter instead of referencing the ivar 
//would make the above line easier to re-use. 

CGRect endFrame = aV.frame; 

aV.frame = CGRectMake(startPoint.x + mapView.annotationVisibleRect.origin.x, 
         startPoint.y + mapView.annotationVisibleRect.origin.y, 
         aV.frame.size.width, 
         aV.frame.size.height); 
+0

それは働きます!ありがとうございました。私はこの一日中立ち往生してきた – benwad

関連する問題