179 lines
6.1 KiB
Objective-C
179 lines
6.1 KiB
Objective-C
//
|
||
// NTESLocationViewController.m
|
||
// NIM
|
||
//
|
||
// Created by chris on 15/2/28.
|
||
// Copyright (c) 2015年 Netease. All rights reserved.
|
||
//
|
||
#import "NTESLocationViewController.h"
|
||
#import "Toast+UIView.h"
|
||
#import "NTESLocationPoint.h"
|
||
#import <AddressBookUI/AddressBookUI.h>
|
||
#import <CoreLocation/CoreLocation.h>
|
||
@interface NTESLocationViewController (){
|
||
BOOL _updateUserLocation;
|
||
}
|
||
@property(nonatomic,strong) UIBarButtonItem *sendButton;
|
||
@property(nonatomic,strong) CLLocationManager *locationManager;
|
||
@property(nonatomic,strong) NTESLocationPoint *locationPoint;
|
||
@property(nonatomic,strong) CLGeocoder * geoCoder;
|
||
@end
|
||
|
||
@implementation NTESLocationViewController
|
||
|
||
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
|
||
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
||
if (self) {
|
||
_locationManager = [[CLLocationManager alloc] init];
|
||
_geoCoder = [[CLGeocoder alloc] init];
|
||
}
|
||
return self;
|
||
}
|
||
|
||
- (instancetype)initWithLocationPoint:(NTESLocationPoint*)locationPoint{
|
||
self = [self initWithNibName:nil bundle:nil];
|
||
if (self) {
|
||
_locationPoint = locationPoint;
|
||
}
|
||
return self;
|
||
}
|
||
|
||
- (void)viewDidLoad {
|
||
[super viewDidLoad];
|
||
self.navigationItem.title = @"位置";
|
||
self.mapView.delegate = self;
|
||
if (self.locationPoint) {
|
||
MKCoordinateRegion theRegion;
|
||
theRegion.center = self.locationPoint.coordinate;
|
||
theRegion.span.longitudeDelta = 0.01f;
|
||
theRegion.span.latitudeDelta = 0.01f;
|
||
[self.mapView addAnnotation:self.locationPoint];
|
||
[self.mapView setRegion:theRegion animated:YES];
|
||
}else{
|
||
[self setUpRightNavButton];
|
||
self.locationPoint = [[NTESLocationPoint alloc] init];
|
||
if ([CLLocationManager locationServicesEnabled]) {
|
||
if (IOS8) {
|
||
[_locationManager requestAlwaysAuthorization];
|
||
}
|
||
CLAuthorizationStatus status = CLLocationManager.authorizationStatus;
|
||
if (status == kCLAuthorizationStatusRestricted || status == kCLAuthorizationStatusDenied) {
|
||
[self.view makeToast:@"请在设置-隐私里允许程序使用地理位置服务"
|
||
];
|
||
}else{
|
||
self.mapView.showsUserLocation = YES;
|
||
}
|
||
}else{
|
||
[self.view makeToast:@"请打开地理位置服务"
|
||
];
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
- (void)setUpRightNavButton{
|
||
UIBarButtonItem *item = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(onSend:)];
|
||
self.navigationItem.rightBarButtonItem = item;
|
||
self.sendButton = item;
|
||
self.sendButton.enabled = NO;
|
||
}
|
||
|
||
- (void)onSend:(id)sender{
|
||
if ([self.delegate respondsToSelector:@selector(onSendLocation:)]) {
|
||
[self.delegate onSendLocation:self.locationPoint];
|
||
}
|
||
[self.navigationController popViewControllerAnimated:YES];
|
||
}
|
||
|
||
- (void)didReceiveMemoryWarning {
|
||
[super didReceiveMemoryWarning];
|
||
}
|
||
|
||
#pragma mark - MKMapViewDelegate
|
||
|
||
|
||
|
||
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
|
||
if (!_updateUserLocation) {
|
||
return;
|
||
}
|
||
CLLocationCoordinate2D centerCoordinate = mapView.region.center;
|
||
[self reverseGeoLocation:centerCoordinate];
|
||
}
|
||
|
||
|
||
|
||
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
|
||
|
||
{
|
||
if (!_updateUserLocation) {
|
||
return;
|
||
}
|
||
[_mapView removeAnnotations:_mapView.annotations];
|
||
}
|
||
|
||
|
||
|
||
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
|
||
static NSString *reusePin = @"reusePin";
|
||
MKPinAnnotationView * pin = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:reusePin];
|
||
if (!pin) {
|
||
pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reusePin];
|
||
}
|
||
pin.canShowCallout = YES;
|
||
return pin;
|
||
|
||
}
|
||
|
||
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
|
||
_updateUserLocation = YES;
|
||
MKCoordinateRegion theRegion;
|
||
theRegion.center = userLocation.coordinate;
|
||
theRegion.span.longitudeDelta = 0.01f;
|
||
theRegion.span.latitudeDelta = 0.01f;
|
||
[_mapView setRegion:theRegion animated:NO];
|
||
}
|
||
|
||
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views{
|
||
[_mapView selectAnnotation:self.locationPoint animated:YES];
|
||
UIView * view = [mapView viewForAnnotation:self.mapView.userLocation];
|
||
view.hidden = YES;
|
||
}
|
||
|
||
|
||
- (void)reverseGeoLocation:(CLLocationCoordinate2D)locationCoordinate2D{
|
||
if (self.geoCoder.isGeocoding) {
|
||
[self.geoCoder cancelGeocode];
|
||
}
|
||
CLLocation *location = [[CLLocation alloc]initWithLatitude:locationCoordinate2D.latitude
|
||
longitude:locationCoordinate2D.longitude];
|
||
__weak NTESLocationViewController *wself = self;
|
||
self.sendButton.enabled = NO;
|
||
[self.geoCoder reverseGeocodeLocation:location
|
||
completionHandler:^(NSArray *placemarks, NSError *error)
|
||
{
|
||
if (error == nil) {
|
||
CLPlacemark *mark = [placemarks lastObject];
|
||
NSString * title = [wself nameForPlaceMark:mark];
|
||
NTESLocationPoint *ponit = [[NTESLocationPoint alloc]initWithCoordinate:locationCoordinate2D andTitle:title];
|
||
wself.locationPoint = ponit;
|
||
[wself.mapView addAnnotation:ponit];
|
||
wself.sendButton.enabled = YES;
|
||
} else {
|
||
wself.locationPoint = nil;
|
||
}
|
||
}];
|
||
}
|
||
|
||
- (NSString *)nameForPlaceMark: (CLPlacemark *)mark
|
||
{
|
||
NSString *name = ABCreateStringWithAddressDictionary(mark.addressDictionary,YES);
|
||
unichar characters[1] = {0x200e}; //format之后会出现这个诡异的不可见字符,在android端显示会很诡异,需要去掉
|
||
NSString *invalidString = [[NSString alloc]initWithCharacters:characters length:1];
|
||
NSString *formattedName = [[name stringByReplacingOccurrencesOfString:@"\n" withString:@" "]
|
||
stringByReplacingOccurrencesOfString:invalidString withString:@""];
|
||
return formattedName;
|
||
}
|
||
|
||
@end
|