#import <UIKit/UIKit.h>
@interface MapViewController : UIViewController
@property(nonatomic,strong)NSString *addressName; // 用于接收地址字符串的属性
#import <MapKit/MapKit.h>
#import "LocationHandle.h"
@interface MapViewController ()<MKMapViewDelegate>
@property(nonatomic,strong)MKMapView *mapView; // 地图视图
@end
@implementation MapViewController
-(MKMapView *)mapView
{
if (!_mapView) {
_mapView = [[MKMapView alloc] initWithFrame:self.view.frame];
_mapView.delegate = self;
_mapView.zoomEnabled = YES;
_mapView.scrollEnabled = YES;
_mapView.pitchEnabled = YES;
_mapView.rotateEnabled = YES;
/*
typedef NS_ENUM(NSUInteger, MKMapType) {
MKMapTypeStandard = 0,
MKMapTypeSatellite,
MKMapTypeHybrid,
MKMapTypeSatelliteFlyover NS_ENUM_AVAILABLE(10_11, 9_0),
MKMapTypeHybridFlyover NS_ENUM_AVAILABLE(10_11, 9_0),
}
*/
_mapView.mapType = MKMapTypeStandard; // 综合地图
// [_mapView setUserTrackingMode:MKUserTrackingModeFollow]; // 设置用户跟踪模式
// _mapView.showsUserLocation = YES; // 显示用户当前位置
}
return _mapView;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.view addSubview:self.mapView];
UIBarButtonItem *bar1 = [[UIBarButtonItem alloc] initWithTitle:@"省会位置" style:UIBarButtonItemStylePlain target:self action:@selector(locateProvince:)];
UIBarButtonItem *bar2 = [[UIBarButtonItem alloc] initWithTitle:@"当前位置" style:UIBarButtonItemStylePlain target:self action:@selector(locateCurrentLocation:)];
self.navigationItem.rightBarButtonItems = @[bar1,bar2];
// 注册通知,监听当前位置获取
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getCurrentLocationByNotification:) name:@"passLoc" object:nil];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.navigationItem.title = self.addressName;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - 自定义触发方法
// 定位省会位置
-(void)locateProvince:(id)sender
{
// 获取字符串代表的经纬度
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:self.addressName completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *place = [placemarks lastObject];
CLLocation *loc = place.location;
dispatch_async(dispatch_get_main_queue(), ^{
[self.mapView setRegion:MKCoordinateRegionMake(loc.coordinate, MKCoordinateSpanMake(0.1, 0.1)) animated:YES];
/*
添加覆盖层方法与添加锚点方法相似,但是覆盖层没有定义好的视图,必须实现mapView中设置覆盖层视图的回调方法;
*/
// 定义圆形覆盖层
MKCircle *circle = [MKCircle circleWithCenterCoordinate:loc.coordinate radius:100];
// 添加圆形覆盖层
[self.mapView addOverlay:circle];
});
}];
}
// 定位当前位置
-(void)locateCurrentLocation:(id)sender
{
[[LocationHandle sharedLocationControl] getCurrentLocation];
}
#pragma mark - 当前位置获取
-(void)getCurrentLocationByNotification:(NSNotification *)notifi
{
// 获取当前位置
CLLocation *curLoc = [notifi object];
// 设置显示区域
MKCoordinateRegion region = MKCoordinateRegionMake(curLoc.coordinate, MKCoordinateSpanMake(0.1, 0.1));
// 改变地图的显示范围
[self.mapView setRegion:region animated:YES];
#if 1
// 在当前位置添加一个锚点
MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
// 设置显示位置
point.coordinate = curLoc.coordinate;
// 设置主标题
point.title = [NSString stringWithFormat:@"纬度:%g,经度:%g",curLoc.coordinate.latitude,curLoc.coordinate.longitude];
// 反向地址解析,得到经纬度代表的地址字符串
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation:curLoc completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *curPlace = [placemarks lastObject];
NSString *address = curPlace.name;
dispatch_async(dispatch_get_main_queue(), ^{
// 设置锚点副标题
point.subtitle = address;
// 将锚点添加到地图上
[self.mapView addAnnotation:point];
});
}];
#else
/*
添加覆盖层方法与添加锚点方法相似,但是覆盖层没有定义好的视图,必须实现mapView中设置覆盖层视图的回调方法;
*/
// 定义圆形覆盖层
MKCircle *circle = [MKCircle circleWithCenterCoordinate:curLoc.coordinate radius:600];
// 添加圆形覆盖层
[self.mapView addOverlay:circle];
#endif
}
#pragma mark - MKMapViewDelegate
// 设置锚点视图样式,(在MKMapView对象调用addAnnotation方法时回调此方法)
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
#if 0
static NSString *identifier = @"pin";
// 使用大头针锚点
MKPinAnnotationView *pin = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
//
if (pin == nil) {
pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
}
// 设置大头针颜色
[pin setPinColor:MKPinAnnotationColorPurple];
// 设置大头针掉落的动画效果
pin.animatesDrop = YES;
// 设置可以弹出气泡
pin.canShowCallout = YES;
// 设置气泡左选项
UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
[btn setFrame:CGRectMake(0, 0, 20, 20)];
[btn addTarget:self action:@selector(btnDidhandle:) forControlEvents:UIControlEventTouchUpInside];
pin.leftCalloutAccessoryView = btn;
return pin;
#else
static NSString *identifier = @"custom";
MKAnnotationView *annoView = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annoView == nil) {
annoView = [[MKAnnotationView alloc] init];
}
// 设置可以弹出气泡
annoView.canShowCallout = YES;
// 设置气泡右侧附件视图
UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[btn setFrame:CGRectMake(0, 0, 20, 20)];
[btn addTarget:self action:@selector(btnDidhandle:) forControlEvents:UIControlEventTouchUpInside];
annoView.rightCalloutAccessoryView = btn;
// 设置自定义的图片
annoView.image = [UIImage imageNamed:@"location"];
return annoView;
#endif
}
// 设置覆盖层样式的回调方法
-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
MKCircle *circle = (MKCircle *)overlay;
// 设置圆形覆盖层视图
MKCircleRenderer *circleView = [[MKCircleRenderer alloc] initWithCircle:circle];
// 设置填充颜色
circleView.fillColor = [UIColor redColor];
// 设置描边颜色
circleView.strokeColor = [UIColor yellowColor];
return circleView;
}
-(void)btnDidhandle:(id)sender
{
NSLog(@"盛大的撒旦撒旦撒旦是");
}