Как изменить размер MKCircle Smoothly

Я пытаюсь реализовать MKCircle, который увеличивается или уменьшается в радиусе при изменении ползунка. У меня есть проблема в том, что когда круг перерисовывается, он совсем не гладкий. Я прочитал несколько других постов, и они, кажется, указывают на то, что вы должны создать подкласс MKCircle и каким-то образом сделать это, но всякий раз, когда я смотрю на пример кода, мне трудно следовать, так как его обычно нет в Swift 3. Может кто-то покажи как это сделать? Вот мой код, когда ползунок изменяется:

func sliderValueChanged(_ sender:UISlider!) {
    if (!map.selectedAnnotations.isEmpty) {
        for overlay in map.overlays {
            var temp : MKAnnotation = (map.selectedAnnotations.first)!
            if (overlay.coordinate.latitude == temp.coordinate.latitude && overlay.coordinate.longitude == temp.coordinate.longitude) {
                let newCirc : MKCircle = MKCircle(center: temp.coordinate, radius: CLLocationDistance(Float(sender.value*1000)))
                let region: MKCoordinateRegion = MKCoordinateRegionForMapRect(newCirc.boundingMapRect)
                let r: MKCoordinateRegion = map.region
                if (region.span.latitudeDelta > r.span.latitudeDelta || region.span.longitudeDelta > r.span.longitudeDelta){
                    map.setRegion(region, animated: true)
                }
                map.add(MKCircle(center: temp.coordinate, radius: CLLocationDistance(Float(sender.value*1000))))
                map.remove(overlay)
                break
            }
        }

    }
}

Изображение того, что я до сих пор

1 ответ

Я решил это следующим образом:

let currentLocPin = MKPointAnnotation()
var circle:MKCircle!

    func sliderValueDidChange(sender: UISlider) {

            map.remove(circle)

            circle = MKCircle(center: currentLocPin.coordinate, radius: CLLocationDistance(sender.value))
            map.add(circle)
    }

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

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

var radius: Float = 0.0

@objc private func handleSliderMove() {
    guard let current = mapView.overlays.first else { return }

    let newRadius = CLLocationDistance(exactly: radiusSlider.value) ?? 0.0
    let currentRadius = CLLocationDistance(exactly: self.radius) ?? 0.0

    var diff = (newRadius - currentRadius)
    diff = diff > 0 ? diff : (diff * -1.0)

    if diff > 5 {
        self.mapView.addOverlay(MKCircle(center: current.coordinate, radius: newRadius))
        
        self.mapView.removeOverlay(current)
        self.radius = radiusSlider.value
    }
}
Другие вопросы по тегам