在MapKit中缩小和适合所有注释的最佳方式是什么?
我正在进行的快速背景。 UIMapView加载并显示单个注释(从不超过一个)。 在菜单栏上,有一个“我的我”button,点击时finduserLocation并显示为第二个注释。 然后我有MapView缩小以适应范围内的这些注释,但我无法find一个合适的方式这样做。 根据第一个注释与用户位置相关的位置,有时不会缩小到足够的位置。
例如,如果注释是用户的西北部,则缩小。 但是,如果注释位于用户的东南方,则只能将其缩小到足以让它们被切断,而且必须手动缩小一点。 这是我正在使用的代码,其他一些我已经find的变化。
CLLocation *whereIAm = mapView.userLocation.location; float lat = whereIAm.coordinate.latitude; float lon = whereIAm.coordinate.longitude; CLLocationCoordinate2D southWest = {[currentLatitude floatValue], [currentLongitude floatValue]}; CLLocationCoordinate2D northEast = southWest; southWest.latitude = MIN(southWest.latitude, lat); southWest.longitude = MIN(southWest.longitude, lon); northEast.latitude = MAX(northEast.latitude, lat); northEast.longitude = MAX(northEast.longitude, lon); CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude]; CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude]; CLLocationDistance meters = [locSouthWest distanceFromLocation:locNorthEast]; MKCoordinateRegion region; region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0; region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0; region.span.latitudeDelta = meters / 111319.5 region.span.longitudeDelta = 7.0; MKCoordinateRegion savedRegion = [mapView regionThatFits:region]; [mapView setRegion:savedRegion animated:YES]; [locSouthWest release]; [locNorthEast release];
是否有更好的方式内置到MapKit只是缩小,使两个注释有,可以说在他们之间的外框半英寸? 我真的不在乎用户是否需要放大,我只是想让它缩小。
-(void)zoomToFitMapAnnotations:(MKMapView*)mapView { if([mapView.annotations count] == 0) return; CLLocationCoordinate2D topLeftCoord; topLeftCoord.latitude = -90; topLeftCoord.longitude = 180; CLLocationCoordinate2D bottomRightCoord; bottomRightCoord.latitude = 90; bottomRightCoord.longitude = -180; for(MapAnnotation* annotation in mapView.annotations) { topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude); topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude); bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude); bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude); } MKCoordinateRegion region; region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5; region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5; region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1; // Add a little extra space on the sides region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; // Add a little extra space on the sides region = [mapView regionThatFits:region]; [mapView setRegion:region animated:YES]; }
取自: http : //codisllc.com/blog/zoom-mkmapview-to-fit-annotations/
(一直使用它)
在iOS7中有一种方法可以做到这一点。 只要打电话:
[yourMapView showAnnotations:yourAnnotationsArray animated:YES];
那些做monodouch c#编码的人
BasicMapAnnotation是从MKAnnotationinheritance的类
private void GetRegion(MKMapView mapView) { var userWasVisible = mapView.ShowsUserLocation; mapView.ShowsUserLocation = false; // ignoring the blue blip // start with the widest possible viewport var tl = new CLLocationCoordinate2D(-90, 180); // top left var br = new CLLocationCoordinate2D(90, -180); // bottom right foreach (var an in mapView.Annotations) { // narrow the viewport bit-by-bit CLLocationCoordinate2D coordinate = ((BasicMapAnnotation) an).Coordinate; tl.Longitude = Math.Min(tl.Longitude, coordinate.Longitude); tl.Latitude = Math.Max(tl.Latitude, coordinate.Latitude); br.Longitude = Math.Max(br.Longitude, coordinate.Longitude); br.Latitude = Math.Min(br.Latitude, coordinate.Latitude); } var center = new CLLocationCoordinate2D { // divide the range by two to get the center Latitude = tl.Latitude - (tl.Latitude - br.Latitude)*0.5,Longitude = tl.Longitude + (br.Longitude - tl.Longitude)*0.5 }; var span = new MKCoordinateSpan { // calculate the span, with 20% margin so pins aren't on the edge LatitudeDelta = Math.Abs(tl.Latitude - br.Latitude)*1.2,LongitudeDelta = Math.Abs(br.Longitude - tl.Longitude)*1.2 }; var region = new MKCoordinateRegion {Center = center, Span = span}; region = mapView.RegionThatFits(region); // adjusts zoom level too mapView.SetRegion(region, true); // animated transition mapView.ShowsUserLocation = userWasVisible; }
您可以使用此代码来显示所有注释
MKMapRect zoomRect = MKMapRectNull; for (id <MKAnnotation> annotation in mapView.annotations) { MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate); MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1); zoomRect = MKMapRectUnion(zoomRect, pointRect); } [mapView setVisibleMapRect:zoomRect animated:YES];
如果要包含用户位置,只需用上面的代码的第一行replace下面的两行即可
MKMapPoint annotationPoint = MKMapPointForCoordinate(mapView.userLocation.coordinate); MKMapRect zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);