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.

1096 lines
0 B

//
// MapViewController.m
// watch
//
// Created by xTT on 2017/7/3.
// Copyright © 2017xTT. All rights reserved.
//
#import "MapViewController.h"
#import "MyMQTT.h"
#import "CustomAnnotationView.h"
#import "CLLocation+YCLocation.h"
#import "UserAnnotationView.h"
#import "MarkViewController.h"
#import "NewTrackVC.h"
#import "RailListViewController.h"
#import "MapReviseViewController.h"
//高德SDK
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
#import "EllipsePageControl.h"
#import "LineStatusViewController.h"
//默认的定位位置 北京
#define DefineLocate CLLocationCoordinate2DMake(39.9086828351,116.3980865479)
@interface MapViewController ()<CLLocationManagerDelegate,MKMapViewDelegate,AMapSearchDelegate,UIScrollViewDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) Locate *curLocate;// 设备当前的 位置
@property (strong, nonatomic) CLLocation *userLocate;// 用户当前的 位置
@property (strong, nonatomic) MKPointAnnotation *curPointAnnotation; //设备 View
@property (strong, nonatomic) MKPointAnnotation *userPointAnnotation; //用户 View
@property (strong, nonatomic) UITapGestureRecognizer *titleViewTap;
@property (strong, nonatomic) UIButton *downBtn;
@property (strong, nonatomic) UILabel *titleLabel;
@property (assign, nonatomic) BOOL isLocating; // 正在定位的标识
@property (nonatomic ,assign) NSInteger scrollIndex;
///昵称
@property (nonatomic ,weak) UILabel *nameLabel;
/// 头像
@property (nonatomic ,weak) UIImageView *iconImg;
@property (nonatomic ,strong) UIScrollView *bgScrollView;
@property (nonatomic ,strong) EllipsePageControl *pageControl;
/// 电量信息View
@property (nonatomic ,weak) UIView *kwhView;
//设备电量Image
@property (weak, nonatomic) UIImageView *deviceBatteryImage;
//设备电量Label
@property (weak, nonatomic) UILabel *deviceBatteryLabel;
// 定位地址内容标题
@property (weak, nonatomic) UILabel *locationAddressLabel;
// 定位类型的显示Image
@property (weak, nonatomic) UIButton *locationTypeImageView;
// 定位时间
@property (weak, nonatomic) MyUILabel *locationTimeLabel;
/// 定位标题数组
@property (nonatomic ,strong) NSMutableArray *addressLabelArr;
/// 定位时间数组
@property (nonatomic ,strong) NSMutableArray *timeLabelArr;
/// 定位类型的显示Image数组
@property (nonatomic ,strong) NSMutableArray *typeImageViewArr;
/// 设备电量数组
@property (nonatomic ,strong) NSMutableArray *batteryLabelArr;
/// 设备电量图标数组
@property (nonatomic ,strong) NSMutableArray *batteryImageArr;
/// 电量信息View数组
@property (nonatomic ,strong) NSMutableArray *kwhViewArr;
/// 昵称数组
@property (nonatomic ,strong) NSMutableArray *nameLabelArr;
/// 头像数组
@property (nonatomic ,strong) NSMutableArray *iconImgArr;
/**
定位超时的定时器
*/
@property (strong, nonatomic) NSTimer *OverTimer;
/// 不在线提示View
@property (nonatomic ,strong) UIView *onlineStatusView;
@property (nonatomic, strong) AMapSearchAPI *searchAPI;
//逆地理编码
@property (nonatomic, strong) AMapReGeocodeSearchRequest *regeo;
@end
@implementation MapViewController
-(void)setIsLocating:(BOOL)isLocating{
_isLocating = isLocating;
if(_isLocating == NO){
if (self.OverTimer) {
[self.OverTimer invalidate];// 使定时器 失效
self.OverTimer = nil;
}
}
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self subMsgView];
Device *defaultDev = nil;
NSString *defaultImei = [User getDefaultImei];
if (defaultImei && cUser.myDevices)
{
for (NSInteger i = 0; i < cUser.myDevices.count; i++)
{
Device *dev = cUser.myDevices[i];
if ([defaultImei isEqualToString:dev.imei])
{
self.scrollIndex = i;
defaultDev = dev;
[self scrollViewDidScrolls:i];
break;
}
}
}
[cUser.cDevice getDeviceCurLocationSuccess:^(id responseObject) {
} failure:^(id faiObject) {
}];
[self loadData];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.zx_navBarBackgroundColor = KKClearColor;
self.mapView.delegate = self;
// [self setTitleView];
self.searchAPI = [[AMapSearchAPI alloc] init];
self.searchAPI.delegate = self;
[self initLocationManager];
self.curPointAnnotation = [[MKPointAnnotation alloc] init];
self.userPointAnnotation = [[MKPointAnnotation alloc] init];
WEAKSELF
[[NSNotificationCenter defaultCenter] addObserverForName:PUSH_type_deviceNowLocation
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * _Nonnull note)
{
//把定位超时的 标识复位
weakSelf.isLocating = NO;
[SVProgressHUD dismiss];
//定位的通知
if ([note.object[@"imei"] isEqualToString:cUser.cDevice.imei]) {
weakSelf.curLocate = [Locate mj_objectWithKeyValues:note.object];
cUser.cDevice.lastLocation = weakSelf.curLocate;
[weakSelf loadData];
}
}];
[self.view addSubview:self.bgScrollView];
[self.view addSubview:self.onlineStatusView];
[self.onlineStatusView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.bgScrollView.mas_top).inset(12);
make.left.right.equalTo(self.view).inset(15);
make.height.mas_equalTo(44);
}];
// UITapGestureRecognizer *tapPress = [[UITapGestureRecognizer alloc] initWithTarget:self
// action:@selector(mapViewtapPressed:)];
// [self.mapView addGestureRecognizer:tapPress];
UIView *btnView = [UIView new];
btnView.frame = CGRectMake(ScreenWidth-48-16, Adapted(94), 48, 208);
btnView.backgroundColor = KKWhiteColorColor;
[self.view addSubview:btnView];
btnView.conrnerRadius(10).shadowColor(KKTextBlackColor).shadowOffset(CGSizeMake(3, 3)).shadowRadius(5).shadowOpacity(0.1).showVisual();
NSArray *titleArr = @[@"历史轨迹",@"电子围栏",@"定位纠错",@"定位说明"];
NSArray *imageArr = @[@"icon_baby_history",@"icon_baby_security_fence",@"icon_baby_error",@"icon_baby_description"];
for (int i = 0; i < titleArr.count; i++)
{
UIButton *btn = [UIButton new];
//btn.backgroundColor = mainColor;
btn.frame = CGRectMake(0, i*51, 48, 50);
[btn setTitle:titleArr[i] forState:0];
[btn setImage:ImageName_(imageArr[i]) forState:0];
btn.titleLabel.font = Font_(10);
btn.tag = i;
[btn setTitleColor:RGB(20, 20, 20) forState:0];
[UICommon setTitleAndImage:btn :2];
[btn addTarget:self action:@selector(btnsTouch:) forControlEvents:UIControlEventTouchUpInside];
[btnView addSubview:btn];
if (i < titleArr.count-1)
{
UILabel *line = [UILabel new];
line.backgroundColor = RGB(229, 229, 229);
[btnView addSubview:line];
[line mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(btnView).inset(4);
make.top.equalTo(btn.mas_bottom);
make.height.mas_equalTo(1);
}];
}
}
/// 刷新按钮
UIButton *refreshBtn = [UIButton new];
[refreshBtn setImage:ImageName_(@"icon_baby_read") forState:0];
refreshBtn.backgroundColor = KKWhiteColorColor;
refreshBtn.tag = 5;
[refreshBtn addTarget:self action:@selector(btnsTouch:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:refreshBtn];
[refreshBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(btnView);
make.bottom.equalTo(self.bgScrollView.mas_top).inset(68);
make.size.mas_equalTo(CGSizeMake(48, 48));
}];
refreshBtn.conrnerRadius(24).shadowColor(KKTextBlackColor).shadowOffset(CGSizeMake(3, 3)).shadowRadius(5).shadowOpacity(0.1).showVisual();
/// 定位按钮
UIButton *positioningBtn = [UIButton new];
[positioningBtn setImage:ImageName_(@"icon_baby_positioning") forState:0];
positioningBtn.backgroundColor = KKWhiteColorColor;
positioningBtn.tag = 4;
[positioningBtn addTarget:self action:@selector(btnsTouch:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:positioningBtn];
[positioningBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(refreshBtn);
make.bottom.equalTo(refreshBtn.mas_top).inset(12);
make.size.mas_equalTo(CGSizeMake(48, 48));
}];
positioningBtn.conrnerRadius(24).shadowColor(KKTextBlackColor).shadowOffset(CGSizeMake(3, 3)).shadowRadius(5).shadowOpacity(0.1).showVisual();
}
#pragma mark 按钮点击事件
/// 按钮点击事件
- (void)btnsTouch:(UIButton *)sender
{
switch (sender.tag)
{
case 0:
{
///历史轨迹
// UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
// UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"NewTrackVC"];
// vc.title = @"历史轨迹";
// vc.hidesBottomBarWhenPushed = YES;
// [self.navigationController pushViewController:vc animated:YES];
[UICommon PusXibViewController:[NewTrackVC new] :@"NewTrackVC"];
}
break;
case 1:
{
///电子围栏
// UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
// UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"RailListViewController"];
// vc.hidesBottomBarWhenPushed = YES;
// [self.navigationController pushViewController:vc animated:YES];
[UICommon PusXibViewController:[RailListViewController new] :@"RailListViewController"];
}
break;
case 2:
{
///定位纠错
MapReviseViewController *vc = [[MapReviseViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
break;
case 3:
{
///定位说明
MarkViewController *markVC = [[MarkViewController alloc] init];
[self.navigationController pushViewController:markVC animated:YES];
}
break;
case 4:
{
///定位
//[self getUserLocationAction];
[self initLocationManager];
}
break;
case 5:
{
///刷新定位
[self getCurLoactionClick];
}
break;
default:
break;
}
}
- (void)loadData
{
//[self.locationManager startUpdatingLocation];
if(cUser.cDevice.lastLocation)
{
self.curLocate = cUser.cDevice.lastLocation;
[self showCurPiont];
[self mapView:self.mapView didSelectAnnotationView:[CustomAnnotationView new]];
// self.deviceBatteryImage.hidden = NO;
// self.deviceBatteryLabel.hidden = NO;
}
else
{
[self setMapZoom:DefineLocate];
// MARK: 做位置未知时的 处理
self.locationTimeLabel.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
self.locationTimeLabel.text = @"";
self.locationAddressLabel.text = @"当前位置未知,请确保设备开机且能够联网,再点击定位按钮进行定位";
// self.deviceBatteryImage.hidden = YES;
// self.deviceBatteryLabel.hidden = YES;
[self initLocationManager];
}
//MARK: 显示电量
[self setBattery:cUser.cDevice.battery.intValue];
}
- (void)setBattery:(int)battery
{
// 电量
NSString *imageName = @"icon_home_electricity_50";
self.kwhView.hidden = NO;
if(battery == 0)
{
imageName = @"icon_home_electricity_0";
self.kwhView.hidden = YES;
}
else if (battery > 0 && battery < 50)
imageName = @"icon_home_electricity_25";
else if (battery >= 50 && battery < 75)
imageName = @"icon_home_electricity_50";
else if (battery >= 75 && battery < 100)
imageName = @"icon_home_electricity_75";
else if (battery == 100)
imageName = @"icon_home_electricity_100";
self.deviceBatteryImage.image = [myHelper getImageWithName:imageName];
self.deviceBatteryLabel.text = [NSString stringWithFormat:@"%d%%",battery];
}
- (NSMutableArray *)getDeviceNameArr{
NSMutableArray *nameArr = [NSMutableArray array];
[cUser.myDevices enumerateObjectsUsingBlock:^(Device * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[nameArr addObject:obj.name];
}];
return nameArr;
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.locationManager stopUpdatingHeading];
}
/**
//MARK:获取当前设备的定位信息
*/
- (void)getCurLoactionClick
{
if(self.isLocating){
return;
}
//先移动 到 设备的定位处
// if([cUser.cDevice.lastLocation.lon doubleValue] == 0
// && [cUser.cDevice.lastLocation.lat doubleValue] == 0){
// [self setMapZoom:DefineLocate];
// }
// else
if([cUser.cDevice.lastLocation.lon doubleValue] != 0
&& [cUser.cDevice.lastLocation.lat doubleValue] != 0)
{
[self setMapZoom:CLLocationCoordinate2DMake([cUser.cDevice.lastLocation.lat doubleValue], [cUser.cDevice.lastLocation.lon doubleValue])];
}
WEAKSELF
[cUser.cDevice getDeviceCurLocationSuccess:^(id responseObject) {
//请求成功 等待位置回传 显示 loading
[SVProgressHUD showWithStatus:@"定位中,请稍后..."];
weakSelf.isLocating = YES;
weakSelf.OverTimer = [NSTimer scheduledTimerWithTimeInterval:15 repeats:NO block:^(NSTimer * _Nonnull timer) {
if(weakSelf.isLocating){
weakSelf.isLocating = NO;
[SVProgressHUD dismiss];
}
}];
} failure:^(id faiObject) {
if([faiObject isKindOfClass:[NSDictionary class]]){
//5001
if([faiObject[@"code"] intValue] == HTTP_ERROR_5001){
LGAlertView *alertView = [[LGAlertView alloc] initWithTitle:nil message:@"定位失败,当前设备可能关机、欠费、或处于弱信号环境" style:LGAlertViewStyleAlert buttonTitles:@[@"确定"] cancelButtonTitle:nil destructiveButtonTitle:nil actionHandler:^(LGAlertView *alertView, NSString *title, NSUInteger index) {
} cancelHandler:nil destructiveHandler:nil];
//获取当前的 VC
UIViewController *vc = weakSelf.navigationController.viewControllers.lastObject;
if([vc isKindOfClass:[MapViewController class]]){
[alertView showAnimated:YES completionHandler:nil];
}
}
}
}];
}
/**
获取当前用户的定位信息
*/
- (void)getUserLocationAction
{
[self.mapView setCenterCoordinate:self.userLocate.coordinate animated:YES];
//调整位置
//设置用户点 为当前地图范围的中心点
CLLocationCoordinate2D center = self.userLocate.coordinate;
if(center.latitude == 0 && center.longitude == 0){
center = DefineLocate;
}
[self setMapZoom:center];
[self mapView:self.mapView didSelectAnnotationView:[UserAnnotationView new]];
}
//缩小地图
- (IBAction)subtractBtnAction:(id)sender {
//设置地图范围
//设置中心点为当前地图范围的中心点
CLLocationCoordinate2D center = self.mapView.region.center;
//设置跨度为当前地图范围的跨度 * 比例系数
MKCoordinateSpan span = MKCoordinateSpanMake(self.mapView.region.span.latitudeDelta * 2, self.mapView.region.span.longitudeDelta * 2);
//设置范围
@try {
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
xLog(@"span %@",[NSValue valueWithMKCoordinateSpan:span])
xLog(@"center %@",[NSValue valueWithMKCoordinate:center])
[self.mapView setRegion: region animated:YES];
} @catch (NSException *exception) {
xLog(@"error: %@",exception.description);
} @finally {
}
}
/**
//MARK:点击地图触发的方法
*/
- (void)mapViewtapPressed:(id)sender{
[SVProgressHUD dismiss];
}
#pragma 定位
- (void)initLocationManager
{
// self.locationManager = [[CLLocationManager alloc] init];
// self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// self.locationManager.delegate = self;
//
// if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
// [self.locationManager requestWhenInUseAuthorization];
// }
[_mapView setShowsUserLocation:YES];
}
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
CLLocationCoordinate2D coord = [userLocation coordinate];
NSLog(@"当前位置(经度:%f,纬度:%f)",coord.longitude,coord.latitude);
if (coord.longitude)
{
[_mapView setShowsUserLocation:NO];
CLLocation *ccl = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
self.userLocate = ccl;
[User currentUser].curLocation = ccl;
[self showCurPiont];
}
}
//- (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];
// self.userLocate = userLocation;
// [User currentUser].curLocation = userLocation;
// [manager stopUpdatingLocation];
//
// // [self showCurPiont];
// //直接 调一次
//
// Device *device = cUser.myDevices[self.scrollIndex];
// if(!self.curLocate && !device.onlineStatus.boolValue)
//// {
//// [self mapView:self.mapView didSelectAnnotationView:[CustomAnnotationView new]];
//// }
//// else
// {
// [self mapView:self.mapView didSelectAnnotationView:[UserAnnotationView new]];
// [self showCurPiont];
// }
//
//}
//MARK: 显示点
/**
显示点
*/
-(void)showCurPiont
{
//要在地图上显示的点的数组
NSMutableArray *pointArr = [NSMutableArray array];
CLLocationCoordinate2D coordinate2D = DefineLocate;
if (cUser.cDevice.lastLocation)
{
//设置新的地图信息
coordinate2D = CLLocationCoordinate2DMake([self.curLocate.lat doubleValue],
[self.curLocate.lon doubleValue]);
//删除原来的设备点
if ([self.mapView.annotations containsObject:self.curPointAnnotation])
[self.mapView removeAnnotation:self.curPointAnnotation];
//删除原来的用户点
if ([self.mapView.annotations containsObject:self.userPointAnnotation])
[self.mapView removeAnnotation:self.userPointAnnotation];
self.curPointAnnotation.coordinate = coordinate2D;
// 设备的 范围框
if (self.curLocate.radius)
{
CLLocationDistance radius = [self.curLocate.radius doubleValue];
MKCircle *circle = [MKCircle circleWithCenterCoordinate:coordinate2D
radius:radius];
[self.mapView removeOverlays:self.mapView.overlays];
[self.mapView addOverlay:circle];
}
[pointArr addObject:self.curPointAnnotation];
if(pointArr.count > 0)
{
//如果 设备的位置存在则显示 设备的位置
[self.mapView addAnnotations:pointArr];
[self setMapZoom:coordinate2D];
}
}
else
{
//设置新的地图信息
coordinate2D = CLLocationCoordinate2DMake(self.userLocate.coordinate.latitude,
self.userLocate.coordinate.longitude);
//删除原来的设备点
if ([self.mapView.annotations containsObject:self.curPointAnnotation])
[self.mapView removeAnnotation:self.curPointAnnotation];
//删除原来的用户点
if ([self.mapView.annotations containsObject:self.userPointAnnotation])
[self.mapView removeAnnotation:self.userPointAnnotation];
self.userPointAnnotation.coordinate = coordinate2D;
[self.mapView removeOverlays:self.mapView.overlays];
// 设备的 范围框
// if (self.curLocate.radius) {
// CLLocationDistance radius = [self.curLocate.radius doubleValue];
// MKCircle *circle = [MKCircle circleWithCenterCoordinate:coordinate2D
// radius:radius];
// [self.mapView removeOverlays:self.mapView.overlays];
// [self.mapView addOverlay:circle];
// }
[pointArr addObject:self.userPointAnnotation];
if(pointArr.count > 0)
{
[self.mapView addAnnotations:pointArr];
[self setMapZoom:coordinate2D];
}
// //调整位置
// //设置中心点为当前地图范围的中心点
// CLLocationCoordinate2D center = DefineLocate;
// //不存在 则 显示用户的位置
// if(self.mapView.userLocation.isUpdating){
// center = self.mapView.userLocation.coordinate;
// }else if(self.userLocate){
// center = self.userLocate.coordinate;
// }
// [self setMapZoom:center];
}
}
#pragma 缩小地图
- (void)setMapZoom:(CLLocationCoordinate2D)centerCoordinate
{
// if (self.mapView.region.span.latitudeDelta > 20) {
// MARK: carh update by lsz 22-5-12 增加坐标合法性判断
@try {
if (CLLocationCoordinate2DIsValid(centerCoordinate)) {
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(centerCoordinate, 2000, 2000);
[self.mapView setRegion:region animated:YES];
}
} @catch (NSException *exception) {
} @finally {
}
//}
}
#pragma mark - 地图控件代理方法
#pragma mark 显示大头针时调用,注意方法中的annotation参数是即将显示的大头针对象
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if([annotation isEqual:self.curPointAnnotation])
{
//由于当前位置的标注也是一个大头针,所以此时需要判断,此代理方法返回nil使用默认大头针视图
static NSString *key1=@"CustomAnnotationView";
CustomAnnotationView *annotationView = (CustomAnnotationView*)[_mapView dequeueReusableAnnotationViewWithIdentifier:key1];
//如果缓存池中不存在则新建
if (!annotationView) {
annotationView =[[CustomAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:key1];
annotationView.canShowCallout=NO;//不允许交互点击
}else{
//重新设置此类大头针视图的大头针模型(因为有可能是从缓存池中取出来的,位置是放到缓存池时的位置)
annotationView.annotation = annotation;
}
//修改大头针视图 设置成头像
[annotationView setImageWithURLString:cUser.cDevice.avator];
annotationView.frame = CGRectMake(0, 0, 40.5, 60);
//设置中心偏移量
annotationView.centerOffset = CGPointMake(0, -26);
//定义详情视图偏移量
annotationView.calloutOffset=CGPointMake(0, 12);
return annotationView;
}
// else if([annotation isKindOfClass:[MKUserLocation class]])
else if([annotation isEqual:self.userPointAnnotation])
{
//由于当前位置的标注也是一个大头针,所以此时需要判断,此代理方法返回nil使用默认大头针视图
static NSString *key1=@"UserAnnotationView";
UserAnnotationView *annotationView = (UserAnnotationView*)[_mapView dequeueReusableAnnotationViewWithIdentifier:key1];
//如果缓存池中不存在则新建
if (!annotationView) {
annotationView =[[UserAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:key1];
annotationView.canShowCallout=NO;//不允许交互点击
}else{
//重新设置此类大头针视图的大头针模型(因为有可能是从缓存池中取出来的,位置是放到缓存池时的位置)
annotationView.annotation = annotation;
}
//修改大头针视图 设置成头像
[annotationView setImageWithURLString:cUser.avator];
//设置大小
annotationView.frame = CGRectMake(0, 0, 40.5, 60);
//设置中心偏移量
annotationView.centerOffset = CGPointMake(0, -26);
//定义详情视图偏移量
annotationView.calloutOffset=CGPointMake(0, 12);
return annotationView;
}
return nil;
}
//MARK: 点击地图 中的 标点 触发的方法
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
if([view isKindOfClass:[CustomAnnotationView class]])
{
// 设备点
if ([self.curLocate.loc_type isEqualToString:@"LBS"]) {
[self.locationTypeImageView setImage:ImageName_(@"icon_home_base_station") forState:0];
}else if([self.curLocate.loc_type isEqualToString:@"GPS"]){
[self.locationTypeImageView setImage:ImageName_(@"icon_home_base_gps") forState:0];
}else if([self.curLocate.loc_type isEqualToString:@"WIFI"]){
[self.locationTypeImageView setImage:ImageName_(@"icon_home_base_wifi") forState:0];
}else{
//是空的 LBS
[self.locationTypeImageView setImage:ImageName_(@"icon_home_base_station") forState:0];
}
if(self.curLocate){
NSString *dateStr = [myHelper distanceTimeWithBeforeTime:[self.curLocate.timestamp doubleValue]];
self.locationTimeLabel.edgeInsets = UIEdgeInsetsMake(0, 6, 0, 6);
self.locationTimeLabel.text = dateStr;
self.locationAddressLabel.text = @"位置解析中...";
}
self.regeo.location = [AMapGeoPoint locationWithLatitude:[self.curLocate.lat floatValue] longitude:[self.curLocate.lon floatValue]];
[self.searchAPI AMapReGoecodeSearch:self.regeo];
}
// else
// {
// AMapReGeocodeSearchRequest *regeo = [[AMapReGeocodeSearchRequest alloc] init];
// regeo.location = [AMapGeoPoint locationWithLatitude:self.userLocate.coordinate.latitude longitude:self.userLocate.coordinate.longitude];
// [self.searchAPI AMapReGoecodeSearch:regeo];
//
// }
}
- (AMapReGeocodeSearchRequest *)regeo {
if (!_regeo) {
_regeo = [[AMapReGeocodeSearchRequest alloc]init];
_regeo.requireExtension = YES;
}
return _regeo;
}
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
if ([overlay isKindOfClass:[MKCircle class]])
{
MKCircleRenderer *circle = [[MKCircleRenderer alloc] initWithOverlay:overlay];
circle.strokeColor = [UIColor clearColor];
circle.fillColor = [[UIColor blueColor] colorWithAlphaComponent:0.1];
// circle.lineWidth = 1;
return circle;
}
return nil;
}
#pragma mark ====高德地图位置解析回调====
-(void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response{
if (response.regeocode != nil)
{
NSString *name = response.regeocode.formattedAddress;
self.locationAddressLabel.text = name;
}
}
-(void)dealloc{
if(self.OverTimer){
[self.OverTimer invalidate];
self.OverTimer = nil;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
switch (self.mapView.mapType) {
case MKMapTypeHybrid:
{
self.mapView.mapType = MKMapTypeStandard;
}
break;
case MKMapTypeStandard:
{
self.mapView.mapType = MKMapTypeHybrid;
}
break;
default:
break;
}
self.mapView.mapType = MKMapTypeStandard;
}
- (UIScrollView *)bgScrollView
{
if (!_bgScrollView)
{
_bgScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, ScreenHeight-Adapted(88)-TabBarHeight-32, ScreenWidth-20, 88)];
_bgScrollView.delegate = self;
_bgScrollView.clipsToBounds = NO;
_bgScrollView.backgroundColor = KKClearColor;
// 是否按照页(默认以scrollview的宽度或高度为一页
_bgScrollView.pagingEnabled = YES;
// 是否显示右侧边界显示的竖向指示条
_bgScrollView.showsVerticalScrollIndicator = NO;
// 是否显示底侧边界显示的横向指示条
_bgScrollView.showsHorizontalScrollIndicator = NO;
// 是否显示侧边界显示的指示条的颜色样式
_bgScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
[self.view addSubview:self.pageControl];
}
return _bgScrollView;
}
- (void)subMsgView
{
NSArray *watchArr = cUser.myDevices;
CGFloat hh = watchArr.count > 1 ? 32 : 16;
self.pageControl.numberOfPages = watchArr.count;
CGFloat ww = watchArr.count*6+watchArr.count*8; // 计算分页控件长度
self.bgScrollView.contentSize = CGSizeMake(self.bgScrollView.width *watchArr.count, 88);
self.pageControl.frame = CGRectMake((ScreenWidth-ww)/2, _bgScrollView.bottom+5, ww, 10);
self.pageControl.hidden = watchArr.count > 1 ? NO : YES;
self.bgScrollView.frame = CGRectMake(10, ScreenHeight-Adapted(88)-TabBarHeight-hh, ScreenWidth-20, 88);
for (UIView *views in self.bgScrollView.subviews)
{
[views removeFromSuperview];
}
self.addressLabelArr = [[NSMutableArray alloc] init];
self.timeLabelArr = [[NSMutableArray alloc] init];
self.typeImageViewArr = [[NSMutableArray alloc] init];
self.batteryLabelArr = [[NSMutableArray alloc] init];
self.nameLabelArr = [[NSMutableArray alloc] init];
self.iconImgArr = [[NSMutableArray alloc] init];
self.kwhViewArr = [[NSMutableArray alloc] init];
for (int i = 0; i < watchArr.count; i++)
{
Device *dev = watchArr[i];
CGRect fromt = CGRectMake(self.bgScrollView.width*i+5, 0,self.bgScrollView.width-10 , 88);
UIView *bgView = [UICommon ui_view:fromt backgroundColor:KKWhiteColorColor cornerRadius:12 borderWidth:0 borderColor:KKWhiteColorColor];
[self.bgScrollView addSubview:bgView];
bgView.conrnerRadius(12).shadowColor(KKTextBlackColor).shadowOffset(CGSizeMake(3, 3)).shadowRadius(5).shadowOpacity(0.1).showVisual();
UIImageView *iconImg = [UICommon ui_imageView:CGRectZero fileName:[dev.sex isEqualToString:@"girl"] ? @"icon_girl_head_portrait" : @"icon_boy_head_portrait"];
if (dev.avator && ![dev.avator containsString:@"/default.jpg"])
[iconImg sd_setImageWithURL:[NSURL URLWithString:dev.avator] placeholderImage:ImageName_(@"")];
iconImg.layer.cornerRadius = 8;
iconImg.layer.masksToBounds = YES;
// self.iconImg = iconImg;
[bgView addSubview:iconImg];
[iconImg mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(bgView);
make.left.equalTo(bgView).offset(16);
make.size.mas_equalTo(CGSizeMake(56, 56));
}];
/// 右箭头
UIImageView *rightImg = [UICommon ui_imageView:CGRectZero fileName:@"icon_enter_gray"];
[bgView addSubview:rightImg];
[rightImg mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(iconImg);
make.right.equalTo(bgView.mas_right).inset(15);
make.size.mas_equalTo(rightImg.image.size);
}];
/// 昵称
UILabel *nameLabel = [UICommon ui_label:CGRectZero lines:0 align:NSTextAlignmentCenter font:FontBold_(20) textColor:KKTextBlackColor text:dev.name Radius:0];
//self.nameLabel = nameLabel;
[bgView addSubview:nameLabel];
[nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(iconImg.mas_right).offset(8);
make.top.equalTo(iconImg).offset(4);
}];
// 定位时间
MyUILabel *locationTimeLabel = [UICommon ui_myLabel:CGRectZero lines:0 align:NSTextAlignmentCenter font:Font_(10) textColor:KKGrey102 text:@"" Radius:10];
locationTimeLabel.backgroundColor = RGB(246, 246, 246);
//self.locationTimeLabel = locationTimeLabel;
[bgView addSubview:locationTimeLabel];
[locationTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(nameLabel.mas_right).offset(5);
make.centerY.equalTo(nameLabel);
make.height.mas_equalTo(20);
}];
UIButton *locationTypeImageView = [UIButton new];
locationTypeImageView.backgroundColor = RGB(246, 246, 246);
[locationTypeImageView setImage:ImageName_(@"icon_home_base_station") forState:0];
locationTypeImageView.layer.cornerRadius = 10;
locationTypeImageView.layer.masksToBounds = YES;
//self.locationTypeImageView = locationTypeImageView;
[bgView addSubview:locationTypeImageView];
[locationTypeImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(locationTimeLabel.mas_right).offset(5);
make.centerY.equalTo(nameLabel);
make.height.width.mas_equalTo(20);
}];
/// 电量信息View
UIView *kwhView = [[UIView alloc] init];
kwhView.backgroundColor = RGBA(16, 199, 114, .18);
kwhView.layer.cornerRadius = 10;
kwhView.layer.masksToBounds = YES;
//self.kwhView = kwhView;
[bgView addSubview:kwhView];
[kwhView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(locationTypeImageView.mas_right).offset(5);
make.centerY.equalTo(nameLabel);
make.size.mas_equalTo(CGSizeMake(50, 20));
}];
NSString *imageName = @"icon_home_electricity_50";
if(dev.battery.intValue == 0)
imageName = @"icon_home_electricity_0";
else if (dev.battery.intValue > 0 && dev.battery.intValue < 50)
imageName = @"icon_home_electricity_25";
else if (dev.battery.intValue >= 50 && dev.battery.intValue < 75)
imageName = @"icon_home_electricity_50";
else if (dev.battery.intValue >= 75 && dev.battery.intValue < 100)
imageName = @"icon_home_electricity_75";
else if (dev.battery.intValue == 100)
imageName = @"icon_home_electricity_100";
/// 电量
UIImageView *deviceBatteryImage = [UICommon ui_imageView:CGRectZero fileName:imageName];
//self.deviceBatteryImage = deviceBatteryImage;
[kwhView addSubview:deviceBatteryImage];
[deviceBatteryImage mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(kwhView);
make.left.equalTo(kwhView).offset(6);
make.size.mas_equalTo(CGSizeMake(Adapted(12), Adapted(12)));
}];
/// 电量
UILabel *deviceBatteryLabel = [UICommon ui_label:CGRectZero lines:0 align:NSTextAlignmentCenter font:Font_(9) textColor:RGB(16, 199, 114) text:[NSString stringWithFormat:@"%@%%",dev.battery] Radius:0];
//self.deviceBatteryLabel = deviceBatteryLabel;
[kwhView addSubview:deviceBatteryLabel];
[deviceBatteryLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(kwhView);
make.left.equalTo(deviceBatteryImage.mas_right).offset(4);
}];
UILabel *locationAddressLabel = [UICommon ui_label:CGRectZero lines:0 align:NSTextAlignmentLeft font:Font_(12) textColor:KKGrey102 text:@"" Radius:0];
//self.locationAddressLabel = locationAddressLabel;
[bgView addSubview:locationAddressLabel];
[locationAddressLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(nameLabel);
make.top.equalTo(nameLabel.mas_bottom).offset(4);
make.right.equalTo(rightImg.mas_left).inset(10);
}];
[self.addressLabelArr addObject:locationAddressLabel];
[self.timeLabelArr addObject:locationTimeLabel];
[self.batteryLabelArr addObject:deviceBatteryLabel];
[self.typeImageViewArr addObject:locationTypeImageView];
[self.batteryImageArr addObject:deviceBatteryImage];
[self.nameLabelArr addObject:nameLabel];
[self.iconImgArr addObject:iconImg];
[self.kwhViewArr addObject:kwhView];
}
}
//UIScrollView内视图移动停止移动时调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat pageWidth = self.bgScrollView.width;
NSInteger currentPage = floor((self.bgScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
NSLog(@"滚动到了第 %ld 页",currentPage);
self.pageControl.currentPage = currentPage;
self.scrollIndex = currentPage;
Device *device = cUser.myDevices[currentPage];
[User saveDefaultImei:device.imei];
cUser.cDevice = device;
[self switchView];
[self loadData];
}
/// 滚动到指定页
- (void)scrollViewDidScrolls:(NSInteger)index
{
CGFloat imageW = self.bgScrollView.width;
// 指定页面
CGPoint position = CGPointMake(index*imageW, 0);
[self.bgScrollView setContentOffset:position animated:NO];
self.pageControl.currentPage = index;
[self switchView];
}
/// 实时切换手表显示View
- (void)switchView
{
self.locationAddressLabel = (UILabel *)self.addressLabelArr[self.scrollIndex];
self.locationTimeLabel = (MyUILabel *)self.timeLabelArr[self.scrollIndex];
self.deviceBatteryLabel = (UILabel *)self.batteryLabelArr[self.scrollIndex];
self.locationTypeImageView = (UIButton *)self.typeImageViewArr[self.scrollIndex];
self.deviceBatteryImage = (UIImageView *)self.batteryImageArr[self.scrollIndex];
self.nameLabel = (UILabel *)self.nameLabelArr[self.scrollIndex];
self.iconImg = (UIImageView *)self.iconImgArr[self.scrollIndex];
self.kwhView = (UIView *)self.kwhViewArr[self.scrollIndex];
Device *device = cUser.myDevices[self.scrollIndex];
self.onlineStatusView.hidden = device.onlineStatus.boolValue;
}
-(EllipsePageControl *)pageControl
{
if (!_pageControl)
{
_pageControl = [[EllipsePageControl alloc] init];
_pageControl.backgroundColor = KKClearColor;
_pageControl.otherColor = KKGrey153;
_pageControl.currentColor = mainColor;
}
return _pageControl;
}
- (UIView *)onlineStatusView
{
if (!_onlineStatusView)
{
_onlineStatusView = [UICommon ui_view:CGRectZero backgroundColor:RGB(255, 235, 238) cornerRadius:10 borderWidth:0 borderColor:KKWhiteColorColor];
_onlineStatusView.hidden = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGuestures:)];
[_onlineStatusView addGestureRecognizer:tapGesture];
UIImageView *leftImg = [UICommon ui_imageView:CGRectZero fileName:@"comm_ti_icon"];
[_onlineStatusView addSubview:leftImg];
[leftImg mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(_onlineStatusView).offset(15);
make.centerY.equalTo(_onlineStatusView);
make.size.mas_equalTo(leftImg.image.size);
}];
/// 右箭头
UIImageView *rightImg = [UICommon ui_imageView:CGRectZero fileName:@"comm_right_icon_red"];
[_onlineStatusView addSubview:rightImg];
[rightImg mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(_onlineStatusView);
make.right.equalTo(_onlineStatusView.mas_right).inset(15);
make.size.mas_equalTo(rightImg.image.size);
}];
UILabel *titleLabel = [UICommon ui_label:CGRectZero lines:0 align:NSTextAlignmentLeft font:FontBold_(14) textColor:RGB(255, 84, 71) text:@"手表未连网络,可能关机,欠费或信号差" Radius:0];
[_onlineStatusView addSubview:titleLabel];
[titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(rightImg.mas_left).inset(5);
make.centerY.equalTo(_onlineStatusView.mas_centerY);
make.left.equalTo(leftImg.mas_right).offset(5);
}];
}
return _onlineStatusView;
}
- (void)handleGuestures:(UITapGestureRecognizer *)sender
{
CGPoint point = [sender locationInView:self.onlineStatusView];
if([self.onlineStatusView.layer containsPoint:point])
{
LineStatusViewController *vc = [[LineStatusViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
}
@end