iOS - добавление и удаление наложения MKCircle на MapView, вызывающее сбой
У меня есть 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)
}
1 ответ
Я не смог найти причину сбоя, но нашел этот метод делегата из этого ответа на 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
}
}
}