2011-02-02 5 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

관련 문제