2011-02-02 25 views
21

MKCapleをMKMapViewにMKOverlayとして追加しました。また、円の半径を決めるUISliderを追加しました。残念なことに、これを使用すると、ちょっと「遅れている」ように見えます。MKOverlayがスムーズにリサイズされない

例: http://dl.dropbox.com/u/3077127/mkoverlayDelay.mov

は、これは私のコードです:

- (void)addCircle 
{ 
    // draw the radius circle for the marker 
    double radius = 2000.0; 
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circle setTitle:@"background"]; 
    [mapView addOverlay:circle]; 

    MKCircle *circleLine = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circleLine setTitle:@"line"]; 
    [mapView addOverlay:circleLine]; 
} 

- (void)addCircleWithRadius:(double)radius 
{ 
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circle setTitle:@"background"]; 
    [mapView addOverlay:circle]; 

    MKCircle *circleLine = [MKCircle circleWithCenterCoordinate:location radius:radius]; 
    [circleLine setTitle:@"line"]; 
    [mapView addOverlay:circleLine]; 
} 

- (void)sliderChanged:(UISlider*)sender 
{ 
    [mapView removeOverlays:[mapView overlays]]; 

    double radius = (sender.value * 100); 

    [self addCircleWithRadius:radius]; 
} 

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay{ 
    MKCircle *circle = overlay; 
    MKCircleView *circleView = [[[MKCircleView alloc] initWithCircle:overlay] autorelease]; 

    if ([circle.title isEqualToString:@"background"]) 
    { 
     circleView.fillColor = UIColorFromRGB(0x598DD3); 
     circleView.alpha = 0.25; 
    } 
    else 
    { 
     circleView.strokeColor = UIColorFromRGB(0x5C8AC7); 
     circleView.lineWidth = 2.0; 
    } 

    return circleView; 
} 

誰が私はこれを滑らかにする方法上の任意の提案を持っていますか?

敬具、
ポールPeelen

+1

+1についてよく書かれた質問です。オーバーレイを削除する必要はありますか?なぜそれを更新するだけではありませんか? –

+0

ありがとう!私は必要はないと思う..しかし、私はどのようにオーバーレイを更新できますか? –

+0

できますか?私はいつもMapKitオーバーレイは不変であると思っていました。あなたが作成したオーバーレイは変更できません。この回答は同じことを示唆しています:http://stackoverflow.com/questions/3171572/how-to-update-mkpolyline-mkpolylineview – lxt

答えて

5

私はあなたのコードを試してみましたし、それがよりスムーズにするために非常に簡単な方法を発見しました。

あなたが呼び出しの順序を変更する場合:- (void)sliderChanged:(UISlider*)sender

あなたはちょうどあなたが追加したばかりのオーバーレイ、唯一の古いものを削除いけない作る[mapView removeOverlays:[mapView overlays]];

を呼び出す前に[self addCircleWithRadius:radius];

を呼び出すことができます。

これにより、新しいサークルが古いものよりも小さい場合に、よりスムーズなサイズ変更が可能になります。

円が大きい場合は、NSOperationsを使用して、ビューがより速く作成されるようにする方がよいでしょう。これにより、円滑になります。

これが役に立ちます。

+0

良いアイデア。私はそれを試してみましょう。 NSOperationsであなたの提案を詳述できますか? –

+0

あなたはアイデアが気に入ってうれしいです。より大きなサークルに関しては、[Breadcrumb](http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html)の例を指摘します。 – Zebs

+2

「NSOperation」チュートリアルを探しています(この記事はhttp://icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/)です。非常に完全で、 'MKCircle'オブジェクトをより速く作成するのに役立ちます。メイン・ループからユーザー・インターフェースを更新できるのは覚えておいてください。 – Zebs

0

MKMapViewの上に別のUIViewを使用するか、マップビュー内でMKAnnotationViewを使用して、自分自身で円を描くことが最良の賭けかもしれません。

このブロガーは、オーバーレイが追加されたiOS4の前に同様のことを行っています。 http://spitzkoff.com/craig/?p=65

+0

地図をドラッグしている間は、UiViewはマップとともに移動しません。 – AlexWien

関連する問題