您的位置:首页 > 移动开发 > IOS开发

百度地图之基本功能

2016-12-15 12:02 176 查看
//
//  MapViewBaseDemoViewController.m
//  BaiduMapSdkSrc
//
//  Created by BaiduMapAPI on 13-7-24.
//  Copyright (c) 2013年 baidu. All rights reserved.
//

#import "MapViewBaseDemoViewController.h"

@interface MapViewBaseDemoViewController()<UIGestureRecognizerDelegate> {
BOOL enableCustomMap;

}
@end

@implementation MapViewBaseDemoViewController

+ (void)initialize {
//设置自定义地图样式,会影响所有地图实例
//注:必须在BMKMapView对象初始化之前调用
NSString* path = [[NSBundle mainBundle] pathForResource:@"custom_config_清新蓝" ofType:@""];
[BMKMapView customMapStyle:path];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
//适配ios7
if( ([[[UIDevice currentDevice] systemVersion] doubleValue]>=7.0))
{
//        self.edgesForExtendedLayout=UIRectEdgeNone;
self.navigationController.navigationBar.translucent = NO;
}
//添加普通地图/个性化地图切换开关
UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:@[@"normal", @"custom"]];
[segment setSelectedSegmentIndex:0];
[segment addTarget:self action:@selector(changeMapAction:) forControlEvents:UIControlEventValueChanged];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:segment];
enableCustomMap = NO;

[self addCustomGestures];//添加自定义的手势
}

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

-(void)viewWillDisappear:(BOOL)animated {
[BMKMapView enableCustomMapStyle:NO];//关闭个性化地图
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
if (_mapView) {
_mapView = nil;
}
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc. that aren't in use.
}

- (void)changeMapAction:(UISegmentedControl *)segment {
/*
*注:必须在BMKMapView对象初始化之前设置自定义地图样式,设置后会影响所有地图实例
*设置方法:+ (void)customMapStyle:(NSString*) customMapStyleJsonFilePath;
*/
enableCustomMap = segment.selectedSegmentIndex == 1;
//打开/关闭个性化地图
[BMKMapView enableCustomMapStyle:enableCustomMap];
}

#pragma mark - BMKMapViewDelegate

- (void)mapViewDidFinishLoading:(BMKMapView *)mapView {
//    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"BMKMapView控件初始化完成" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles: nil];
//    [alert show];
//    alert = nil;
}

