Ограничение панорамирования в Картах Google для iOS с помощью Swift

Я видел предложения для этого с использованием JS, но не Swift.

Как я могу ограничить панорамирование краями наложенного изображения с помощью Google Maps SDK для iOS с помощью swift? У меня есть наложенное изображение карты, охватывающее определенную область, и я хочу, чтобы пользователь мог перемещаться только по краям этого наложенного изображения. Я думал, что это будет очень просто, но, видимо, нет!

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

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

    // Create a rectangular path
    let rect = GMSMutablePath()
    rect.addCoordinate(CLLocationCoordinate2DMake(south, east)); //South-East
    rect.addCoordinate(CLLocationCoordinate2DMake(north, east)); //North-East
    rect.addCoordinate(CLLocationCoordinate2DMake(north, west)); //North-West
    rect.addCoordinate(CLLocationCoordinate2DMake(south, west)); //South-West

    // Create the polygon, and assign it to the map.
    let polygon = GMSPolygon(path: rect)
    polygon.fillColor = UIColor(red:0.25, green:0, blue:0, alpha:0.05);
    polygon.strokeColor = UIColor.blackColor()
    polygon.strokeWidth = 2
    polygon.map = mapView

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

Я не уверен, что есть встроенный способ сделать это с помощью Swift и Google Maps API, и это кажется действительно неэффективным.

    //run when camera changes position
    func mapView(mapView: GMSMapView!, didChangeCameraPosition position: GMSCameraPosition){
    if(mapView.projection.visibleRegion().farRight.longitude >= east)
    {
        ... print notice ...
    }
    else if(mapView.projection.visibleRegion().farRight.latitude >= north){
        ... print notice ...
    }
    else if(mapView.projection.visibleRegion().farLeft.longitude <= west){
        ... print notice ...
    }
    else if(mapView.projection.visibleRegion().nearLeft.latitude <= south){
        ... print notice ...
    }
    else{
        ... print SE, NE, NW, and SW co-ords ... 
   }
}

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

    if(mapView.projection.visibleRegion().farRight.longitude >= east)
    {
        ... print notice ...

     //Limit the panning co-ords by the East edge
     let target: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: mapView.projection.visibleRegion().farRight.latitude, longitude: east)

     //Pass this limit to the camera
     let camera: GMSCameraPosition = GMSCameraPosition(target: target, zoom: mapView.camera.zoom, bearing: 0, viewingAngle: 0)

     mapView.animateToCameraPosition(camera)
    }

Это плохо, потому что

  1. Он панорамирует вверх бесконечно
  2. «восток» — это граница, а не центр камеры в момент попадания в границу. Я не могу получить это значение так, чтобы оно было принято CLLocationCoordinate2D.

Должен быть более простой способ! Это кажется очень сложным для того, что я считал распространенным вариантом использования. Я не знаю, как тогда справиться с масштабированием, вращением, одновременным попаданием на северный и восточный край и т. д.


person Vixxd    schedule 11.02.2016    source источник


Ответы (1)


Наконец-то я смог решить эту проблему, следуя этой реализации и изменив ее с Objective-C на Swift: Как предотвратить 'GMSMapView' от бесконечной горизонтальной прокрутки?

Единственная проблема заключается в том, что currentPosition фокусируется на центре карты, а не на краях карты, поэтому я увеличил накладываемое изображение, чтобы учесть это.

person Vixxd    schedule 16.02.2016