// // TrackViewController.m // LekangGuard // // Created by ecell on 2022/12/14. // #import "TrackViewController.h" #import "VRGCalendarView.h" #import "TrackTableViewCell.h" #import "TrackMapView.h" @interface TrackViewController () @property (nonatomic ,strong) UITableView *comTable; @property (strong, nonatomic) VRGCalendarView *calendar; @property (strong, nonatomic) UIControl *overlayView; /// 顶部View @property (nonatomic ,strong) UIView *topView; /// 后一天 @property (weak, nonatomic) UIButton *afterDayBtn; /// 前一天 @property (weak, nonatomic) UIButton *beforeDayBtn; /// 时间显示Btn @property (weak, nonatomic) UIButton *dayTimeBtn; @property (nonatomic ,strong) UIView *headerView; /// 轨迹条数显示 @property (nonatomic ,weak) UILabel *numberLabel; /// 轨迹地图 @property (nonatomic ,strong) TrackMapView *trackMapView; @end @implementation TrackViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.zx_navTitle = GJText(@"历史轨迹"); self.ImgType = Lishijilu; self.emptyText = GJText(@"没有历史数据"); [self zx_setRightBtnWithText:GJText(@"地图查看") clickedBlock:^(ZXNavItemBtn * _Nonnull btn) { btn.selected = !btn.selected; [btn setTitle:GJText(@"地图查看") forState:UIControlStateNormal]; [btn setTitle:GJText(@"轨迹查看") forState:UIControlStateSelected]; [self mapShowAndHidden:btn.selected ? 1 : 0]; }]; self.zx_navRightBtn.hidden = YES; [self.view addSubview:self.comTable]; [self.comTable mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self.view); make.top.equalTo(self.view).offset(iPhoneX_NavHeight+Adapted(50)+0.5); make.bottom.equalTo(self.view.mas_bottom); }]; [self.view addSubview:self.topView]; [self GetTrackInfo]; } - (UITableView *)comTable { if (!_comTable) { _comTable = [[UITableView alloc] init]; _comTable.delegate = self; _comTable.dataSource = self; _comTable.emptyDataSetSource = self; _comTable.emptyDataSetDelegate = self; _comTable.backgroundColor = KKClearColor; _comTable.separatorStyle = UITableViewCellSeparatorStyleNone; [_comTable registerClass:TrackTableViewCell.class forCellReuseIdentifier:NSStringFromClass(TrackTableViewCell.class)]; } return _comTable; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.modelListArr.count; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ TrackInfoModel *model = self.modelListArr[indexPath.row]; CGRect rect = [UICommon GetTextWidth:model.addr ViewHeight:SCREEN_WIDTH-105 fontSize:Font_(15) type:@"h"]; CGFloat hh = 12.5+rect.size.height+15+Adapted(18)+8; return hh; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { TrackTableViewCell *cell = [TrackTableViewCell cellWithTableView:tableView indexPath:indexPath]; TrackInfoModel *model = self.modelListArr[indexPath.row]; CGRect rect = [UICommon GetTextWidth:model.addr ViewHeight:SCREEN_WIDTH-105 fontSize:Font_(15) type:@"h"]; CGFloat hh = 12.5+rect.size.height+15+Adapted(18)+8; NSInteger rows = 1; if (self.modelListArr.count == 1) rows = 0; else { if (indexPath.row == 0) rows = 0; else if (indexPath.row == self.modelListArr.count-1) rows = 2; } NSString *dateStr = [UICommon getDateFormatWithStr:@"HH:mm" date:[NSDate dateWithTimeIntervalSince1970:[self getTimeStrWithString:model.createTime]]]; NSString *stayTime = [self secondToTime:model.residenceTime]; [cell setIconType:rows WithAddress:model.addr WithTime:dateStr CanShapeToView:self.modelListArr.count == 1 ? NO : YES StayTime:stayTime ViewHeight:hh]; return cell; } #pragma mark 轨迹地图View /// 轨迹地图View - (TrackMapView *)trackMapView { if (!_trackMapView) { CGFloat yy = iPhoneX_NavHeight+Adapted(50)+0.5; _trackMapView = [[TrackMapView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT-yy)]; } return _trackMapView; } - (void)mapShowAndHidden:(NSInteger)type { if (type == 1) { [self.view addSubview:self.trackMapView]; [self.trackMapView loadWithInfoTrack:self.modelListArr]; } CGFloat yy = iPhoneX_NavHeight+self.topView.height+0.5; [UIView animateWithDuration:0.5 animations:^{ self.trackMapView.frame = CGRectMake(0,type == 1 ? yy : SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT-yy); } completion:^(BOOL finished) { [self.trackMapView topViewShowAndHidden:type]; if (type == 0) { for(UIView *mapview in [self.view subviews]) { if ([mapview isKindOfClass:[TrackMapView class]]) { [mapview removeFromSuperview]; } } } }]; } #pragma mark 查询轨迹信息 /// 查询轨迹信息 - (void)GetTrackInfo { [UICommon MessageUpload:@"加载中"]; NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [parameters setValue:APIManager.sharedManager.deviceModel.imei forKey:@"imei"]; [parameters setValue:[self timeConversion] forKey:@"startTime"]; [[[APIManager sharedManager] APPOST:TrackInfo_URL parameters:parameters isJson:YES resultClass:nil] subscribeNext:^(NSArray *arr) { [UICommon HidenLoading]; [self.modelListArr removeAllObjects]; if (ARRAYHASVALUE(arr)) { for (NSDictionary *dic in arr) { TrackInfoModel *model = [TrackInfoModel yy_modelWithJSON:dic]; [self.modelListArr addObject:model]; } } self.comTable.tableHeaderView = arr.count > 0 ? self.headerView : nil; self.comTable.tableHeaderView.height = arr.count > 0 ? Adapted(60) : 0; self.numberLabel.attributedText = [UICommon labelFontSize:arr.count > 0 ? F(@"%ld %@", arr.count,GJText(@"条轨迹")) : @""]; // [self.trackMapView loadWithInfoTrack:self.modelListArr]; [self.comTable reloadData]; self.zx_navRightBtn.hidden = self.modelListArr.count > 0 ? NO : YES; if (self.modelListArr.count <= 0) { self.zx_navRightBtn.selected = NO; [self mapShowAndHidden:0]; } } error:^(NSError * _Nullable error) { NSDictionary *dic = error.userInfo; [UICommon MessageErrorText:dic[NSLocalizedDescriptionKey]]; }]; } #pragma mark 根据日期删除轨迹信息 /// 根据日期删除轨迹信息 - (void)deleteTrackInfo { [UICommon MessageUpload:@"加载中"]; NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; [[[APIManager sharedManager] APDELETE:F(@"%@/%@/%@", DeleteTrackInfo_URL,APIManager.sharedManager.deviceModel.imei,[self timeConversion]) parameters:parameters resultClass:nil] subscribeNext:^(id _Nullable x) { [UICommon HidenLoading]; [UICommon MessageSuccessText:@"删除成功"]; [self GetTrackInfo]; } error:^(NSError * _Nullable error) { NSDictionary *dic = error.userInfo; [UICommon MessageErrorText:dic[NSLocalizedDescriptionKey]]; }]; } #pragma mark 顶部时间选择View /// 顶部时间选择View - (UIView *)topView { if (!_topView) { _topView = [UIView new]; _topView.backgroundColor = KKWhiteColorColor; _topView.frame = CGRectMake(0, iPhoneX_NavHeight, SCREEN_WIDTH, Adapted(50)); /// 前一天 UIButton *beforeDayBtn = [UICommon ui_buttonSimple:CGRectZero font:FontADA_(14) normalColor:KKWhiteColorColor normalText:GJText(@"前一天") click:^(id x) { [self dayBtnAction:1]; }]; CGRect rect1 = [UICommon GetTextWidth:beforeDayBtn.currentTitle ViewHeight:Adapted(25) fontSize:FontADA_(14) type:@"w"]; beforeDayBtn.backgroundColor = KKMainColor; beforeDayBtn.layer.cornerRadius = 5; beforeDayBtn.layer.masksToBounds = YES; self.beforeDayBtn = beforeDayBtn; [_topView addSubview:beforeDayBtn]; [beforeDayBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(_topView).offset(20); make.centerY.equalTo(_topView); make.size.mas_equalTo(CGSizeMake(Adapted(rect1.size.width+10), Adapted(25))); }]; /// 后一天 UIButton *afterDayBtn = [UICommon ui_buttonSimple:CGRectZero font:FontADA_(14) normalColor:KKWhiteColorColor normalText:GJText(@"后一天") click:^(id x) { [self dayBtnAction:2]; }]; CGRect rect = [UICommon GetTextWidth:afterDayBtn.currentTitle ViewHeight:Adapted(25) fontSize:FontADA_(14) type:@"w"]; afterDayBtn.backgroundColor = KKMainColor; afterDayBtn.layer.cornerRadius = 5; afterDayBtn.layer.masksToBounds = YES; self.afterDayBtn = afterDayBtn; [_topView addSubview:afterDayBtn]; [afterDayBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(_topView.mas_right).inset(20); make.centerY.equalTo(_topView); make.size.mas_equalTo(CGSizeMake(Adapted(rect.size.width+10), Adapted(25))); }]; /// 中间显示当前时间 UIButton *dayTimeBtn = [UICommon ui_buttonSimple:CGRectZero font:FontADA_(16) normalColor:KKMainColor normalText:@"" click:^(id x) { [self dayTimeBtnAction]; }]; [dayTimeBtn setImage:ImageName_(@"icon_drop-down") forState:0]; self.dayTimeBtn = dayTimeBtn; [_topView addSubview:dayTimeBtn]; [dayTimeBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.centerX.equalTo(_topView); make.size.mas_equalTo(CGSizeMake(Adapted(100), Adapted(34))); }]; [self setDayTimeLabelText:GJText(@"今天")]; } return _topView; } #pragma mark 当前时间按钮点击方法 /// 当前时间按钮点击方法 - (void)dayTimeBtnAction { [self dismissCalendarView]; self.overlayView = [[UIControl alloc]initWithFrame:CGRectMake(0, iPhoneX_NavHeight, SCREEN_WIDTH, SCREEN_HEIGHT-iPhoneX_NavHeight)]; [_overlayView addTarget:self action:@selector(dismissCalendarView) forControlEvents:UIControlEventTouchUpInside]; self.calendar = [[VRGCalendarView alloc] init]; self.calendar.limitDay = 60; CGRect c = self.calendar.frame; c.origin.y = iPhoneX_NavHeight+Adapted(50); self.calendar.frame = c; self.calendar.delegate = self; NSDate *selectDate; if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"今天")]) { //今天 selectDate = [NSDate dateWithTimeIntervalSince1970:[NSDate date].timeIntervalSince1970]; } else if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"昨天")]) { //昨天 selectDate = [NSDate dateWithTimeIntervalSince1970:[NSDate date].timeIntervalSince1970 - 60*60*24]; } else { NSDateFormatter * dateF = [[NSDateFormatter alloc]init]; [dateF setCalendar:[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]]; [dateF setDateFormat:@"yyyy-MM-dd"]; NSDate *date =[dateF dateFromString:self.dayTimeBtn.titleLabel.text]; selectDate = date; } //今天 // selectDate = [NSDate dateWithTimeIntervalSince1970:[NSDate date].timeIntervalSince1970]; self.calendar.selectedDate = selectDate; self.calendar.alpha = 1; [self.view addSubview:_overlayView]; [self.view addSubview:self.calendar]; } - (void)dismissCalendarView { if(_overlayView) { [_overlayView removeFromSuperview]; _overlayView = nil; [UIView animateWithDuration:0.35 animations:^{ self.calendar.alpha = 0; }completion:^(BOOL finished) { [self.calendar removeFromSuperview]; }]; //[self.dayTimeIconBtn setImage:[UIImage imageNamed:@"icon_drop-down"] forState:0]; } } #pragma mark - 日期选择Delegate -(void)calendarView:(VRGCalendarView *)calendarView switchedToMonth:(int)month targetHeight:(float)targetHeight animated:(BOOL)animated { } -(void)calendarView:(VRGCalendarView *)calendarView dateSelected:(NSDate *)date { NSString *selectDay = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" date:date]; //对比昨天和今天 //昨天 NSString *yesterday = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970 - 60*60*24]; //今天 NSString *today = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970]; if([selectDay isEqualToString:yesterday]) { [self setDayTimeLabelText:GJText(@"昨天")]; }else if([selectDay isEqualToString:today]) { [self setDayTimeLabelText:GJText(@"今天")]; } else { [self setDayTimeLabelText:selectDay]; } [self GetTrackInfo]; [self dismissCalendarView]; } -(void)setDayTimeLabelText:(NSString*)day { [self.dayTimeBtn setTitle:day forState:0]; CGRect rect = [UICommon GetTextWidth:day ViewHeight:Adapted(34) fontSize:FontADA_(16) type:@"w"]; CGFloat spacing = 5; [self.dayTimeBtn setImageEdgeInsets:UIEdgeInsetsMake(0, rect.size.width + spacing/2, 0, -(rect.size.width + spacing/2))]; [self.dayTimeBtn setTitleEdgeInsets:UIEdgeInsetsMake(0, -(self.dayTimeBtn.currentImage.size.width + spacing/2), 0, self.dayTimeBtn.currentImage.size.width + spacing/2)]; } #pragma mark 前一天或者后一天按钮点击方法 /// 前一天或者后一天按钮点击方法 - (void)dayBtnAction:(NSInteger)type { // if(self.isLoading){ // return; // } // self.isLoading = YES; NSMutableDictionary * params = [NSMutableDictionary dictionary]; if(type == 1) { //按了前一天的按钮 NSString *paramsDay; if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"今天")]) { //昨天 paramsDay = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970 - 60*60*24]; [self setDayTimeLabelText:GJText(@"昨天")]; } else if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"昨天")]) { paramsDay = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970 - 2 * 60*60*24]; [self setDayTimeLabelText: paramsDay]; } else { //当前位置的天数转换成的时间戳 NSTimeInterval tempTime = [UICommon getDateWithStr:self.dayTimeBtn.titleLabel.text dateFormat:@"yyyy-MM-dd"].timeIntervalSince1970; paramsDay = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:tempTime - 60*60*24]; [self setDayTimeLabelText: paramsDay]; } [params setValue:paramsDay forKey:@"date"]; } else if(type == 2) { if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"今天")]) return; //后一天 if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"昨天")]) { [self setDayTimeLabelText:GJText(@"今天")]; params = nil; } else { //当前位置的天数转换成的时间戳 NSTimeInterval tempTime = [UICommon getDateWithStr:self.dayTimeBtn.titleLabel.text dateFormat:@"yyyy-MM-dd"].timeIntervalSince1970; NSString *paramsDay = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:tempTime + 60*60*24]; //对比昨天和今天 //昨天 NSString *yesterday = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970 - 60*60*24]; //今天 NSString *today = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970]; if([paramsDay isEqualToString:yesterday]) { [self setDayTimeLabelText:GJText(@"昨天")]; }else if([paramsDay isEqualToString:today]) { [self setDayTimeLabelText:GJText(@"今天")]; } else { [self setDayTimeLabelText:paramsDay]; } [params setValue:paramsDay forKey:@"date"]; } } else { params = nil; } [self GetTrackInfo]; } #pragma mark 轨迹列表头部信息 /// 轨迹列表头部信息 - (UIView *)headerView { if(!_headerView) { _headerView = [UIView new]; _headerView.backgroundColor = KKClearColor; _headerView.frame = CGRectMake(0, 0, SCREEN_WIDTH, Adapted(60)); UIImageView *iconImg = [UIImageView new]; iconImg.image = APIManager.sharedManager.deviceModel.sex == 1 ? ImageName_(@"icon_head_boy") : ImageName_(@"icon_head_girl"); if (APIManager.sharedManager.deviceModel.image.length > 0) [iconImg sd_setImageWithURL:[NSURL URLWithString:APIManager.sharedManager.deviceModel.image]]; iconImg.layer.cornerRadius = Adapted(20); iconImg.layer.masksToBounds = YES; [_headerView addSubview:iconImg]; [iconImg mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(_headerView); make.left.equalTo(_headerView).offset(30); make.size.mas_equalTo(CGSizeMake(Adapted(40), Adapted(40))); }]; UILabel *numberLabel = [UICommon ui_label:CGRectZero lines:0 align:NSTextAlignmentCenter font:FontBoldADA_(30) textColor:KKMainColor text:@"" Radius:0]; self.numberLabel = numberLabel; [_headerView addSubview:numberLabel]; [numberLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.centerX.equalTo(_headerView); }]; UIButton *deleteBtn = [UICommon ui_buttonSimple:CGRectZero font:FontADA_(0) normalColor:KKWhiteColorColor normalText:@"" click:^(id x) { [self deleteTrackInfo]; }]; [deleteBtn setImage:ImageName_(@"icon_delect_black") forState:0]; [_headerView addSubview:deleteBtn]; [deleteBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(_headerView.mas_right).inset(25); make.centerY.equalTo(_headerView); make.size.mas_equalTo(CGSizeMake(AdaptedHeight(deleteBtn.currentImage.size.width), AdaptedHeight(deleteBtn.currentImage.size.height))); }]; } return _headerView; } /** 设置按钮不可选且半透明 @param flag Bad is NO , Good is YES @param button button */ -(void)setBtnBadRoGoodFlag:(BOOL)flag WithBtn:(id) button{ if(flag){ if([button isKindOfClass:[UIButton class]]){ [button setAlpha:1]; } [button setEnabled:YES]; }else{ if([button isKindOfClass:[UIButton class]]){ [button setAlpha:0.5]; } [button setEnabled:NO]; } } - (NSString *)secondToTime:(long)seconds { long days = seconds/86400; seconds = seconds%86400; long hours = seconds/3600; seconds = seconds%3600; long minutes = ceil(seconds/60.0); seconds = seconds%60; if (days > 0) { return [NSString stringWithFormat:@"停留%zd天%zd小时%zd分",days,hours,minutes]; } else if (hours > 0) { return [NSString stringWithFormat:@"停留%zd小时%zd分",hours,minutes]; } else if(minutes > 0) { return [NSString stringWithFormat:@"停留%zd分",minutes]; } else { return @"0"; } } #pragma mark 获取当前选中时间 /// 获取当前选中时间 - (NSString *)timeConversion { NSString *currenDateStr = @""; if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"今天")]) { NSString *today = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970]; currenDateStr = today; [self setBtnBadRoGoodFlag:NO WithBtn:self.afterDayBtn]; } else if([self.dayTimeBtn.currentTitle isEqualToString:GJText(@"昨天")]) { NSString *yesterday = [UICommon getDateFormatWithStr:@"yyyy-MM-dd" timeInterval:[NSDate date].timeIntervalSince1970 - 60*60*24]; currenDateStr = yesterday; [self setBtnBadRoGoodFlag:YES WithBtn:self.afterDayBtn]; } else { currenDateStr = self.dayTimeBtn.titleLabel.text; [self setBtnBadRoGoodFlag:YES WithBtn:self.afterDayBtn]; } return currenDateStr; } - (NSInteger)getTimeStrWithString:(NSString*)str { NSDateFormatter*dateFormatter=[[NSDateFormatter alloc]init];// 创建一个时间格式化对象 [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; //设定时间的格式 NSDate*tempDate = [dateFormatter dateFromString:str];//将字符串转换为时间对象 NSInteger timeStr = [tempDate timeIntervalSince1970];//字符串转成时间戳,精确到毫秒*1000returntimeStr; return timeStr; } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end