- (void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate {
NSLog(@"map view: click blank");
}

- (void)mapview:(BMKMapView *)mapView onDoubleClick:(CLLocationCoordinate2D)coordinate {
NSLog(@"map view: double click");
}

#pragma mark - 添加自定义的手势(若不自定义手势,不需要下面的代码)

- (void)addCustomGestures {
/*
*注意:
*添加自定义手势时,必须设置UIGestureRecognizer的属性cancelsTouchesInView 和 delaysTouchesEnded 为NO,
*否则影响地图内部的手势处理
*/
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
doubleTap.delegate = self;
doubleTap.numberOfTapsRequired = 2;
doubleTap.cancelsTouchesInView = NO;
doubleTap.delaysTouchesEnded = NO;

[self.view addGestureRecognizer:doubleTap];

/*
*注意:
*添加自定义手势时,必须设置UIGestureRecognizer的属性cancelsTouchesInView 和 delaysTouchesEnded 为NO,
*否则影响地图内部的手势处理
*/
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
singleTap.delegate = self;
singleTap.cancelsTouchesInView = NO;
singleTap.delaysTouchesEnded = NO;
[singleTap requireGestureRecognizerToFail:doubleTap];
[self.view addGestureRecognizer:singleTap];
}

- (void)handleSingleTap:(UITapGestureRecognizer *)theSingleTap {
/*
*do something
*/
NSLog(@"my handleSingleTap");
}

- (void)handleDoubleTap:(UITapGestureRecognizer *)theDoubleTap {
/*
*do something
*/
NSLog(@"my handleDoubleTap");
}

@end

BMKMapViewDelegate

/**
*地图初始化完毕时会调用此接口
*@param mapview 地图View
*/
- (void)mapViewDidFinishLoading:(BMKMapView *)mapView;

/**
*地图渲染每一帧画面过程中,以及每次需要重绘地图时(例如添加覆盖物)都会调用此接口
*@param mapview 地图View
*@param status 此时地图的状态
*/
- (void)mapView:(BMKMapView *)mapView onDrawMapFrame:(BMKMapStatus*)status;

/**
*地图区域即将改变时会调用此接口
*@param mapview 地图View
*@param animated 是否动画
*/
- (void)mapView:(BMKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;

/**
*地图区域改变完成后会调用此接口
*@param mapview 地图View
*@param animated 是否动画
*/
- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;

/**
*根据anntation生成对应的View
*@param mapView 地图View
*@param annotation 指定的标注
*@return 生成的标注View
*/
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation;

/**
*当mapView新添加annotation views时,调用此接口
*@param mapView 地图View
*@param views 新添加的annotation views
*/
- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views;

/**
*当选中一个annotation views时,调用此接口
*@param mapView 地图View
*@param views 选中的annotation views
*/
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view;

/**
*当取消选中一个annotation views时,调用此接口
*@param mapView 地图View
*@param views 取消选中的annotation views
*/
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view;

/**
*拖动annotation view时,若view的状态发生变化,会调用此函数。ios3.2以后支持
*@param mapView 地图View
*@param view annotation view
*@param newState 新状态
*@param oldState 旧状态
*/
- (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newState
fromOldState:(BMKAnnotationViewDragState)oldState;

/**
*当点击annotation view弹出的泡泡时,调用此接口
*@param mapView 地图View
*@param view 泡泡所属的annotation view
*/
- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view;

/**
*根据overlay生成对应的View
*@param mapView 地图View
*@param overlay 指定的overlay
*@return 生成的覆盖物View
*/
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay;

/**
*当mapView新添加overlay views时,调用此接口
*@param mapView 地图View
*@param overlayViews 新添加的overlay views
*/
- (void)mapView:(BMKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews;

/**
*点中覆盖物后会回调此接口,目前只支持点中BMKPolylineView时回调
*@param mapview 地图View
*@param overlayView 覆盖物view信息
*/
- (void)mapView:(BMKMapView *)mapView onClickedBMKOverlayView:(BMKOverlayView *)overlayView;

/**
*点中底图标注后会回调此接口
*@param mapview 地图View
*@param mapPoi 标注点信息
*/
- (void)mapView:(BMKMapView *)mapView onClickedMapPoi:(BMKMapPoi*)mapPoi;

/**
*点中底图空白处会回调此接口
*@param mapview 地图View
*@param coordinate 空白处坐标点的经纬度
*/
- (void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate;

/**
*双击地图时会回调此接口
*@param mapview 地图View
*@param coordinate 返回双击处坐标点的经纬度
*/
- (void)mapview:(BMKMapView *)mapView onDoubleClick:(CLLocationCoordinate2D)coordinate;

/**
*长按地图时会回调此接口
*@param mapview 地图View
*@param coordinate 返回长按事件坐标点的经纬度
*/
- (void)mapview:(BMKMapView *)mapView onLongClick:(CLLocationCoordinate2D)coordinate;

/**
*3DTouch 按地图时会回调此接口(仅在支持3D Touch,且fouchTouchEnabled属性为YES时,会回调此接口)
*@param mapview 地图View
*@param coordinate 触摸点的经纬度
*@param force 触摸该点的力度(参考UITouch的force属性)
*@param maximumPossibleForce 当前输入机制下的最大可能力度(参考UITouch的maximumPossibleForce属性)
*/
- (void)mapview:(BMKMapView *)mapView onForceTouch:(CLLocationCoordinate2D)coordinate force:(CGFloat)force maximumPossibleForce:(CGFloat)maximumPossibleForce;

/**
*地图状态改变完成后会调用此接口
*@param mapview 地图View
*/
- (void)mapStatusDidChanged:(BMKMapView *)mapView;

/**
*地图进入/移出室内图会调用此接口
*@param mapview 地图View
*@param flag  YES:进入室内图; NO:移出室内图
*@param info 室内图信息
*/
- (void)mapview:(BMKMapView *)mapView baseIndoorMapWithIn:(BOOL)flag baseIndoorMapInfo:(BMKBaseIndoorMapInfo *)info;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  百度地图 ios