当前位置: 移动技术网 > 移动技术>移动开发>IOS > IOS实现百度地图自定义大头针和气泡样式

IOS实现百度地图自定义大头针和气泡样式

2019年07月24日  | 移动技术网移动技术  | 我要评论

一、自定义大头针和气泡

// 根据anntation生成对应的view 
- (bmkannotationview *)mapview:(bmkmapview *)mapview viewforannotation:(id <bmkannotation>)annotation 
{ 
 nsstring *annotationviewid = [nsstring stringwithformat:@"renamemark%d",i]; 
 newannotation = [[bmkpinannotationview alloc] initwithannotation:annotation reuseidentifier:annotationviewid]; 
 // 设置颜色 
 ((bmkpinannotationview*)newannotation).pincolor = bmkpinannotationcolorpurple; 
 // 从天上掉下效果 
 ((bmkpinannotationview*)newannotation).animatesdrop = yes; 
 // 设置可拖拽 
 ((bmkpinannotationview*)newannotation).draggable = yes; 
 //设置大头针图标 
 ((bmkpinannotationview*)newannotation).image = [uiimage imagenamed:@"zhaohuoche"]; 
 uiview *popview = [[uiview alloc]initwithframe:cgrectmake(0, 0, 100, 60)]; 
 //设置弹出气泡图片 
 uiimageview *image = [[uiimageview alloc]initwithimage:[uiimage imagenamed:@"wenzi"]]; 
 image.frame = cgrectmake(0, 0, 100, 60); 
 [popview addsubview:image]; 
 //自定义显示的内容 
 uilabel *drivername = [[uilabel alloc]initwithframe:cgrectmake(0, 3, 100, 20)]; 
 drivername.text = @"张xx师傅"; 
 drivername.backgroundcolor = [uicolor clearcolor]; 
 drivername.font = [uifont systemfontofsize:14]; 
 drivername.textcolor = [uicolor whitecolor]; 
 drivername.textalignment = nstextalignmentcenter; 
 [popview addsubview:drivername]; 
 uilabel *carname = [[uilabel alloc]initwithframe:cgrectmake(0, 25, 100, 20)]; 
 carname.text = @"京a123456"; 
 carname.backgroundcolor = [uicolor clearcolor]; 
 carname.font = [uifont systemfontofsize:14]; 
 carname.textcolor = [uicolor whitecolor]; 
 carname.textalignment = nstextalignmentcenter; 
 [popview addsubview:carname]; 
 bmkactionpaopaoview *pview = [[bmkactionpaopaoview alloc]initwithcustomview:popview]; 
 pview.frame = cgrectmake(0, 0, 100, 60); 
 ((bmkpinannotationview*)newannotation).paopaoview = nil; 
 ((bmkpinannotationview*)newannotation).paopaoview = pview; 
 i++; 
 return newannotation; 
} 

二、气泡自定义内容

 

 最简单,最直接的方法。。。

自定义一个 uiview

核心代码如下:

