как автоматически масштабировать mapView для отображения наложения

Я могу нарисовать многоугольник в mapView, однако мне нужно найти многоугольник и увеличить его вручную. Есть ли способ сделать этот процесс автоматически, например настроить многоугольник в центре? Я просмотрел Интернет и прочитал несколько статей по теме, большинство из которых основано на ломаных линиях и точках. Любая помощь будет оценена по достоинству, так как я некоторое время нахожу решение. Заранее спасибо.

Используя следующие методы для рисования полигона в mapView:

func drawFence(coordinates: UnsafePointer<CLLocationCoordinate2D>, count: Int) {
        let makePoly = MKPolygon(coordinates: coordinates, count: count)
        mapview.addOverlay(makePoly)
    }

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    guard let polyOverlay = overlay as? MKPolygon else { return MKOverlayRenderer() }
    let polyRender = MKPolygonRenderer(polygon: polyOverlay)
    polyRender.fillColor = #colorLiteral(red: 0.9764705882, green: 0.09803921569, blue: 0.2588235294, alpha: 0.6)
    polyRender.strokeColor = #colorLiteral(red: 0.9764705882, green: 0.09803921569, blue: 0.2588235294, alpha: 1)
    polyRender.lineWidth = 2
    return polyRender
}

person Saurabh    schedule 05.11.2019    source источник
comment
попробуйте это масштабировать/панорамировать, чтобы уместить все наложения с небольшим буфером: ) mapView.setVisibleMapRect(rect, edgePadding: UIEdgeInsets(верх: 50.0, слева: 50.0, внизу: 50.0, справа: 50.0), анимированный: true) }   -  person Dhaval Raval    schedule 05.11.2019
comment
@DhavalRaval Я пробовал этот код раньше, и там нет свойства с именем MKMapRectUnion.   -  person Saurabh    schedule 05.11.2019
comment
@Rob, спасибо, предложенное вами название имеет смысл, я изменил его соответствующим образом.   -  person Saurabh    schedule 07.11.2019


Ответы (1)


Если вы пытаетесь увеличить масштаб определенного наложения, вы можете:

let insets = UIEdgeInsets(top: 50, left: 50, bottom: 50, right: 50)

func zoom(for overlay: MKOverlay) {
    mapView.setVisibleMapRect(overlay.boundingMapRect, edgePadding: insets, animated: true)
}

введите здесь описание изображения


Если вы хотите увеличить карту, чтобы показать все наложения, вы можете сделать:

func zoomForAllOverlays() {
    guard let initial = mapView.overlays.first?.boundingMapRect else { return }

    let mapRect = mapView.overlays
        .dropFirst()
        .reduce(initial) { $0.union($1.boundingMapRect) }

    mapView.setVisibleMapRect(mapRect, edgePadding: insets, animated: true)
}

Например, добавив два оверлея (над Нью-Йорком и Стэмфордом), я вызвал эту процедуру, и в результате получилось:

mapview с двумя наложениями


Кстати, я знаю, что вопрос был о Polygon оверлеях, но техника работает вне зависимости от типа оверлея. Просто было проще создать Circle оверлеи для демонстрационных целей.

person Rob    schedule 06.11.2019
comment
Я внес необходимые изменения в код, как уже упоминалось, и это сработало как шарм для обоих оверлеев. - person Saurabh; 07.11.2019