2011-02-02 42 views
21

Tôi đã thêm MKCircle làm MKOverlay vào MKMapView của mình. Ngoài ra tôi đã thêm một UISlider để quyết định bán kính của vòng tròn. Thật không may khi sử dụng này có vẻ như một chút "laggy", không smootly như tôi muốn nó được.MKOverlay không thay đổi kích thước trơn tru

Ví dụ: http://dl.dropbox.com/u/3077127/mkoverlayDelay.mov

Đây là mã của tôi:

- (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; 
} 

Có ai có bất kỳ đề xuất về làm thế nào tôi có thể smoothen này?

Trân trọng,
Paul Peelen

+1

+1 cho câu hỏi được tạo tài liệu đẹp mắt. Có cần phải loại bỏ lớp phủ, tại sao không chỉ cập nhật nó? –

+0

Cảm ơn! Tôi không nghĩ có bất kỳ nhu cầu nào .. nhưng làm thế nào tôi có thể cập nhật lớp phủ? –

+0

Tôi không chắc chắn bạn có thể? Tôi luôn nghĩ rằng các lớp phủ MapKit không thay đổi được, bạn không thể sửa đổi chúng một khi được tạo ra. Câu trả lời này cho thấy tương tự: http://stackoverflow.com/questions/3171572/how-to-update-mkpolyline-mkpolylineview – lxt

Trả lời

5

Tôi đã thử mã của bạn và tìm thấy một cách rất dễ dàng để làm cho nó mượt mà hơn.

Nếu bạn thay đổi thứ tự của các cuộc gọi trong: - (void)sliderChanged:(UISlider*)sender

Bạn có thể gọi [self addCircleWithRadius:radius];

trước khi gọi [mapView removeOverlays:[mapView overlays]];

Chỉ cần chắc chắn rằng bạn không loại bỏ các lớp phủ bạn vừa thêm, chỉ có những cái cũ .

Điều này sẽ giúp bạn thay đổi kích thước mượt mà hơn, đặc biệt khi vòng tròn mới nhỏ hơn hình tròn cũ.

Đối với các vòng kết nối lớn hơn, có lẽ bạn nên sử dụng NSOperations để đảm bảo chế độ xem được tạo nhanh hơn, điều này sẽ làm cho mượt mà hơn.

Hy vọng điều này sẽ hữu ích.

+0

Ý tưởng hay. Tôi sẽ thử. Bạn có thể xây dựng đề xuất của mình với NSOperations không? –

+0

Im vui vì bạn thích ý tưởng này, liên quan đến vòng kết nối lớn hơn, tôi sẽ chỉ cho bạn ví dụ [Breadcrumb] (http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html). – Zebs

+2

Tìm kiếm một hướng dẫn 'NSOperation' tôi đến [this one] (http://icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/), nó là rất hoàn chỉnh và sẽ giúp bạn tạo các đối tượng 'MKCircle' nhanh hơn. Chỉ cần nhớ rằng bạn chỉ có thể cập nhật giao diện người dùng từ vòng lặp chạy chính. Đã xóa liên kết – Zebs

0

Đặt cược tốt nhất của bạn có thể là tự vẽ vòng tròn, hoặc sử dụng một UIView khác trên MKMapView hoặc sử dụng MKAnnotationView trong Chế độ xem bản đồ.

Blogger này đã thực hiện một điều tương tự (trước iOS4 khi lớp phủ được thêm). http://spitzkoff.com/craig/?p=65

+0

trong khi kéo bản đồ, UiView không di chuyển với bản đồ. – AlexWien

Các vấn đề liên quan