//改变标注图片和自定义气泡
-(bmkannotationview *)mapview:(bmkmapview *)mapview viewforannotation:(id<bmkannotation>)annotation
{
 bmkannotationview *annotationview=[[bmkannotationviewalloc]initwithannotation:annotationreuseidentifier:@"myannotation"];
 annotationview.image =[uiimageimagenamed:@"bike.gif"];
 //自定义内容气泡
 uiview *areapaoview=[[uiviewalloc]initwithframe:cgrectmake(0, 0, 200, 100)];
 areapaoview.layer.cornerradius=8;
 areapaoview.layer.maskstobounds=yes;
 areapaoview.layer.contents =(id)[uiimageimagenamed:@"pao.png"].cgimage;//这张图片是做好的透明
 //areapaoview.backgroundcolor=[uicolor whitecolor];
  if ([annotation.titleisequaltostring:@"1"]) { //假设title的标题为1,那么就把添加上这个自定义气泡内容
      uilabel * labelno = [[uilabelalloc]initwithframe:cgrectmake(10, 0, 200, 30)];
   labelno.text =[nsstringstringwithformat:@"站点编号:%@"];
   labelno.textcolor = [uicolorblackcolor];
   labelno.backgroundcolor = [uicolorclearcolor];
   [areapaoviewaddsubview:labelno];
   uilabel * labelstationname = [[uilabelalloc]initwithframe:cgrectmake(10, 20, 200, 30)];
   labelstationname.text = [nsstringstringwithformat:@"站点名称:昆山中学"];
   labelstationname.textcolor = [uicolorblackcolor];
   labelstationname.backgroundcolor = [uicolorclearcolor];
   [areapaoviewaddsubview:labelstationname];
   uilabel * labelsumnum = [[uilabelalloc]initwithframe:cgrectmake(10, 40, 200, 30)];
   labelsumnum.text = [nsstringstringwithformat:@"总桩数:30"];
   labelsumnum.textcolor = [uicolorblackcolor];
   labelsumnum.backgroundcolor = [uicolorclearcolor];
   [areapaoviewaddsubview:labelsumnum];
   uilabel * labelbicyclenum = [[uilabelalloc]initwithframe:cgrectmake(10, 60, 200, 30)];
   labelbicyclenum.text = [nsstringstringwithformat:@"可借车:20"];
   labelbicyclenum.textcolor = [uicolorblackcolor];
   labelbicyclenum.backgroundcolor = [uicolorclearcolor];
   [areapaoviewaddsubview:labelbicyclenum];
 } 
 bmkactionpaopaoview *paopao=[[bmkactionpaopaoviewalloc]initwithcustomview:areapaoview];
 annotationview.paopaoview=paopao;
 return annotationview;
}

三、添加标注自定义气泡

1.首先实现添加多个标注和自定义气泡

添加自定义标注

[_mapview addannotations:array];

arry 中放入标注(bmkpointannotation)的数组,此方法添加多个标注。

当添加多个标注时就触发以下代理方法

#pragma mark -- bmkmapdelegate
/**
 *根据anntation生成对应的view
 *@param mapview 地图view
 *@param annotation 指定的标注
 *@return 生成的标注view
 */
-(bmkannotationview *)mapview:(bmkmapview *)mapview viewforannotation:(id <bmkannotation>)annotation
{
 if ([annotation iskindofclass:[bmkpointannotation class]]) {
  bmkpinannotationview *newannotationview = [[bmkpinannotationview alloc]initwithannotation:annotation reuseidentifier:@"myannotation"];
  newannotationview.animatesdrop = yes;
  newannotationview.annotation = annotation;
  //这里我根据自己需要,继承了bmkpointannotation,添加了标注的类型等需要的信息
  mybmkpointannotation *tt = (mybmkpointannotation *)annotation;
  //判断类别,需要添加不同类别,来赋予不同的标注图片
  if (tt.profnumber == 100000) {
   newannotationview.image = [uiimage imagenamed:@"ic_map_mode_category_merchants_normal.png"];
  }else if (tt.profnumber == 100001){
  }
  //设定popview的高度,根据是否含有缩略图
  double popviewh = 60;
  if (annotation.subtitle == nil) {
   popviewh = 38;
  }
  uiview *popview = [[uiview alloc]initwithframe:cgrectmake(0, 0, screenwidth-100, popviewh)];
  popview.backgroundcolor = [uicolor whitecolor];
  [popview.layer setmaskstobounds:yes];
  [popview.layer setcornerradius:3.0];
  popview.alpha = 0.9;
//  //设置弹出气泡图片
//  uiimageview *image = [[uiimageview alloc]initwithimage:[uiimage imagenamed:tt.imgpath]];
//  image.frame = cgrectmake(0, 160, 50, 60);
//  [popview addsubview:image];
  //自定义气泡的内容,添加子控件在popview上
  uilabel *drivername = [[uilabel alloc]initwithframe:cgrectmake(8, 4, 160, 30)];
  drivername.text = annotation.title;
  drivername.numberoflines = 0;
  drivername.backgroundcolor = [uicolor clearcolor];
  drivername.font = [uifont systemfontofsize:15];
  drivername.textcolor = [uicolor blackcolor];
  drivername.textalignment = nstextalignmentleft;
  [popview addsubview:drivername];
  uilabel *carname = [[uilabel alloc]initwithframe:cgrectmake(8, 30, 180, 30)];
  carname.text = annotation.subtitle;
  carname.backgroundcolor = [uicolor clearcolor];
  carname.font = [uifont systemfontofsize:11];
  carname.textcolor = [uicolor lightgraycolor];
  carname.textalignment = nstextalignmentleft;
  [popview addsubview:carname];
  if (annotation.subtitle != nil) {
  uibutton *searchbn = [[uibutton alloc]initwithframe:cgrectmake(170, 0, 50, 60)];
  [searchbn settitle:@"查看路线" forstate:uicontrolstatenormal];
  searchbn.backgroundcolor = maincolor;
   searchbn.titlelabel.numberoflines = 0;
  [searchbn addtarget:self action:@selector(searchline)];
  [popview addsubview:searchbn];
  }
  bmkactionpaopaoview *pview = [[bmkactionpaopaoview alloc]initwithcustomview:popview];
  pview.frame = cgrectmake(0, 0, screenwidth-100, popviewh);
  ((bmkpinannotationview*)newannotationview).paopaoview = nil;
  ((bmkpinannotationview*)newannotationview).paopaoview = pview;
  return newannotationview;
 }
 return nil;
}

