如何动态设置MKMapView的区域跨度,以便在重绘地图时不会“捕捉”回初始区域?

时间:2011-06-28 18:47:42

标签: iphone mkmapview zoom region

我正在使用MKMapview,我在缩放级别和区域范围方面遇到了问题。

当刷新MKMapView时,它会将区域重置为我最初安装时已经硬编码的值。我正在跟踪用户的位置,并且对于电话位置的任何更改,地图应通过CLLocationManagerDelegate和下面列出的委托方法进行更新。

目前我在locationManager中有这个:didUpdateToLocation:fromLocation:

    MKCoordinateSpan span;
    span.latitudeDelta =  0.8;  
    span.longitudeDelta = 0.8;     
    MKCoordinateRegion region;
    region.center = newLocation.coordinate;
    region.span = span;
    [self.MyMapView setRegion:region animated:NO];

我也尝试在viewDidLoad中添加类似的代码:无济于事。我的想法是我可以以某种方式在

中动态设置区域
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

委托方法我可以完全回避这个问题,但我不是确切地确定我应该怎么做。

最终,我只想让地图停止“捕捉”回上面的跨度。提前谢谢。

2 个答案:

答案 0 :(得分:0)

如果您尝试将地图置于用户当前位置的中心位置,请先决定是否要使用:

  • 地图视图的userLocation属性和地图视图的委托方法mapView:didUpdateUserLocation:
  • CLLocationManager及其委托方法locationManager:didUpdateToLocation:fromLocation:

使用viewDidLoad中的任何一个,您只需设置地图视图的初始区域,包括中心(使用一些默认坐标)和跨度。在viewDidLoad中,用户的位置不太可能立即可用,因为它可能需要几秒钟才能获得。

在设置具有该值的区域时,尝试在其设置之前使用userLocation可能会导致异常。

如果使用地图视图的userLocation,则:

  • 在viewDidLoad或IB中,将mapView.showsUserLocation设置为YES
  • mapView:didUpdateUserLocation:方法中,执行mapView.centerCoordinate = userLocation.location.coordinate;(或使用setCenterCoordinate:animated:
  • 建议实施mapView:didFailToLocateUserWithError:以处理或至少了解失败

如果使用CLLocationManager,则:

  • 在viewDidLoad中,执行[locationManager startUpdatingLocation];
  • locationManager:didUpdateToLocation:fromLocation:方法中,执行mapView.centerCoordinate = newLocation.coordinate;(或使用动画方法)
  • 建议实施locationManager:didFailWithError:以处理或至少了解失败

答案 1 :(得分:0)

我能够通过创建一个UIViewController子类来保存MKMapView实例来解决这个问题。我在loadView中恢复mapView的范围,然后在VC的[mapView setUserTrackingMode:...]方法中调用viewWillAppear

我看到了OP在前面的实现中描述的行为,我在那里动态创建了一个VC和一个“MKMapView”实例,然后将其推送到我的导航控制器上。我无法同时设置范围并设置用户跟踪以跟随用户而不会丢失跨度。我做了一些调试甚至看到原始跨度值在显示视图时被丢弃,所以我认为它与设置跨度或设置用户跟踪模式有关,而没有显示视图。无论如何,组织上面的代码解决了这个问题。

以下是相关位:

// ===== mainVC.h =====
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface MapVC : UIViewController <MKMapViewDelegate>
@end

// ===== mainVC.m =====   
static MapVC *map = nil;

- (void)mapAction {
    UINavigationController *nav = [self navigationController];

    // map VC is a singleton
    if (!map) map = [[MapVC alloc] init];

    [nav pushViewController:map animated:TRUE];
}


// ===== MapVC.m =====
- (void)loadView {
    mapView = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [mapView setDelegate:self];
    MKCoordinateSpan span = MKCoordinatSpanMake(storedLatitudeDelta, storedLongitudeDelta);
    [mapView setRegion:MKCoordinateRegionMake(storedCenter, span)];
    [self setView:mapView];
}

- (void)viewWillAppear:(BOOL)animated {
    [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:TRUE];
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    MKCoordinateSpan mySpan = [mapView region].span;
    storedLatitudeDelta = mySpan.latitudeDelta;
    storedLongitudeDelta = mySpan.longitudeDelta;
}

我从一个更大的项目中删除了,所以如果你看到任何错别字,请告诉我,但这就是它的要点。