iOS--BaiduMap自定义annotation和annotationView

//导入<BaiduMapAPI_Map/BMKMapComponent.h>库

#import "AppDelegate.h"
#import "MainViewController.h"
#import <BaiduMapAPI_Map/BMKMapComponent.h>

//遵循代理
@interface AppDelegate ()<BMKGeneralDelegate>

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    [self.window makeKeyAndVisible];
    self.window.backgroundColor = [UIColor whiteColor];
    
    MainViewController *mainVC = [[MainViewController alloc] init];
    UINavigationController *mainNC = [[UINavigationController alloc] initWithRootViewController:mainVC];
    self.window.rootViewController = mainNC;
    
    //初始化    
    BMKMapManager *mapManager = [[BMKMapManager alloc]init];
    [mapManager start:@"填入申请的key" generalDelegate:self];
    
    return YES;
}
                                                                                                      
/*
*在MainViewController.m里创建地图
*/
@implementation MapViewController

- (void)viewWillAppear:(BOOL)animated
{
    [_mapView viewWillAppear];
    _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
-(void)viewWillDisappear:(BOOL)animated
{
    [_mapView viewWillDisappear];
    _mapView.delegate = nil; // 不用时,置nil
}

#pragma mark--------数据请求--------
- (void)dataHandle {
    //网络获取annotation信息
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    [manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSArray *tempArr = [responseObject objectForKey:@"data"];
        for (int i = 0; i < tempArr.count; i ++) {
           //model类
            MapItem *mapItem = [[MapItem alloc] initWithDic:[tempArr objectAtIndex:i]];
            [self.mapItemArr addObject:mapItem];
            CLLocationCoordinate2D coor;
            coor.latitude = [mapItem.longitude floatValue];
            coor.longitude = [mapItem.latitude floatValue];
           //自定义MMAnnotation
            MMAnnotation *annotation = [[MMAnnotation alloc]initWithCoordinate2D:coor];
            annotation.address = mapItem.position;
            annotation.title = mapItem.name;
            annotation.imageUrl = mapItem.pictureUrl;
            annotation.context = mapItem.synopsis;
            //添加annotation到地图
            [self.mapView addAnnotation:annotation];
        }
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];
}

- (void)viewDidLoad {

    [super viewDidLoad];
    self.mapItemArr = [NSMutableArray array];
    [self dataHandle];
       
    //地图设置
    self.mapView = [[BMKMapView alloc]initWithFrame:CGRectMake1(0, 0, 320, 480)];
    self.mapView.delegate = self;
    //缩放比例
    self.mapView.zoomLevel = 15.0;
    //地图中心点坐标
    self.mapView.centerCoordinate = CLLocationCoordinate2DMake(37.569872, 121.260381);
    self.view = self.mapView;
    //切换为普通地图
    [self.mapView setMapType:BMKMapTypeStandard];
   /*
    *   切换为卫星图
    *   [self.mapView setMapType:BMKMapTypeSatellite];
    */
    //实时路况图层   YES开启  NO关闭
    [self.mapView setTrafficEnabled:NO];
}

#pragma mark----------百度地图大头针设置--------------
/*重写- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation代理方法,指定annotation为自定义的类型
*/
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(MMAnnotation *)annotation
{
    int i = 0;
    if ([annotation isKindOfClass:[MMAnnotation class]] == YES) {
        
        BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];
        //自定义的弹出视图
        MMView *mmView = [[MMView alloc] initWithFrame:CGRectMake1(0, 0, 280, 150)];
        //将annotation信息显示在自定义弹出视图上
        mmView.titleLabel.text = annotation.title;
        mmView.contextLabel.text = annotation.context;
        [mmView.imageView sd_setImageWithURL:[NSURL URLWithString:annotation.imageUrl]];
        mmView.addressLabel.text = annotation.address;
        //BaiduMap承载annotation详情的气泡形状视图
        BMKActionPaopaoView *paoView = [[BMKActionPaopaoView alloc] initWithCustomView:mmView];
       //不设置会出现重叠或卡顿
        paoView.backgroundColor = [UIColor whiteColor];
        paoView.frame = CGRectMake1(0, 0, 280, 150);
        newAnnotationView.paopaoView = nil;
        newAnnotationView.paopaoView = paoView;
       //默认annotation的颜色
        newAnnotationView.pinColor = BMKPinAnnotationColorPurple;
       /*
        *自定义annotation显示图片
        * newAnnotationView.image = [UIImage imageNamed:@"annotation.png"]
       */
        newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
        return newAnnotationView;
    }
    i ++;
    return nil;
}                        
/*
 *在MMAnnotation.h里
*/
@interface MMAnnotation : NSObject<BMKAnnotation>

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *imageUrl;
@property (nonatomic, copy) NSString *context;
@property (nonatomic, copy) NSString *address;

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

- (id)initWithCoordinate2D:(CLLocationCoordinate2D)coordinate;

@end

/*
 *在MMAnnotation.m里
*/
@implementation MMAnnotation


- (id)initWithCoordinate2D:(CLLocationCoordinate2D)coordinate {
    self = [super init];
    if (self != nil) {
        _coordinate = coordinate;
    }
    return self;
}

@end
/*
 *在MMView里定义需要的控件
 */
@interface MMView : UIView

@property (nonatomic, strong) UIImageView *imageView;
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *contextLabel;
@property (nonatomic, strong) UILabel *addressLabel;

@end

 

posted @ 2016-01-25 14:43  Colaless  阅读(1619)  评论(0编辑  收藏  举报