点击标注和气泡响应方法

/**
 * 当选中一个annotation views时,调用此接口
 * @param mapview 地图view
 * @param views 选中的annotation views
 */
- (void)mapview:(bmkmapview *)mapview didselectannotationview:(bmkannotationview *)view
{
 _shopcoor = view.annotation.coordinate;
}
/**
 * 选中气泡调用方法
 * @param mapview 地图
 * @param view annotation
 */
- (void)mapview:(bmkmapview *)mapview annotationviewforbubble:(bmkannotationview *)view
{
 mybmkpointannotation *tt = (mybmkpointannotation *)view.annotation;
 if (tt.shopid) {
  businessifonuvc *businessifonvc = [[businessifonuvc alloc]init];
  businessifonvc.shopid = tt.shopid;
  [self.navigationcontroller pushviewcontroller:businessifonvc animated:yes];
 }
}

2.实现路线搜索,路径规划,获取街道名称等功能

通过经纬度获取地址,逆地理编码

-(void)getstartaddress
{
 //起点地址
 clgeocoder *geocoder = [[clgeocoder alloc]init];
 clgeocodecompletionhandler handler = ^(nsarray *place,nserror *error){
  for(clplacemark *placemark in place){
   nsstring *tmp = [[nsstring alloc]init];
   tmp = placemark.subthoroughfare;
   if (tmp == nil) {
    tmp = @"";
   }
   nsstring *startadr = [[nsstring alloc]initwithformat:@"%@%@",placemark.thoroughfare,tmp];
   _startcitytext.text = placemark.locality;
   if ([startadr isequaltostring:@"(null)"]) {
    _startaddrtext.text = @"获取地址失败";
   }else{
   _startaddrtext.text = startadr;
   }
 }
 };
 cllocation *loc = [[cllocation alloc]initwithlatitude:self.startcoor.latitude longitude:self.startcoor.longitude];
 [geocoder reversegeocodelocation:loc completionhandler:handler];
}

路径检索,该部分没有整理,将乘车和换乘信息放到了lineinfo,steps等模型中。

