MKOverlay не изменяет размер плавно - PullRequest
21 голосов
/ 02 февраля 2011

Я добавил MKCircle как MKOverlay в мой MKMapView. Также я добавил UISlider для определения радиуса круга. К сожалению, при использовании этого он кажется немного «запаздывающим», не так гладко, как хотелось бы.

Пример: 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;
}

У кого-нибудь есть предложения, как мне это сгладить?

С уважением,
Пол Пилен

Ответы [ 2 ]

5 голосов
/ 06 февраля 2011

Я попробовал ваш код и нашел очень простой способ сделать его более плавным.

При изменении порядка звонков: - (void)sliderChanged:(UISlider*)sender

Вы можете позвонить [self addCircleWithRadius:radius];

перед звонком [mapView removeOverlays:[mapView overlays]];

Просто убедитесь, что вы не удаляете только что добавленные наложения, только старые.

Это даст вам более плавное изменение размера, особенно когда новый круг меньше старого.

Для кругов большего размера вам, вероятно, лучше использовать NSOperations, чтобы обеспечить более быстрое создание видов.

Надеюсь, это поможет.

0 голосов
/ 06 февраля 2011

Лучше всего сделать круг самостоятельно, либо с помощью другого UIView поверх MKMapView, либо с помощью MKAnnotationView в представлении карты.

Этот блоггер сделал то же самое (до iOS4, когданакладки были добавлены).http://spitzkoff.com/craig/?p=65

...