浏览器版本低!无法浏览完整内容,建议升级或更换浏览器。


百度导航SDK驾车页采用提供底图,上层UI自定义的方式。在百度导航SDK中提供了一套完整的驾车页demo,开发者可以直接将这部分代码移到项目中使用。开发者如果需要自定义上层UI,也可以参考demo中的DrivePageViewController类实现。

设置底图状态

通过BNMapViewManagerProtocol可以设置底图的中心点、比例尺、中心偏移值等状态。

BNMapViewStatus* mapViewStatus = [BNaviService_MapView getMapViewStatus];
mapViewStatus.level = 15;
mapViewStatus.center.x = 113.949298;
mapViewStatus.center.y = 22.530242;
[BNaviService_MapView setMapViewStatus:mapViewStatus animated:NO];

路径规划

在开始驾车模式前,需要先根据起终点等进行路径规划。 路线规划可以参考 路线规划并发起专业导航

- (void)startNavi
{
    // 节点数组
    NSMutableArray *nodesArray = [[NSMutableArray alloc]initWithCapacity:2];
    
    // 起点
    BNRoutePlanNode *startNode = [[BNRoutePlanNode alloc] init];
    startNode.pos = [[BNPosition alloc] init];
    startNode.pos.x = 113.948222;
    startNode.pos.y = 22.549555;
    startNode.pos.eType = BNCoordinate_BaiduMapSDK;
    [nodesArray addObject:startNode];
    
    // 终点
    BNRoutePlanNode *endNode = [[BNRoutePlanNode alloc] init];
    endNode.pos = [[BNPosition alloc] init];
    endNode.pos.x = 113.940868;
    endNode.pos.y = 22.54647;
    endNode.pos.eType = BNCoordinate_BaiduMapSDK;
    [nodesArray addObject:endNode];
    
    //关闭openURL,不想跳转百度地图可以设为YES
    [BNaviService_RoutePlan setDisableOpenUrl:YES];
    [BNaviService_RoutePlan startNaviRoutePlan:BNRoutePlanMode_Recommend naviNodes:nodesArray time:nil delegete:self userInfo:nil];
}

开启定位

路径规划成功后,在回调函数中通过BNDriveRouteDataKey获取到路线信息,并且需要开启定位,开启定位才能显示车标。

/**
 *  算路成功回调
 *
 *  @param userInfo 用户信息
 */
- (void)routePlanDidFinished:(NSDictionary*)userInfo {
    [self showRouteViewAll];
    [self initMapSubView];
    
    BNCarRouteModel *route = userInfo[BNDriveRouteDataKey];
    if (route) {
        self.carRoute = route;
        [self routeSelectIndex:[BNaviService_RoutePlan GetCurrentSelectRouteIdx] needSelectRoute:NO];
        
        [self resetUIFrame]; // [self resetUIFrame];需要在pageLoadedSuccess前,因为tabPanel中会用到tabPanel的高度
        [self.contentView.tabPanel pageLoadedSuccess:self.carRoute];
        [self.contentView.carDetailContentView refreshData:self.carRoute index:self.selectIndex];
    }
    
    // 算路成功后需要打开定位才能显示车标
    [BNaviService_DriveRoute startUpdateLocation];
}

渲染和移除底图

在驾车页的viewWillAppear和viewWillDisappear方法中渲染和移除底图。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    [BNaviService_DriveRoute viewWillAppear:self.view];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    [BNaviService_DriveRoute viewWillDisAppear:self.view];
}

路线全览

通过调用路线全览的接口进行全览路线,同时可以设置路线的四边边距。

BNMargin margin = {80, 20, self.view.height-self.radarSwitchView.y, 20};
[BNaviService_DriveRoute showRouteViewAll:margin animated:YES];

选择路线

通过设置路线序号来选择路线,同时高亮选择的路线。

[BNaviService_DriveRoute selectRouteAtIndex:selectIndex];

点选地图上的路线回调

在地图上点击了某条路线后会通过onHandleTouchRouteAtIndex函数回调。如果需要高亮该路线,要调用选择路线的接口来进行高亮。

/**
 用户在地图上点击了某条路线(如果需要高亮该路线,要调用selectRouteAtIndex:接口)
 
 @param routeIndex 路线序号(从0开始)
 */
- (void)onHandleTouchRouteAtIndex:(NSUInteger)routeIndex {
    [BNaviService_DriveRoute selectRouteAtIndex:routeIndex];
}

从驾车页进入导航页

从驾车页进入导航页前需要先停止驾车页的定位监听,然后通过发起导航跳转到导航页。

[BNaviService_DriveRoute stopUpdateLocation];
[BNaviService_UI showPage:BNaviUI_NormalNavi delegate:self extParams:nil];

从导航页回到驾车页

从导航页回到驾车页后,需要在退出导航页的回调中将路线全览,并且开启驾车页的定位监听。

- (void)willExitPage:(BNaviUIType)pageType extraInfo:(NSDictionary*)extraInfo {
    [self showRouteViewAll];
    [BNaviService_DriveRoute startUpdateLocation];
    
    [self refreshRouteData];
}

获取当前路线信息

从导航页回到驾车页后路线可能发生变化,可以在退出导航页回到驾车页后获取当前路线信息重新渲染上层UI。获取当前路线信息可能为空,例如已经到达终点时,这时候可以退出驾车页。

- (void)refreshRouteData {
    BNCarRouteModel *route = [BNaviService_DriveRoute getCurrentCarRouteData];
    if (route) {
        self.carRoute = route;
        [self routeSelectIndex:[BNaviService_RoutePlan GetCurrentSelectRouteIdx] needSelectRoute:NO];
        
        [self resetUIFrame]; // [self resetUIFrame];需要在pageLoadedSuccess前,因为tabPanel中会用到tabPanel的高度
        [self.contentView.tabPanel pageLoadedSuccess:self.carRoute];
        [self.contentView.carDetailContentView refreshData:self.carRoute index:self.selectIndex];
    } else { // 没获取到当前路线信息,有可能是已经到达终点,退出驾车页
        [self.navigationController popViewControllerAnimated:YES];
    }
}
  • 文档根本没法用

  • 文档水平很差

  • 文档水平一般

  • 文档不错

  • 文档写的很好

如发现文档错误,或对此文档有更好的建议,请在下方反馈。问题咨询请前往反馈平台提交工单咨询。

提交反馈

拖动标注工具

添加矩形标注

添加箭头标注

完成

取消