ios - 缩小和适合 MapKit 中所有注释的最佳方法是什么

标签 ios objective-c iphone cocoa-touch mapkit

我正在做的事情的快速背景。 UIMapView 加载并显示单个注释(永远不会超过一个)。在菜单栏上,有一个 Locate Me 按钮,点击 userLocation 即可找到并显示为第二个注释。然后我让 MapView 缩小以适应范围内的这两个注释,但我无法找到合适的方法。根据第一个注释相对于用户位置的放置位置,有时它缩小得不够。

例如,如果注释位于用户的西北方向,则它可以很好地缩小。但是,如果注释位于用户的东南方,它只会缩小到它们被截断的程度,您必须手动再缩小一点。这是我正在使用的代码,是我在 SO 上找到的一些其他代码的变体。

        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/

(一直使用它。)

关于ios - 缩小和适合 MapKit 中所有注释的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4169459/

相关文章:

iphone - RESTKit 是 ASIHTTPRequest 的良好替代品吗?

iOS UITableView 重新加载

ios - 弹出窗口关闭事件

ios - 应用程序/后端架构 : How do Snapchat stories load so fast?

iphone - 获取名称以001XXX.jpg开头的所有资源

ios - 将参数添加到 setHTTPBody 请求 Xcode

ios - 用于自定义拇指位置和拇指图像的 UISlider 子类?

集成 Sharekit 后 iPhone 应用程序无法在设备上运行

ios - 使用 AVCaptureVideoDataOutput 录制视频

iphone - Apple 设置应用程序的设置具体何时保存?