使用 Swift 限制 Google 地图中的 iOS 平移
Limiting panning in Google Maps for iOS with Swift
我看到过使用 JS 的建议,但没有看到 Swift。
如何使用 Google Maps SDK for 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 映射 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)
}
这很糟糕,因为
- 无限向上平移
- 'east' 是边界 - 不是击中边界时相机的中心。我无法以 CLLocationCoordinate2D 接受的方式获取此值。
一定有更简单的方法!对于我认为是常见用例的东西,这似乎真的很复杂。我不知道如何处理缩放、旋转、同时击中北边和东边等。
我终于能够通过遵循此实现并将其从 Objective-C 更改为 Swift 来解决此问题:How do I prevent 'GMSMapView' from Infinite horizontal scrolling?
唯一的问题是 currentPosition 集中在地图的中心而不是地图的边缘,因此我将叠加图像放大以解决这个问题。
我看到过使用 JS 的建议,但没有看到 Swift。
如何使用 Google Maps SDK for 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 映射 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)
}
这很糟糕,因为
- 无限向上平移
- 'east' 是边界 - 不是击中边界时相机的中心。我无法以 CLLocationCoordinate2D 接受的方式获取此值。
一定有更简单的方法!对于我认为是常见用例的东西,这似乎真的很复杂。我不知道如何处理缩放、旋转、同时击中北边和东边等。
我终于能够通过遵循此实现并将其从 Objective-C 更改为 Swift 来解决此问题:How do I prevent 'GMSMapView' from Infinite horizontal scrolling?
唯一的问题是 currentPosition 集中在地图的中心而不是地图的边缘,因此我将叠加图像放大以解决这个问题。