1

我正在使用 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

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

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

4

2 回答 2

0

如果您试图使地图以用户当前位置为中心,请首先确定是否要使用:

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

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

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

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

  • 在 viewDidLoad 或 IB 中,设置mapView.showsUserLocationYES
  • mapView:didUpdateUserLocation:方法中,做mapView.centerCoordinate = userLocation.location.coordinate;(或使用setCenterCoordinate:animated:
  • 建议还实施mapView:didFailToLocateUserWithError:以处理或至少意识到失败

如果使用CLLocationManager,则:

  • 在 viewDidLoad 中,做[locationManager startUpdatingLocation];
  • locationManager:didUpdateToLocation:fromLocation:方法中,做mapView.centerCoordinate = newLocation.coordinate;(或使用动画方法)
  • 建议还实施locationManager:didFailWithError:以处理或至少意识到失败
于 2011-06-28T20:16:54.587 回答
0

我能够通过创建一个UIViewController子类来保存MKMapView实例来解决这个问题。我恢复了mapView的跨度loadView,然后调用[mapView setUserTrackingMode:...]VC的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;
}

我从一个更大的项目中删减了它,所以如果你发现任何拼写错误,请告诉我,但这就是它的要点。

于 2012-03-28T18:27:34.023 回答