- (void)ongettransitrouteresult:(bmkroutesearch*)searcher result:(bmktransitrouteresult*)result errorcode:(bmksearcherrorcode)error
{
 nsmutablearray *linearr = [[nsmutablearray alloc]init];
 nsarray* array = [nsarray arraywitharray:_mapview.annotations];
 [_mapview removeannotations:array];
 array = [nsarray arraywitharray:_mapview.overlays];
 [_mapview removeoverlays:array];
 if (error == bmk_search_no_error) {
  for(int j = 0; j < [result.routes count];j++)
  {
  nsmutablearray *bustitlearr = [[nsmutablearray alloc]init];
  nsmutablearray *linestepsarr = [[nsmutablearray alloc]init];
  nsmutablearray *stepsarr = [[nsmutablearray alloc]init];
 //生成数据模型
  lineinfomodel *lineinfo = [[lineinfomodel alloc]init];
  bmktransitrouteline* plan = (bmktransitrouteline*)[result.routes objectatindex:j];
 //数据模型:获得路线长度
  lineinfo.distance = plan.distance;
 //数据模型:获得路线消耗时间
  lineinfo.dates = plan.duration.dates;
  lineinfo.hours = plan.duration.hours;
  lineinfo.minutes = plan.duration.minutes;
  lineinfo.seconds = plan.duration.seconds;
 // 获得轨迹点
  lineinfo.planstepsarr = plan.steps;
  // 计算路线方案中的路段数目
  int size = [plan.steps count];
  int planpointcounts = 0;
  for (int i = 0; i < size; i++) {
   bmktransitstep* transitstep = [plan.steps objectatindex:i];
 //数据模型:获得乘坐公交数组
   dlog(@"%@",transitstep.vehicleinfo.title);
   if (transitstep.vehicleinfo.title) {
    [bustitlearr addobject:transitstep.vehicleinfo.title];
   }
 //数据模型:获取换乘信息
   if (transitstep.instruction) {
    transitstep.instruction = [transitstep.instruction stringbyreplacingoccurrencesofstring:@"<font color=\"#313233\">" withstring:@""];
    [linestepsarr addobject:transitstep.instruction];
   }
   dlog(@"%@ %@",transitstep.vehicleinfo.title,transitstep.instruction);
   if(i==0){
    routeannotation* item = [[routeannotation alloc]init];
    item.coordinate = plan.starting.location;
    item.title = @"起点";
    item.type = 0;
//    [_mapview addannotation:item]; // 添加起点标注
//  
//
    [stepsarr addobject:item];
   }else if(i==size-1){
    routeannotation* item = [[routeannotation alloc]init];
    item.coordinate = plan.terminal.location;
    item.title = @"终点";
    item.type = 1;
    [stepsarr addobject:item];
//    [_mapview addannotation:item]; // 添加起点标注
//   
   }
   routeannotation* item = [[routeannotation alloc]init];
   item.coordinate = transitstep.entrace.location;
   item.title = transitstep.instruction;
   transitstep.instruction = [transitstep.instruction stringbyreplacingoccurrencesofstring:@"<font color=\"#313233\">" withstring:@""];
   item.type = 3;
   [stepsarr addobject:item];
//   [_mapview addannotation:item];
// 
//   
//   //轨迹点总数累计
   planpointcounts += transitstep.pointscount;
  }
  lineinfo.vehicleinfoarr = bustitlearr;
  lineinfo.linestepsarr = linestepsarr;
  lineinfo.stepsarr = stepsarr;
  lineinfo.planpointcounts = planpointcounts;
  [linearr addobject:lineinfo];
//  //轨迹点
//  bmkmappoint * temppoints = new bmkmappoint[planpointcounts];
//  int i = 0;
//  for (int j = 0; j < size; j++) {
//   bmktransitstep* transitstep = [plan.steps objectatindex:j];
//   int k=0;
//   for(k=0;k<transitstep.pointscount;k++) {
//    temppoints[i].x = transitstep.points[k].x;
//    temppoints[i].y = transitstep.points[k].y;
//    i++;
//   }
  }
  self.linestatusarr = linearr;
  // 通过points构建bmkpolyline
//  bmkpolyline* polyline = [bmkpolyline polylinewithpoints:temppoints count:planpointcounts];
//  [_mapview addoverlay:polyline]; // 添加路线overlay
//  delete []temppoints;
//  }
  [_tableview reloaddata];
 }
}
- (void)ongetdrivingrouteresult:(bmkroutesearch*)searcher result:(bmkdrivingrouteresult*)result errorcode:(bmksearcherrorcode)error
{
 nsarray* array = [nsarray arraywitharray:_mapview.annotations];
 [_mapview removeannotations:array];
 array = [nsarray arraywitharray:_mapview.overlays];
 [_mapview removeoverlays:array];
 if (error == bmk_search_no_error) {
  bmkdrivingrouteline* plan = (bmkdrivingrouteline*)[result.routes objectatindex:0];
  // 计算路线方案中的路段数目
  int size = [plan.steps count];
  int planpointcounts = 0;
  for (int i = 0; i < size; i++) {
   bmkdrivingstep* transitstep = [plan.steps objectatindex:i];
   if(i==0){
    routeannotation* item = [[routeannotation alloc]init];
    item.coordinate = plan.starting.location;
    item.title = @"起点";
    item.type = 0;
    [_mapview addannotation:item]; // 添加起点标注
   }else if(i==size-1){
    routeannotation* item = [[routeannotation alloc]init];
    item.coordinate = plan.terminal.location;
    item.title = @"终点";
    item.type = 1;
    [_mapview addannotation:item]; // 添加起点标注
   }
   //添加annotation节点
   routeannotation* item = [[routeannotation alloc]init];
   item.coordinate = transitstep.entrace.location;
   item.title = transitstep.entraceinstruction;
   item.degree = transitstep.direction * 30;
   item.type = 4;
   [_mapview addannotation:item];
   //轨迹点总数累计
   planpointcounts += transitstep.pointscount;
  }
  // 添加途经点
  if (plan.waypoints) {
   for (bmkplannode* tempnode in plan.waypoints) {
    routeannotation* item = [[routeannotation alloc]init];
    item = [[routeannotation alloc]init];
    item.coordinate = tempnode.pt;
    item.type = 5;
    item.title = tempnode.name;
    [_mapview addannotation:item];
   }
  }
  //轨迹点
  bmkmappoint * temppoints = new bmkmappoint[planpointcounts];
  int i = 0;
  for (int j = 0; j < size; j++) {
   bmkdrivingstep* transitstep = [plan.steps objectatindex:j];
   int k=0;
   for(k=0;k<transitstep.pointscount;k++) {
    temppoints[i].x = transitstep.points[k].x;
    temppoints[i].y = transitstep.points[k].y;
    i++;
   }
  }
  // 通过points构建bmkpolyline
  bmkpolyline* polyline = [bmkpolyline polylinewithpoints:temppoints count:planpointcounts];
  [_mapview addoverlay:polyline]; // 添加路线overlay
  delete []temppoints;
 }
}
- (void)ongetwalkingrouteresult:(bmkroutesearch*)searcher result:(bmkwalkingrouteresult*)result errorcode:(bmksearcherrorcode)error
{
 nsarray* array = [nsarray arraywitharray:_mapview.annotations];
 [_mapview removeannotations:array];
 array = [nsarray arraywitharray:_mapview.overlays];
 [_mapview removeoverlays:array];
 if (error == bmk_search_no_error) {
  bmkwalkingrouteline* plan = (bmkwalkingrouteline*)[result.routes objectatindex:0];
  int size = [plan.steps count];
  int planpointcounts = 0;
  for (int i = 0; i < size; i++) {
   bmkwalkingstep* transitstep = [plan.steps objectatindex:i];
   if(i==0){
    routeannotation* item = [[routeannotation alloc]init];
    item.coordinate = plan.starting.location;
    item.title = @"起点";
    item.type = 0;
    [_mapview addannotation:item]; // 添加起点标注
   }else if(i==size-1){
    routeannotation* item = [[routeannotation alloc]init];
    item.coordinate = plan.terminal.location;
    item.title = @"终点";
    item.type = 1;
    [_mapview addannotation:item]; // 添加起点标注
   }
   //添加annotation节点
   routeannotation* item = [[routeannotation alloc]init];
   item.coordinate = transitstep.entrace.location;
   item.title = transitstep.entraceinstruction;
   item.degree = transitstep.direction * 30;
   item.type = 4;
   [_mapview addannotation:item];
   //轨迹点总数累计
   planpointcounts += transitstep.pointscount;
  }
  //轨迹点
  bmkmappoint * temppoints = new bmkmappoint[planpointcounts];
  int i = 0;
  for (int j = 0; j < size; j++) {
   bmkwalkingstep* transitstep = [plan.steps objectatindex:j];
   int k=0;
   for(k=0;k<transitstep.pointscount;k++) {
    temppoints[i].x = transitstep.points[k].x;
    temppoints[i].y = transitstep.points[k].y;
    i++;
   }
  }
  // 通过points构建bmkpolyline
  bmkpolyline* polyline = [bmkpolyline polylinewithpoints:temppoints count:planpointcounts];
  [_mapview addoverlay:polyline]; // 添加路线overlay
  delete []temppoints;
 }
}

