You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

436 lines
16 KiB

//
// RailAddressViewController.m
// watch
//
// Created by xTT on 2017/7/13.
// Copyright © 2017年 xTT. All rights reserved.
//
#import "RailAddressViewController.h"
#import "RailSearchAddressVC.h"
#import "CLLocation+YCLocation.h"
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
#import "RailAddressTableViewCell.h"
#define SearchHistroySaveCount 5
@interface RailAddressViewController ()<UIGestureRecognizerDelegate,UITextFieldDelegate,CLLocationManagerDelegate,AMapSearchDelegate,UISearchBarDelegate>
@property (nonatomic, strong) CLLocation *curLocation;
@property (nonatomic, strong) MKCircle *mapCircle;
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) AMapSearchAPI *search;
@property (nonatomic, strong) AMapInputTipsSearchRequest *currentRequest;
/**
历史搜索数据
*/
@property (nonatomic, strong) NSMutableArray *historyData;
/**
是否是历史记录的模式
*/
@property (nonatomic, assign) BOOL isHistory;
@end
@implementation RailAddressViewController
@synthesize myDataSource = _myDataSource;
- (NSMutableArray *)myDataSource{
if (!_myDataSource) {
_myDataSource = [NSMutableArray array] ;
}
return _myDataSource;
}
- (Rail *)infoRail{
if (!_infoRail) {
_infoRail = [[Rail alloc] init];
}
return _infoRail;
}
- (CLLocation *)curLocation{
if (!_curLocation) {
if (self.infoRail.id) {
_curLocation = [[CLLocation alloc] initWithLatitude:[self.infoRail.lat doubleValue]
longitude:[self.infoRail.lon doubleValue]];
}else if(cUser.cDevice.lastLocation){
_curLocation = [[CLLocation alloc] initWithLatitude:cUser.cDevice.lastLocation.lat.doubleValue
longitude:cUser.cDevice.lastLocation.lon.doubleValue];
}else if(cUser.curLocation){
_curLocation = [[CLLocation alloc] initWithLatitude:[cUser.curLocation locationMarsFromEarth].coordinate.latitude
longitude:[cUser.curLocation locationMarsFromEarth].coordinate.longitude];
}
}
return _curLocation;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"地址";
self.searchBar.delegate = self;
if(self.infoRail.address){
self.searchBar.text = self.infoRail.address;
}else{
LGAlertView *alertView = [[LGAlertView alloc] initWithTitle:@"提示" message:@"请长按地图选择地址" style:LGAlertViewStyleAlert buttonTitles:@[@"确定"] cancelButtonTitle:nil destructiveButtonTitle:nil actionHandler:^(LGAlertView *alertView, NSString *title, NSUInteger index) {
} cancelHandler:nil destructiveHandler:nil];
[alertView showAnimated:YES completionHandler:nil];
}
//初始化搜索
self.search = [[AMapSearchAPI alloc] init];
self.search.delegate = self;
// 走过的进度条的颜色
self.sliderView.minimumTrackTintColor = mainColor;
// 通常状态下
[self.sliderView setThumbImage:[UIImage imageNamed:@"icon_sliding"] forState:UIControlStateNormal];
// 滑动状态下
[self.sliderView setThumbImage:[UIImage imageNamed:@"icon_sliding"] forState:UIControlStateHighlighted];
self.sliderView.maximumValue = 1000;
self.sliderView.minimumValue = 300;
if(self.infoRail.radius){
self.sliderView.value = [self.infoRail.radius floatValue];
}else{
self.infoRail.radius = @(500);
self.sliderView.value = 500.0;
}
self.railRangeLabel.text = [NSString stringWithFormat:@"%@米",self.infoRail.radius];
[self.sliderView addTarget:self action:@selector(sliderViewChangeAction:) forControlEvents:UIControlEventValueChanged];
[self.sliderView addTarget:self action:@selector(sliderViewChangeDidAction:) forControlEvents:UIControlEventTouchUpInside];
[self.myTableView registerNib:[UINib nibWithNibName:@"RailAddressTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"RailAddressTableViewCellID"];
//实例化长按手势监听
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] init];
[longPress addTarget:self action:@selector(handleMapViewLongPressed:)];
//代理
longPress.delegate = self;
longPress.minimumPressDuration = 1.0;
longPress.allowableMovement = 50.0;
//将长按手势添加到需要实现长按操作的视图里
[self.mapView addGestureRecognizer:longPress];
//定位一次自身的位置
//初始化管理器
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
//检查是否授权
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
}
-(void)sliderViewChangeAction:(UISlider*)slider{
int radiusInt = [NSNumber numberWithFloat:slider.value].intValue;
self.railRangeLabel.text = [NSString stringWithFormat:@"%d米",radiusInt];
}
-(void)sliderViewChangeDidAction:(UISlider*)slider{
[self.mapView removeOverlays:self.mapView.overlays];
int radiusInt = [NSNumber numberWithFloat:slider.value].intValue;
[slider setValue:radiusInt animated:YES];
MKCircle *mapCircle = [MKCircle circleWithCenterCoordinate:self.curLocation.coordinate
radius:radiusInt];
self.infoRail.radius = @(radiusInt);
self.railRangeLabel.text = [NSString stringWithFormat:@"%@米",self.infoRail.radius];
[self.mapView addOverlay:mapCircle];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self updateRegionWithAddress:NO];
// if (self.infoRail.id) {
// [self updateRegionWithAddress:YES];
// }else{
// [self updateRegionWithAddress:NO];
// }
}
//MARK: 封闭 侧滑手势
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
}
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
};
}
- (IBAction)rightBarItemClick:(UIBarButtonItem *)sender{
if(self.searchBar.text.length == 0){
[SVProgressHUD showErrorWithStatus:@"请长按地图获取地址"];
}else{
[self.navigationController popViewControllerAnimated:YES];
}
// if (self.infoRail.name.length == 0) {
// [SVProgressHUD showErrorWithStatus:@"请输入地址名称"];
// }else if (!self.infoRail.lat || !self.infoRail.lon) {
// [SVProgressHUD showErrorWithStatus:@"请长按地图获取地址"];
// }else if ([self.infoRail.radius integerValue] < 300 || [self.infoRail.radius integerValue] > 1000) {
// [SVProgressHUD showErrorWithStatus:@"安全范围为300~1000米"];
// }else{
// [self.infoRail saveSuccess:^{
// [self goBack:nil];
// } failure:^{}];
// }
}
//长按事件的实现方法
- (void)handleMapViewLongPressed:(UILongPressGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
NSLog(@"UIGestureRecognizerStateBegan");
CGPoint pt = [gestureRecognizer locationInView:_mapView];
CLLocationCoordinate2D coordinate = [_mapView convertPoint:pt toCoordinateFromView:_mapView];
self.curLocation = [[CLLocation alloc] initWithLatitude:coordinate.latitude
longitude:coordinate.longitude];
//23.123625574141336 113.39765354990959
// self.curLocation = [[CLLocation alloc] initWithLatitude:23.123625574141336
// longitude:113.39765354990959];
// _watchLocation = CLLocationCoordinate2DMake(latitude, longitude);
[self updateRegionWithAddress:YES];
} else if (gestureRecognizer.state == UIGestureRecognizerStateChanged) {
NSLog(@"UIGestureRecognizerStateChanged");
} else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
NSLog(@"UIGestureRecognizerStateEnded");
}
}
/**
更新区域的
@param getAddress 是否更新 搜索栏的 地址信息
*/
- (void)updateRegionWithAddress:(BOOL)getAddress;
{
if (self.curLocation) {
[self.mapView removeOverlays:self.mapView.overlays];
[self.mapView removeAnnotations:self.mapView.annotations];
int radius = 500;
if (self.infoRail.radius) {
radius = [self.infoRail.radius intValue];
}
MKCircle *mapCircle = [MKCircle circleWithCenterCoordinate:self.curLocation.coordinate
radius:radius];
[self.mapView addOverlay:mapCircle];
MKPointAnnotation *locateAnnotation = [[MKPointAnnotation alloc] init];
locateAnnotation.coordinate = self.curLocation.coordinate;
@try {
[self.mapView setRegion:MKCoordinateRegionMakeWithDistance(self.curLocation.coordinate, radius * 3, radius * 3)
animated:YES];
} @catch (NSException *exception) {
xLog(@"radius :%d coordinate: lon:%f lat: %f",radius ,self.curLocation.coordinate.longitude,self.curLocation.coordinate.latitude);
} @finally {
}
[self.mapView addAnnotation:locateAnnotation];
if (getAddress) {
[self getAddressWithLocation:self.curLocation];
}
}
}
#pragma mark 根据坐标取得地名
-(void)getAddressWithLocation:(CLLocation *)location{
//反地理编码
CLGeocoder *geocoder = [[CLGeocoder alloc]init];
WEAKSELF
[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark = [placemarks firstObject];
NSLog(@"详细信息:%@",placemark.addressDictionary);
// NSString *state = placemark.locality;
// if (!state) {
// //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
// state = placemark.administrativeArea;
// }
NSString *name;
if(placemark.subLocality){
name = [NSString stringWithFormat:@"%@ %@",
placemark.subLocality,placemark.name];
}else{
name = [NSString stringWithFormat:@"%@ %@",
placemark.locality,placemark.name];
}
if (placemark.name) {
weakSelf.infoRail.address = name;
[weakSelf.infoRail setValue:name forKey:@"address"];
//在导航栏上赋值地址
weakSelf.searchBar.text = name;
}
weakSelf.infoRail.lon = @(location.coordinate.longitude);
weakSelf.infoRail.lat = @(location.coordinate.latitude);
[weakSelf.myTableView reloadData];
}];
}
#pragma mark MKMapViewDelegate
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
NSLog(@"重新渲染 rendererForOverlay");
if ([overlay isKindOfClass:[MKCircle class]]) {
MKCircleRenderer *circleRenderer = [[MKCircleRenderer alloc] initWithCircle:overlay];
circleRenderer.lineWidth = 1.0f;
circleRenderer.strokeColor = mainColor;
circleRenderer.fillColor = [mainColor colorWithAlphaComponent:0.3];
return circleRenderer;
}
return nil;
}
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKPointAnnotation class]]) {
static NSString *customReuseIndetifier = @"customReuseIndetifier";
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:customReuseIndetifier];
if (annotationView == nil) {
annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:customReuseIndetifier];
// must set to NO, so we can show the custom callout view.
annotationView.canShowCallout = NO;//允许交互点击
annotationView.draggable = NO;
}
annotationView.image = [myHelper getImageWithName:@"定位点"];//设置大头针视图的图片
annotationView.selected = YES;
return annotationView;
}
return nil;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
if ([self.infoRail.radius integerValue] < 300 || [self.infoRail.radius integerValue] > 1000) {
[SVProgressHUD showErrorWithStatus:@"安全范围为300~1000米"];
}else{
[self updateRegionWithAddress:YES];
}
return YES;
}
//MARK: 定位管理器的 代理
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
switch (status) {
case kCLAuthorizationStatusNotDetermined:
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
break;
default:
break;
}
}
//MARK : 初始化 用户位置
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *userLocation = [locations lastObject];
[User currentUser].curLocation = userLocation; //设置用户信息
[manager stopUpdatingLocation];
//如果没有 电子围栏 curLocation 为用户位置
if(!self.infoRail.id){
if(!cUser.cDevice.lastLocation){
self.curLocation = [userLocation locationMarsFromEarth]; //转换用户位置为火星坐标
}
// [self updateRegionWithAddress:NO];
}
}
//MARK: -----搜索框 UISearchBarDelegate -----
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
xLog(@"searchBarCancelButtonClicked");
}
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar{
WEAKSELF
//跳转到新的页面
RailSearchAddressVC * vc = [RailSearchAddressVC new];
vc.selectAddressCallBack = ^(NSString *searchResult, AMapGeoPoint *point) {
weakSelf.curLocation = [[CLLocation alloc] initWithLatitude:point.latitude
longitude:point.longitude];
[weakSelf updateRegionWithAddress:YES];
weakSelf.searchBar.text = searchResult;
};
[self.navigationController pushViewController:vc animated:YES];
return NO;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
switch (self.mapView.mapType) {
case MKMapTypeHybrid:
{
self.mapView.mapType = MKMapTypeStandard;
}
break;
case MKMapTypeStandard:
{
self.mapView.mapType = MKMapTypeHybrid;
}
break;
default:
break;
}
self.mapView.mapType = MKMapTypeStandard;
// Dispose of any resources that can be recreated.
}
@end