iOS - добавление и удаление наложения MKCircle в MapView, вызывающее сбой - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть MapView, и пользователь может выбрать радиус, чтобы показать область. Я добавляю MKCircle в качестве наложения. Когда радиус изменяется от 30 миль до 1 мили, по периметру MKCircle наблюдается заметный сбой, в то время как MapView увеличивает масштаб. Глюк выглядит как флер. Это происходит только при увеличении, а не при уменьшении. \

Поскольку зум постоянно меняется, я удаляю старое наложение перед добавлением другого, но я не думаю, что это проблема.

Как я могу удалить ошибку на круге при изменении масштаба MapView?

@IBAction func newRadiusButtonTapped(sender: UIButton) {

    // coordinate is the users location and span was 10 miles now it's 1 mile
    let region = MKCoordinateRegionMake(location.coordinate, span)
    mapView.setRegion(region, animated: true)

    let circle = MKCircle(center: location.coordinate, radius: radius)

     // remove old overlay before adding another one
     for overlay in mapView.overlays {
         mapView.remove(overlay)
     }

     view.layoutIfNeeded()
     // mapView.layoutIfNeeded() I tried this but it didn't make a difference
     mapView.add(circle)
}

30 miles

glitch

1 mile

1 Ответ

0 голосов
/ 04 ноября 2018

Я не смог найти причину сбоя, но я нашел этот метод делегата из этого ответа в mapView, который получает уведомление после того, как регион mapView завершает изменение. Я добавляю оверлей туда

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 
}

Простой процесс:

Я создаю свойство круга типа MKCircle? Я также создаю свойство с именем shouldAddCircle типа Bool и устанавливаю для него значение true. Когда кнопка нажата, я инициализирую свойство окружности с помощью MKCircle, который я создаю внутри кнопки, и устанавливаю для shouldAddCircle значение true. Внутри функции кнопки я удаляю все наложения mapViews.

Внутри метода делегата я теперь проверяю, чтобы видеть, что свойство shouldAddCircle имеет значение true, и если это я, то проверяю, чтобы убедиться, что свойство круга не равно nil. Если они совпадают, я добавляю инициализированный круг в mapView. После того, как я добавляю круг в mapView, мне нужно установить значение shouldAddCircle в false, потому что каждый раз, когда пользователь прокручивает карту, вызывается regionDidChangeAnimated, и он будет продолжать добавлять наложения на карту.

Здесь 'код ниже. Обязательно добавьте mapView.delegate = self в viewDidLoad и установите MKMapViewDelegate перед всем.

var circle: MKCircle?
var shouldAddCircle = true

@IBAction func newRadiusButtonTapped(sender: UIButton) {

    // coordinate is the users location and span was 10 miles now it's 1 mile
    let region = MKCoordinateRegionMake(location.coordinate, span)
    mapView.setRegion(region, animated: true)

    let circle = MKCircle(center: location.coordinate, radius: radius)

    // set the circle property to match the circle that was just created
    self.circle = circle

    // set this true
    shouldAddCircle = true

    // remove old overlay before adding another one
    for overlay in mapView.overlays {
        mapView.remove(overlay)
    }
}

// this function gets called repeatedly as the mapView is zoomed and/or panned
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {

    // make sure this is true because that means the user updated the radius
    if shouldAddCircle {

       // make sure the circle isn't ni
       if let circle = self.circle {
           // after the mapView finishes add the circle to it
           mapView.add(circle)

           // set this to false so that this doesn't called again until the user presses the button where they set it to true
           shouldAddCircle = false
       }
    }
}
...