iOS 苹果地图 MKMapView总结

本文详细介绍了在iOS中使用MKMapView进行地图操作的各种技巧,包括根据注解自动调整地图缩放比例、释放内存、获取地图中心点、设置最小缩放等级、显示重叠大头针的数字角标以及计算地图上的距离。这些方法涵盖了地图显示和交互的关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,第一次加载地图返回数据,根据所有标签决定地图缩放比例

#define MINIMUM_ZOOM_ARC 0.014 //approximately 1 miles (1 degree of arc ~= 69 miles)

#define ANNOTATION_REGION_PAD_FACTOR 1.15

#define MAX_DEGREES_ARC 360

//size the mapView region to fit its annotations

- (void)zoomMapViewToFitAnnotations:(MKMapView *)mapView animated:(BOOL)animated {

    NSArray *annotations = mapView.annotations;

    NSInteger count = [mapView.annotations count];

    if ( count == 0) { return; } //bail if no annotations

    

    //convert NSArray of id <MKAnnotation> into an MKCoordinateRegion that can be used to set the map size

    //can't use NSArray with MKMapPoint because MKMapPoint is not an id

    MKMapPoint points[count]; //C array of MKMapPoint struct

    for( int i=0; i<count; i++ ) //load points C array by converting coordinates to points

    {

        CLLocationCoordinate2D coordinate = [(id <MKAnnotation>)[annotations objectAtIndex:i] coordinate];

        points[i] = MKMapPointForCoordinate(coordinate);

    }

    //create MKMapRect from array of MKMapPoint

    MKMapRect mapRect = [[MKPolygon polygonWithPoints:points count:count] boundingMapRect];

    //convert MKCoordinateRegion from MKMapRect

    MKCoordinateRegion region = MKCoordinateRegionForMapRect(mapRect);

    

    //add padding so pins aren't scrunched on the edges

    region.span.latitudeDelta  *= ANNOTATION_REGION_PAD_FACTOR;

    region.span.longitudeDelta *= ANNOTATION_REGION_PAD_FACTOR;

    //but padding can't be bigger than the world

    if( region.span.latitudeDelta > MAX_DEGREES_ARC ) { region.span.latitudeDelta  = MAX_DEGREES_ARC; }

    if( region.span.longitudeDelta > MAX_DEGREES_ARC ){ region.span.longitudeDelta = MAX_DEGREES_ARC; }

    

    //and don't zoom in stupid-close on small samples

    if( region.span.latitudeDelta  < MINIMUM_ZOOM_ARC ) { region.span.latitudeDelta  = MINIMUM_ZOOM_ARC; }

    if( region.span.longitudeDelta < MINIMUM_ZOOM_ARC ) { region.span.longitudeDelta = MINIMUM_ZOOM_ARC; }

    //and if there is a sample of 1 we want the max zoom-in instead of max zoom-out

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值