Рисование MKCircle на виде карты - PullRequest
2 голосов
/ 27 июня 2011

Мне нужно нарисовать круг, чтобы отобразить расстояние вокруг точки, которую я наметил.

Где мне реализовать эти две строки кода, чтобы он работал?Я попытался вставить его в viewWillAppear:, но круг не появляется.

[self addCircle:_coordinate];
[self addCircleWithRadius:5.5 addCircleWithCoordinate:_coordinate];

- (void)addCircle: (CLLocationCoordinate2D)coordinate
{
    // draw the radius circle for the marker

    double radius = 2000.0;
    MKCircle *circle = [MKCircle circleWithCenterCoordinate:coordinate radius:radius];
    [circle setTitle:@"background"];
    [_mapView addOverlay:circle];

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

- (void)addCircleWithRadius:(double)radius addCircleWithCoordinate: (CLLocationCoordinate2D) coordinate
{

    MKCircle *circle = [MKCircle circleWithCenterCoordinate:coordinate radius:radius];
    [circle setTitle:@"background"];
    [_mapView addOverlay:circle];

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

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

    double radius = (sender.value * 100);
    CLLocationCoordinate2D coordinate = self.coordinate;

    [self addCircleWithRadius:radius addCircleWithCoordinate:coordinate];
}

- (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 ]

1 голос
/ 30 июня 2011

Хотя вы можете попробовать viewDidAppear вместо viewWillAppear, я думаю, что это уже должно работать в этом отношении. Я думаю, что у вас что-то не так, и вам нужно найти отладчик. Проверьте обычных подозреваемых:

  • Установить цвет заливки. Сделайте это непрозрачным и очевидным.
  • _mapView может быть нулевым или зомбированным во время выполнения. (или не отображается в вашей XIB)
  • Координаты или радиус могут отличаться от ожидаемых. Проверьте фактические значения координат в вашем отладчике.
  • Все может быть правильно, за исключением того, что координаты не находятся в увеличенной области вашей карты.
0 голосов
/ 29 марта 2015

Вам нужно подождать, пока карта не будет нарисована на экране, прежде чем накладывать на нее оверлей.

Убедитесь, что вы установили делегата для карты:

<MKMapViewDelegate>

Назначить делегата (может сделать это в вашем методе viewDidLoad):

_mapview.delegate = self;

Наконец, переопределите следующий метод делегата:

- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered {
[self addCircle:_coordinate];
[self addCircleWithRadius:5.5 addCircleWithCoordinate:_coordinate];
}

Этот метод делегата будет вызван, как только карта будет завершена на экране пользователя. Вы можете использовать значение fullRendered в качестве окончательной проверки в случае, если вы хотите обрабатывать и ошибки.

...