我已经看到了使用JS而不是Swift的建议。

如何使用iOS版Google Maps SDK将平移限制在覆盖图像的边缘?我有一个覆盖特定区域的 map 叠加层图像,只希望用户能够平移到该叠加层图像的边缘。我以为这很简单,但显然不是!

因此,如果他们向右平移并碰到覆盖图像的东边缘,则无法在该方向上进一步平移。

到目前为止,在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 ...
   }
}

最后,如果碰到了覆盖边缘,我希望它停止在该方向上平移。我尝试将这些说明改编为panning within a certain radius,但无济于事:
    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)
    }

这很不好,因为
  • 它无限地向上平移
  • '东部'是边界-击中边界时不是相机的中心。我无法以CLLocationCoordinate2D可以接受的方式获得此值。

  • 一定有更简单的方法!对于某些我认为很常见的用例,这似乎真的很复杂。我不知道该如何处理缩放,旋转,同时击中北北边缘等。

    最佳答案

    我终于可以通过遵循以下实现并将其从Objective-C更改为Swift来解决此问题:How do I prevent 'GMSMapView' from Infinite horizontal scrolling?

    唯一的问题是currentPosition集中在 map 的中心而不是 map 的边缘,因此我将叠加图像放大了以解决这个问题。

    关于ios - 使用Swift限制iOS版Google Maps中的平移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35328808/

    10-12 06:07