在开发中两个注意的地方:
1.PointAnnotation 如果不设置title的话,是不会触发代理方法(选中、未选中)的。
-(void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view
可以将title 设置为 @" " (注意是空格),解决代理方法的触发问题。
如果在触发方法的时候不希望弹出气泡,那么可以在下面的代理方法中设置。
if ([annotation isKindOfClass:[CustomPointAnnotation class]]) {
CustomAnonotationView *newAnnotationView = [CustomAnonotationView annotationViewWithMap:mapView withAnnotation:annotation];
newAnnotationView.canShowCallout = NO;//不弹出气泡
if (((CustomPointAnnotation *)annotation).isUserAnnotation) {
//用户位置
newAnnotationView.image = [UIImage imageNamed:@"annotation_me"];
newAnnotationView.enabled = NO;//标注的点击事件被禁用
}else{
newAnnotationView.image = [UIImage imageNamed:@"annotation_xx"];
}
return newAnnotationView;
}
return nil;
}
newAnnotationView.canShowCallout = NO;//不弹出气泡
2.在做标注的选中与反选时,要注意以下几个地图的事件会默认触发反选方法。
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view
点中覆盖物
点中底图标注
点中底图空白处
双击地图
这个解决要看需求(具体思路就是开关)
a. 如果希望上述事件不影响标注的选中与反选,那么可以弃用反选方法didDeselectAnnotationView
,自行记录标注的选中状态并控制。如(记录上一个选中的标注)
b. 如果希望某个事件能够执行,做一个事件记录开关,在方法中过滤掉。
自定义标注:
PointAnnotation
//.h
#import <BaiduMapAPI_Map/BMKPointAnnotation.h>
#import "customInfo.h"
@interface LSJPointAnnotation : BMKPointAnnotation
@property (nonatomic, weak) id<BMKAnnotation> delegate;
//区分 坐标 (用户坐标、其它坐标)
@property (nonatomic, assign) BOOL isUserAnnotation;
@property (nonatomic, assign) int intIndex;
@end
//.m
#import "CustomPointAnnotation.h"
@implementation CustomPointAnnotation
@end
AnnotationView
//.h
#import <BaiduMapAPI_Map/BMKMapView.h>
@interface CustomAnonotationView : BMKAnnotationView
+ (instancetype)annotationViewWithMap:(BMKMapView *)mapView withAnnotation:(id <BMKAnnotation>)annotation;
@end
//.m
#import "CustomAnonotationView.h"
#import <BaiduMapAPI_Map/BMKPointAnnotation.h>
#import "CustomPointAnnotation.h"
@implementation CustomAnonotationView
- (id)initWithAnnotation:(id<BMKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self) {
//在一些方法中看到这样的方法
// 隐藏气泡
// UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
// self.paopaoView = [[BMKActionPaopaoView alloc] initWithCustomView:view];
}
return self;
}
+ (instancetype)annotationViewWithMap:(BMKMapView *)mapView withAnnotation:(id <BMKAnnotation>)annotation {
if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
static NSString *identifier = @"annotation";
// 1.从缓存池中取
CustomAnonotationView *annoView = (CustomAnonotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
// 2.如果缓存池中没有, 创建一个新的
if (annoView == nil) {
annoView = [[CustomAnonotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
}
if ([annotation isKindOfClass:[CustomPointAnnotation class]]) {
annoView.annotation = (CustomPointAnnotation *)annotation;
}
annoView.image = [UIImage imageNamed:@"annotation_default"];
return annoView;
}
return nil;
}
@end
网友评论