Подтвердить что ты не робот

MKOverlay не изменяет размер

Я добавил 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;
}

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

С наилучшими пожеланиями,
Пол Пилен

4b9b3361

Ответ 1

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

Если вы измените порядок вызовов в: - (void)sliderChanged:(UISlider*)sender

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

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

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

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

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

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

Ответ 2

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

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