3.画路径

我这里实现是跳转到另一个控制器中了,下面是他一些需要的数据

//路线长度
@property (nonatomic,assign) int distance;
//路线消耗时间
@property (nonatomic,assign) int dates;
@property (nonatomic,assign) int hours;
@property (nonatomic,assign) int minutes;
@property (nonatomic,assign) int seconds;
//交通工具数组
@property (nonatomic,strong) nsarray *vehicleinfoarr;
//换乘信息
@property (nonatomic,strong) nsarray *linestepsarr;
//节点
@property (nonatomic,strong) nsarray *stepsarr;
//轨迹点个数
@property (nonatomic,assign) int planpointcounts;
//轨迹点
@property (nonatomic,strong) nsarray *planstepsarr;

接下来是画路经,关于乘车数据的展示,就是一个tableview上添加了手势,不做解释。

-(void)drawmap
{
 bmkpointannotation* item = [[bmkpointannotation alloc]init];
 item = [_lineinfo.stepsarr firstobject];
 [_mapview setcentercoordinate:item.coordinate];
 [_mapview addannotations:_lineinfo.stepsarr];
 bmkmappoint* temppoints = (bmkmappoint *)malloc(sizeof(cllocationcoordinate2d) * _lineinfo.planpointcounts);
 int i = 0;
 for (int j = 0; j < [_lineinfo.planstepsarr count]; j++) {
   bmktransitstep* transitstep = [_lineinfo.planstepsarr objectatindex:j];
   int k=0;
   for(k=0;k<transitstep.pointscount;k++) {
    temppoints[i].x = transitstep.points[k].x;
    temppoints[i].y = transitstep.points[k].y;
    i++;
  }
 }
 bmkpolyline* polyline =[bmkpolyline polylinewithpoints:temppoints count:_lineinfo.planpointcounts];
 if (nil != polyline) {
   [_mapview addoverlay:polyline]; // 添加路线overlay
 }
 free(temppoints);
}
- (bmkoverlayview*)mapview:(bmkmapview *)map viewforoverlay:(id<bmkoverlay>)overlay
{
 if ([overlay iskindofclass:[bmkpolyline class]]) {
  bmkpolylineview* polylineview = [[bmkpolylineview alloc] initwithoverlay:overlay];
  polylineview.fillcolor = [[uicolor cyancolor] colorwithalphacomponent:1];
  polylineview.strokecolor = [[uicolor bluecolor] colorwithalphacomponent:0.7];
  polylineview.linewidth = 3.0;
  return polylineview;
 }
 return nil;
}
// 判断标注类型,来处理
- (bmkannotationview*)getrouteannotationview:(bmkmapview *)mapview viewforannotation:(mybmkpointannotation*)routeannotation
{
 bmkannotationview* view = nil;
 switch (routeannotation.type) {
  case 0:
  {
   view = [mapview dequeuereusableannotationviewwithidentifier:@"start_node"];
   if (view == nil) {
    view = [[bmkannotationview alloc]initwithannotation:routeannotation reuseidentifier:@"start_node"];
    view.image = [uiimage imagewithcontentsoffile:[self getmybundlepath1:@"images/icon_nav_start.png"]];
    view.centeroffset = cgpointmake(0, -(view.frame.size.height * 0.5));
    view.canshowcallout = true;
   }
   view.annotation = routeannotation;
  }
   break;
  case 1:
  {
   view = [mapview dequeuereusableannotationviewwithidentifier:@"end_node"];
   if (view == nil) {
    view = [[bmkannotationview alloc]initwithannotation:routeannotation reuseidentifier:@"end_node"];
    view.image = [uiimage imagewithcontentsoffile:[self getmybundlepath1:@"images/icon_nav_end.png"]];
    view.centeroffset = cgpointmake(0, -(view.frame.size.height * 0.5));
    view.canshowcallout = true;
   }
   view.annotation = routeannotation;
  }
   break;
  case 2:
  {
   view = [mapview dequeuereusableannotationviewwithidentifier:@"bus_node"];
   if (view == nil) {
    view = [[bmkannotationview alloc]initwithannotation:routeannotation reuseidentifier:@"bus_node"];
    view.image = [uiimage imagewithcontentsoffile:[self getmybundlepath1:@"images/icon_nav_bus.png"]];
    view.canshowcallout = true;
   }
   view.annotation = routeannotation;
  }
   break;
  case 3:
  {
   view = [mapview dequeuereusableannotationviewwithidentifier:@"rail_node"];
   if (view == nil) {
    view = [[bmkannotationview alloc]initwithannotation:routeannotation reuseidentifier:@"rail_node"];
    view.image = [uiimage imagewithcontentsoffile:[self getmybundlepath1:@"images/icon_nav_rail.png"]];
    view.canshowcallout = true;
   }
   view.annotation = routeannotation;
  }
   break;
  case 4:
  {
   view = [mapview dequeuereusableannotationviewwithidentifier:@"route_node"];
   if (view == nil) {
    view = [[bmkannotationview alloc]initwithannotation:routeannotation reuseidentifier:@"route_node"];
    view.canshowcallout = true;
   } else {
    [view setneedsdisplay];
   }
   uiimage* image = [uiimage imagewithcontentsoffile:[self getmybundlepath1:@"images/icon_direction.png"]];
   view.image = [image imagerotatedbydegrees:routeannotation.degree];
   view.annotation = routeannotation;
  }
   break;
  case 5:
  {
   view = [mapview dequeuereusableannotationviewwithidentifier:@"waypoint_node"];
   if (view == nil) {
    view = [[bmkannotationview alloc]initwithannotation:routeannotation reuseidentifier:@"waypoint_node"];
    view.canshowcallout = true;
   } else {
    [view setneedsdisplay];
   }
   uiimage* image = [uiimage imagewithcontentsoffile:[self getmybundlepath1:@"images/icon_nav_waypoint.png"]];
   view.image = [image imagerotatedbydegrees:routeannotation.degree];
   view.annotation = routeannotation;
  }
   break;
  default:
   break;
 }
 return view;
}
- (bmkannotationview *)mapview:(bmkmapview *)view viewforannotation:(id <bmkannotation>)annotation
{
 if ([annotation iskindofclass:[bmkpointannotation class]]) {
  return [self getrouteannotationview:view viewforannotation:(mybmkpointannotation *)annotation];
 }
 return nil;
}
- (uiimage*)imagerotatedbydegrees:(cgfloat)degrees
{
 cgfloat width = cgimagegetwidth(self.cgimage);
 cgfloat height = cgimagegetheight(self.cgimage);
 cgsize rotatedsize;
 rotatedsize.width = width;
 rotatedsize.height = height;
 uigraphicsbeginimagecontext(rotatedsize);
 cgcontextref bitmap = uigraphicsgetcurrentcontext();
 cgcontexttranslatectm(bitmap, rotatedsize.width/2, rotatedsize.height/2);
 cgcontextrotatectm(bitmap, degrees * m_pi / 180);
 cgcontextrotatectm(bitmap, m_pi);
 cgcontextscalectm(bitmap, -1.0, 1.0);
 cgcontextdrawimage(bitmap, cgrectmake(-rotatedsize.width/2, -rotatedsize.height/2, rotatedsize.width, rotatedsize.height), self.cgimage);
 uiimage* newimage = uigraphicsgetimagefromcurrentimagecontext();
 uigraphicsendimagecontext();
 return newimage;
}

四、另一种方法

/////////////////////////////// 
if ([annotation iskindofclass:[siteannotation class]]) { 
   static nsstring *identifier = @"mkannotationview"; 
   bmkannotationview *pin = [mapview dequeuereusableannotationviewwithidentifier:identifier]; 
   if (pin == nil) { 
    pin = [[bmkannotationview alloc] initwithannotation:annotation reuseidentifier:identifier]; 
    //在图中我们可以看到图标的上方,有个气泡弹窗里面写着当前用户的位置所在地 
    pin.image = [uiimage imagenamed:@"default_marker.png"]; 
   } 
   pin.annotation = annotation; 
   pin.paopaoview = [[bmkactionpaopaoview alloc]initwithcustomview:[[uiview alloc] init]]; 
   return pin; 
  } 

以上所述是小编给大家介绍的ios实现百度地图自定义大头针和气泡样式,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网