我怎么能限制地图区域只有一个国家在iOS?

我正在使用mapkit为iOS创build应用程序。 我想限制地图的边界只限于一个特定的地区/国家。 有没有办法做到这一点?

没有办法告诉地图不要滚出某个区域。 我能想到的唯一方法就是当你击中你的一个栅栏时,阻止用户滚动。 下面的例子是没有testing或编译的,所以你可能需要自己来唠叨,但希望它会让你开始..

ViewController.h

 CLLocationCoordinate2D myNorthEast, mySouthWest; 

ViewController.m

 -(void)viewDidLoad{ myNorthEast = CLLocationCoordinate2DMake(lat1,lon1); mySouthWest = CLLocationCoordinate2DMake(lat2,lon2); [super viewDidLoad]; } -(void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated{ /* / Check if the map region is going to change outside your fence. / If so, programmatically set it back to the edge of your fence. */ if(!animated){ return; // Don't want to get stuck in a loop after you set your region below. } MKCoordinateRegion region = [mapView region]; // You will need to get the NE and SW points of the new region to compare // First we need to calculate the corners of the map so we get the points CGPoint nePoint = CGPointMake(mapView.bounds.origin.x + mapView.bounds.size.width, mapView.bounds.origin.y); CGPoint swPoint = CGPointMake(mapView.bounds.origin.x, bounds.origin.y + mapView.bounds.size.height); // Then transform those point into lat,lng values CLLocationCoordinate2D neCoord; neCoord = [mapView convertPoint:nePoint toCoordinateFromView:mapView]; CLLocationCoordinate2D swCoord; swCoord = [mapView convertPoint:swPoint toCoordinateFromView:mapView]; /* You will need to mess around with the lat/lon & sign of the new center calculation for the other cases. */ if(neCoord.latitude > myNorthEast.latitude){ MKCoordinateRegion newRegion; newRegion.span = region.span; CLLocationCoordinate2D newCenter; newCenter.longitude = region.center.longitude; newCenter.latitude = myNorthEast.latitude - region.span.latitudeDelta; newRegion.center = newCenter; [mapView setRegion:newRegion animated:NO]; }else if(neCoord.longitude < myNorthEast.longitude){ }else if(swCoord.latitude < mySouthWest.latitude){ }else if(swCoord.longitude > mySouthWest.longitude){ } } 

这部分来自这个答案: 获取MKMapvIew的界限

这是前一个答案的进一步说明。 请注意,对于世界的不同地区来说这将是不同的:

  if(neCoord.latitude > myNorthEast.latitude){ MKCoordinateRegion newRegion; newRegion.span = region.span; CLLocationCoordinate2D newCenter; newCenter.longitude = region.center.longitude; newCenter.latitude = myNorthEast.latitude - region.span.latitudeDelta / 2; newRegion.center = newCenter; [mapView setRegion:newRegion animated:NO]; } else if(swCoord.latitude < mySouthWest.latitude){ MKCoordinateRegion newRegion; newRegion.span = region.span; CLLocationCoordinate2D newCenter; newCenter.longitude = region.center.longitude; newCenter.latitude = mySouthWest.latitude + region.span.latitudeDelta / 2; newRegion.center = newCenter; [mapView setRegion:newRegion animated:NO]; } else if(neCoord.longitude > myNorthEast.longitude){ MKCoordinateRegion newRegion; newRegion.span = region.span; CLLocationCoordinate2D newCenter; newCenter.longitude = myNorthEast.longitude - region.span.longitudeDelta / 2; newCenter.latitude = region.center.latitude; newRegion.center = newCenter; [mapView setRegion:newRegion animated:NO]; } else if(swCoord.longitude < mySouthWest.longitude){ MKCoordinateRegion newRegion; newRegion.span = region.span; CLLocationCoordinate2D newCenter; newCenter.longitude = mySouthWest.longitude + region.span.longitudeDelta / 2; newCenter.latitude = region.center.latitude; newRegion.center = newCenter; [mapView setRegion:newRegion animated:NO]; }