阅读提示:以下_mapView默认为BMKMapView的实例
问题:
1.百度地图首次无法加载或者显示不全:
(1)**申请key过程中填写的Bundle Identifier要包含ProjectName(从Bundle Identifier编辑栏中直接复制时不包含ProjectName)
(2)BMKMapView一定要添加到View上,例如
self.view = _mapView;
或
[self.view addSubView: _mapView];
(3)由于SDK还不完善,只能通过_mapView.showsUserLocation = YES;获取用户位置,此时也需要注意步骤2,不需要在界面上显示_mapView时只需要把frame的x坐标改为-320或者320即可,否则在其他地方显示_mapView时有可能出现显示不全的问题。
(4)以上方法行不通,请对照百度demo的project和targets(active target)中的Build Settings与你的项目设置有什么不同,都照百度的改好,一般来说注意c++ Standard Library和Implicit Constant Conversions相关选项设置即可。
2.添加标注或覆盖层的视图在viewWillDisappear事件注意最好添加如下代码(标注会有缓存)
- (void)viewWillDisappear:(BOOL)animated
{
NSArray* pAnnotations = [NSArray arrayWithArray:_mapView.annotations];
[_mapView removeAnnotations:pAnnotations];//移除标注
NSArray* pOverlays = [NSArray arrayWithArray:_mapView.overlays];
[_mapView removeOverlays:pOverlays];//移除覆盖层
[_mapView viewWillDisappear];
_mapView.delegate = nil;
[super viewWillDisappear:animated];
}
3.注意dealloc方法
- (void)dealloc {
[super dealloc];
if (_mapView) {
[_mapView release];
_mapView = nil;
}
}
在_mapView release之后,_mapView retainCount结果应为1(或者大于1),否则可能会报错,
说明:
/**
*当mapview即将被显式的时候调用,恢复之前存储的mapview状态。
*/
-(void)viewWillAppear;
/**
*当mapview即将被隐藏的时候调用,存储当前mapview的状态。
*/
-(void)viewWillDisappear;
以往碰壁的经验发现,在每次执行
BMKMapView *_mapView = [[BMKMapView alloc]init];
后,_mapView retainCount值为2,由上推断,_mapView由BMKMapManager统一管理,在appDelegate.m值执行
BMKMapManager *_mapManager = [[BMKMapManager alloc]init];
后一个供全局使用的BMKMapView已经创建好,以后再创建BMKMapView实例时都会从这个全局BMKMapView中查看是否有缓存,无则创建,有则使用,所以在整个工程中BMKMapView第一次加载时必须添加到UIView在界面上显示,调用[_mapView viewWillAppear]时才能顺利完成加载,否则会中断造成显示不全或者更可怕的灾难。而加载完成后,保留缓存。所以离开标注视图后应注意移除标注。