// // 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 #import #import "RailAddressTableViewCell.h" #define SearchHistroySaveCount 5 @interface RailAddressViewController () @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.zx_navTitle = @"地址"; [self zx_setRightBtnWithText:@"保存" clickedBlock:^(ZXNavItemBtn * _Nonnull btn) { [self rightBarItemClick]; }]; [self.zx_navRightBtn setTitleColor:mainColor forState:0]; 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; }; } - (void)rightBarItemClick { if(self.searchBar.text.length == 0){ [UICommon MessageErrorText:@"请长按地图获取地址"]; }else{ [self.navigationController popViewControllerAnimated:YES]; } // if (self.infoRail.name.length == 0) { // [UICommon MessageErrorText:@"请输入地址名称"]; // }else if (!self.infoRail.lat || !self.infoRail.lon) { // [UICommon MessageErrorText:@"请长按地图获取地址"]; // }else if ([self.infoRail.radius integerValue] < 300 || [self.infoRail.radius integerValue] > 1000) { // [UICommon MessageErrorText:@"安全范围为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)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.2]; return circleRenderer; } return nil; } - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)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:@"module_location_icon"];//设置大头针视图的图片 annotationView.selected = YES; return annotationView; } return nil; } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ if ([self.infoRail.radius integerValue] < 300 || [self.infoRail.radius integerValue] > 1000) { [UICommon MessageErrorText:@"安全范围为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