diff --git a/OrderScheduling.xcodeproj/project.pbxproj b/OrderScheduling.xcodeproj/project.pbxproj index 8dd299c..f178488 100644 --- a/OrderScheduling.xcodeproj/project.pbxproj +++ b/OrderScheduling.xcodeproj/project.pbxproj @@ -38,6 +38,7 @@ 7940277A2B3BD46B00EC52D4 /* VehicleMonitoringConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794027792B3BD46B00EC52D4 /* VehicleMonitoringConfigView.swift */; }; 7940277C2B3E9ECB00EC52D4 /* ConditionalSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7940277B2B3E9ECB00EC52D4 /* ConditionalSearchView.swift */; }; 7940277E2B43B9B600EC52D4 /* ConditionalSearchTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7940277D2B43B9B600EC52D4 /* ConditionalSearchTool.swift */; }; + 794027842B4E330900EC52D4 /* MapPointAnnotationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794027832B4E330900EC52D4 /* MapPointAnnotationExtension.swift */; }; 794FBB0D2A8F040D00D57BB8 /* HistoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794FBB0C2A8F040D00D57BB8 /* HistoryController.swift */; }; 794FBB142A8F045F00D57BB8 /* MineController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794FBB132A8F045F00D57BB8 /* MineController.swift */; }; 794FBB162A8F1A3300D57BB8 /* RescuePhotoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 794FBB152A8F1A3300D57BB8 /* RescuePhotoController.swift */; }; @@ -143,6 +144,7 @@ 794027792B3BD46B00EC52D4 /* VehicleMonitoringConfigView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleMonitoringConfigView.swift; sourceTree = ""; }; 7940277B2B3E9ECB00EC52D4 /* ConditionalSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionalSearchView.swift; sourceTree = ""; }; 7940277D2B43B9B600EC52D4 /* ConditionalSearchTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionalSearchTool.swift; sourceTree = ""; }; + 794027832B4E330900EC52D4 /* MapPointAnnotationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapPointAnnotationExtension.swift; sourceTree = ""; }; 794FBB0C2A8F040D00D57BB8 /* HistoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryController.swift; sourceTree = ""; }; 794FBB132A8F045F00D57BB8 /* MineController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MineController.swift; sourceTree = ""; }; 794FBB152A8F1A3300D57BB8 /* RescuePhotoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RescuePhotoController.swift; sourceTree = ""; }; @@ -519,6 +521,7 @@ 79E434242AA1919400AEB16C /* CommonAlertView.swift */, 7940277B2B3E9ECB00EC52D4 /* ConditionalSearchView.swift */, 7940277D2B43B9B600EC52D4 /* ConditionalSearchTool.swift */, + 794027832B4E330900EC52D4 /* MapPointAnnotationExtension.swift */, ); path = View; sourceTree = ""; @@ -968,6 +971,7 @@ files = ( 794FBB232A93519800D57BB8 /* AppUpdateTool.swift in Sources */, 79CECC242A8B16D400B95D8B /* VehicleMonitoringListController.swift in Sources */, + 794027842B4E330900EC52D4 /* MapPointAnnotationExtension.swift in Sources */, 79E434282AA1EFA500AEB16C /* SystemCall.swift in Sources */, 79B966382AB0651C00308A8D /* VehicleLogoutView.swift in Sources */, 791887BD2A83952D007EA0C1 /* Entry.swift in Sources */, diff --git a/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate b/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate index ef464d3..b415562 100644 Binary files a/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate and b/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index b11ab19..8e0d653 100644 --- a/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/OrderScheduling.xcworkspace/xcuserdata/zd.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -221,8 +221,8 @@ filePath = "OrderScheduling/Rescue/ViewController/DispatchOrderController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "361" - endingLineNumber = "361" + startingLineNumber = "484" + endingLineNumber = "484" landmarkName = "dd_mapView(_:didAnnotationViewTapped:)" landmarkType = "7"> @@ -253,8 +253,8 @@ filePath = "OrderScheduling/Rescue/ViewController/DispatchOrderController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "140" - endingLineNumber = "140" + startingLineNumber = "92" + endingLineNumber = "92" landmarkName = "addActions()" landmarkType = "7"> @@ -316,8 +316,8 @@ filePath = "OrderScheduling/Rescue/ViewController/DispatchOrderController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "158" - endingLineNumber = "158" + startingLineNumber = "110" + endingLineNumber = "110" landmarkName = "addActions()" landmarkType = "7"> @@ -5063,8 +5063,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1297" - endingLineNumber = "1297" + startingLineNumber = "1283" + endingLineNumber = "1283" landmarkName = "init(taskModels:)" landmarkType = "7"> @@ -5111,8 +5111,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1309" - endingLineNumber = "1309" + startingLineNumber = "1295" + endingLineNumber = "1295" landmarkName = "init(taskModels:)" landmarkType = "7"> @@ -5159,8 +5159,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1311" - endingLineNumber = "1311" + startingLineNumber = "1297" + endingLineNumber = "1297" landmarkName = "init(taskModels:)" landmarkType = "7"> @@ -5254,8 +5254,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1138" - endingLineNumber = "1138" + startingLineNumber = "1124" + endingLineNumber = "1124" landmarkName = "listContainerView(_:initListFor:)" landmarkType = "7"> @@ -5270,8 +5270,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1441" - endingLineNumber = "1441" + startingLineNumber = "1427" + endingLineNumber = "1427" landmarkName = "updateData(taskModel:)" landmarkType = "7"> @@ -5302,8 +5302,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1300" - endingLineNumber = "1300" + startingLineNumber = "1286" + endingLineNumber = "1286" landmarkName = "init(taskModels:)" landmarkType = "7"> @@ -5318,8 +5318,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1313" - endingLineNumber = "1313" + startingLineNumber = "1299" + endingLineNumber = "1299" landmarkName = "init(taskModels:)" landmarkType = "7"> @@ -5334,8 +5334,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1143" - endingLineNumber = "1143" + startingLineNumber = "1129" + endingLineNumber = "1129" landmarkName = "categoryView(_:didSelectedItemAt:)" landmarkType = "7"> @@ -5350,8 +5350,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1312" - endingLineNumber = "1312" + startingLineNumber = "1298" + endingLineNumber = "1298" landmarkName = "init(taskModels:)" landmarkType = "7"> @@ -5542,8 +5542,8 @@ filePath = "OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "1447" - endingLineNumber = "1447" + startingLineNumber = "1433" + endingLineNumber = "1433" landmarkName = "listView()" landmarkType = "7"> @@ -6026,5 +6026,293 @@ landmarkType = "7"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OrderScheduling/Common/View/MapPointAnnotationExtension.swift b/OrderScheduling/Common/View/MapPointAnnotationExtension.swift new file mode 100644 index 0000000..68d3e30 --- /dev/null +++ b/OrderScheduling/Common/View/MapPointAnnotationExtension.swift @@ -0,0 +1,23 @@ +// +// MapPointAnnotationExtension.swift +// OrderScheduling +// +// Created by 中道 on 2024/1/10. +// + +import Foundation +import DDMAMapKit_Private + +extension MAPointAnnotation { + struct DDMAPointAnnotationKey { + static var vehicleIdKey : Int = 0 + } + public var vehicleId : Int? { + get { + return objc_getAssociatedObject(self, &DDMAPointAnnotationKey.vehicleIdKey) as? Int + } + set { + objc_setAssociatedObject(self, &DDMAPointAnnotationKey.vehicleIdKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } +} diff --git a/OrderScheduling/HttpResponseModel/ResponseModel.swift b/OrderScheduling/HttpResponseModel/ResponseModel.swift index 4c06cba..e4e1b6a 100644 --- a/OrderScheduling/HttpResponseModel/ResponseModel.swift +++ b/OrderScheduling/HttpResponseModel/ResponseModel.swift @@ -151,9 +151,12 @@ class DispatchVehicleListDataModel : Decodable { var driverPhone : String? var lon : String? var lat : String? - var vehicleStatus : VehicleStatusModel - var onlineStatus : OnlineStatusModel + var vehicleStatus : VehicleStatusModel? + var onlineStatus : OnlineStatusModel? var distance : Double? + var vehicleTypeStr : String? + var zIndex : Int? = 0 + var isSelected : Bool? = false } class ToDoMessageCountDataModel : Decodable { diff --git a/OrderScheduling/Rescue/ViewController/DispatchOrderController.swift b/OrderScheduling/Rescue/ViewController/DispatchOrderController.swift index 701f8a8..ff564e0 100644 --- a/OrderScheduling/Rescue/ViewController/DispatchOrderController.swift +++ b/OrderScheduling/Rescue/ViewController/DispatchOrderController.swift @@ -12,6 +12,8 @@ import RxSwift import RxRelay import DDAutoUIKit_Private import DDMAMapKit_Private +import DDUIGestureRecognizer +import DDUtilsSwiftKit_Private fileprivate let dispatchPannelViewHeight = auto(300) fileprivate let dispatchPannelViewTopInset = auto(45) @@ -29,36 +31,6 @@ extension DispatchOrderController { dispatchOrderView.maMapView.maMapView.addAnnotation(serviceAddressPointAnnotation) dispatchOrderView.maMapView.maMapView.setCenter(serviceAddressCoordinate, animated: true) - dispatchOrderView.tapGes.rx.event - .observe(on: MainScheduler.instance) - .subscribe(onNext: {[weak self] _ in - self?.dispatchOrderView.coverView.isHidden = true - - self?.dispatchOrderView.dispatchPannelView.snp.updateConstraints({ make in - make.bottom.equalToSuperview().offset((dispatchPannelViewHeight - dispatchPannelViewTopInset) - (self?.view.safeAreaInsets.bottom ?? 0)) - }) - - UIView.animate(withDuration: 0.25) {[weak self] in - self?.dispatchOrderView.layoutIfNeeded() - } - }) - .disposed(by: disposeBag) - - dispatchOrderView.panGes.rx.event - .observe(on: MainScheduler.instance) - .subscribe(onNext: {[weak self] _ in - self?.dispatchOrderView.coverView.isHidden = true - - self?.dispatchOrderView.dispatchPannelView.snp.updateConstraints({ make in - make.bottom.equalToSuperview().offset((dispatchPannelViewHeight - dispatchPannelViewTopInset) - (self?.view.safeAreaInsets.bottom ?? 0)) - }) - - UIView.animate(withDuration: 0.25) {[weak self] in - self?.dispatchOrderView.layoutIfNeeded() - } - }) - .disposed(by: disposeBag) - dispatchOrderView.dispatchPannelView.onlineButton.rx.tap .observe(on: MainScheduler.instance) .subscribe(onNext: {[weak self] _ in @@ -69,16 +41,6 @@ extension DispatchOrderController { self?.dispatchOrderView.dispatchPannelView.tableView.isHidden = false self?.dispatchOrderView.dispatchPannelView.offlineView.isHidden = true } - - self?.dispatchOrderView.coverView.isHidden = false - - self?.dispatchOrderView.dispatchPannelView.snp.updateConstraints({ make in - make.bottom.equalToSuperview().offset(0) - }) - - UIView.animate(withDuration: 0.25) {[weak self] in - self?.dispatchOrderView.layoutIfNeeded() - } }) .disposed(by: disposeBag) @@ -92,16 +54,6 @@ extension DispatchOrderController { self?.dispatchOrderView.dispatchPannelView.tableView.isHidden = true self?.dispatchOrderView.dispatchPannelView.offlineView.isHidden = false } - - self?.dispatchOrderView.coverView.isHidden = false - - self?.dispatchOrderView.dispatchPannelView.snp.updateConstraints({ make in - make.bottom.equalToSuperview().offset(0) - }) - - UIView.animate(withDuration: 0.25) {[weak self] in - self?.dispatchOrderView.layoutIfNeeded() - } }) .disposed(by: disposeBag) @@ -167,8 +119,10 @@ extension DispatchOrderController { // 重新计算数组 self?.resultArr.removeAll() self?.resultArr.append(contentsOf: array) - self?.dispatchOrderView.maMapView.maMapView.removeAnnotations(self?.vehicleAnnotions) - self?.vehicleAnnotions.removeAll() + self?.dispatchOrderView.maMapView.maMapView.removeAnnotations(self?.dispatchOrderView.maMapView.maMapView.annotations) + + self?.isShowSmallAnnotation = false + self?.shouldShowSmallAnnotation = true for index in 0.. 0 , let annotations = self?.dispatchOrderView.maMapView.maMapView.annotations { - self?.dispatchOrderView.maMapView.maMapView.showAnnotations(annotations, edgePadding:UIEdgeInsets(top: mapInsetTopSafeArea, left: 0, bottom: dispatchPannelViewHeight + mapInsetBottomSafeArea, right: 0), animated: true) + DispatchQueue.main.async {[weak self] in + self?.dispatchOrderView.maMapView.maMapView.showAnnotations(annotations, edgePadding:UIEdgeInsets(top: mapInsetTopSafeArea, left: 0, bottom: dispatchPannelViewHeight + mapInsetBottomSafeArea, right: 0), animated: true) + } } self?.dispatchOrderView.dispatchPannelView.tableView.reloadData() } @@ -206,6 +161,167 @@ extension DispatchOrderController { } }) } + + func annotationViewStateConfig(annotationView: DispatchMapStatePointAnnotation,vehicleModel: DispatchVehicleListDataModel, shouldShowSmallAnnotation: Bool) { + var backgroundColor : UIColor? + var bigImage : UIImage? + var middleImage : UIImage? + + switch vehicleModel.vehicleStatus?.code { + case .offLine,.lostConnection: + backgroundColor = .hex("858585") + bigImage = UIImage(named: "vehicleMonitoring_offline_big") + middleImage = UIImage(named: "vehicleMonitor_offline_cell_flag_bg") + break + case .onLine,.leisure: + backgroundColor = .hex("067BB9") + bigImage = UIImage(named: "vehicleMonitoring_empty_big") + middleImage = UIImage(named: "vehicleMonitor_empty_cell_flag_bg") + break + case .busy: + backgroundColor = .hex("F05412") + bigImage = UIImage(named: "vehicleMonitoring_busy_big") + middleImage = UIImage(named: "vehicleMonitor_busy_cell_onlne_bg") + break + case .BuyBusy: + backgroundColor = .hex("F05412") + bigImage = UIImage(named: "vehicleMonitoring_busy_big") + middleImage = UIImage(named: "vehicleMonitor_busy_cell_onlne_bg") + break + case .none: + backgroundColor = .hex("858585") + bigImage = UIImage(named: "vehicleMonitoring_offline_big") + middleImage = UIImage(named: "vehicleMonitor_offline_cell_flag_bg") + break + } + + switch vehicleModel.onlineStatus?.code { + case .onLine: + annotationView.bigStateLabel.textColor = .white + annotationView.middleStateLabel.textColor = .white + break + default: + annotationView.bigStateLabel.textColor = .hex("CCCCCC") + annotationView.middleStateLabel.textColor = .hex("CCCCCC") + break + } + + if vehicleModel.isSelected == true { + annotationView.bigImageView.isHidden = false + annotationView.bigStateLabel.isHidden = false + annotationView.smallImageView.isHidden = true + annotationView.middleImageView.isHidden = true + annotationView.bigImageView.image = bigImage + annotationView.bigStateLabel.text = vehicleModel.vehicleTypeStr + }else{ + annotationView.bigImageView.isHidden = true + annotationView.bigStateLabel.isHidden = true + if shouldShowSmallAnnotation == true { + annotationView.smallImageView.isHidden = false + annotationView.middleImageView.isHidden = true + annotationView.middleStateLabel.isHidden = true + annotationView.titleLabel.isHidden = true + annotationView.smallImageView.backgroundColor = backgroundColor + }else{ + annotationView.smallImageView.isHidden = true + annotationView.middleImageView.isHidden = false + annotationView.middleStateLabel.isHidden = false + annotationView.titleLabel.isHidden = false + annotationView.middleImageView.image = middleImage + annotationView.middleStateLabel.text = vehicleModel.vehicleTypeStr + } + } + + annotationView.titleLabel.text = vehicleModel.vehicleName + } + + func selectVehicle(selectState: Bool,vehicleModel: DispatchVehicleListDataModel, currentTableViewVehicleModels: [DispatchVehicleListDataModel],selectIndex: Int, mapView: MAMapView) { + + resetSelectedOfDataModel() + + /// 在当前mapModel中查找vehicleId,如果找到的话就先删除再添加 + if let selectedModel = currentTableViewVehicleModels.first(where: {[weak self] model in + return model.vehicleId == self?.selectedVehicleId + }) { + if let tag = currentTableViewVehicleModels.firstIndex(where: { model in + return selectedModel.vehicleId == model.vehicleId + }) { + if let annotation = mapView.annotations.first(where: { annotation in + let pointAnnotation = annotation as? MAPointAnnotation + return pointAnnotation?.vehicleId == selectedModel.vehicleId + }) { + mapView.removeAnnotation(annotation as? MAAnnotation) + + selectedModel.isSelected = false + let coordinate = CLLocationCoordinate2D(latitude: Double(selectedModel.lat ?? "0") ?? 0, longitude: Double(selectedModel.lon ?? "0") ?? 0) + let pointAnnotation = MAPointAnnotation.init() + pointAnnotation.annotationClass = DispatchMapStatePointAnnotation.self + pointAnnotation.coordinate = coordinate + pointAnnotation.tag = tag + mapView.addAnnotation(pointAnnotation) + } + } + } + + /// 找到当前的车辆 + /// 移除之前的annotation + if let oldAnnotation = mapView.annotations.first(where: { annotation in + let pointAnnotation = annotation as? MAPointAnnotation + return pointAnnotation?.tag == selectIndex + }) { + mapView.removeAnnotation(oldAnnotation as? MAAnnotation) + } + + /// 将当前选中设为true + vehicleModel.isSelected = selectState + zIndex+=1 + vehicleModel.zIndex = zIndex + + /// 重新添加新的annotation + let coordinate = CLLocationCoordinate2D(latitude: Double(vehicleModel.lat ?? "0") ?? 0, longitude: Double(vehicleModel.lon ?? "0") ?? 0) + let pointAnnotation = MAPointAnnotation.init() + pointAnnotation.annotationClass = DispatchMapStatePointAnnotation.self + pointAnnotation.coordinate = coordinate + pointAnnotation.tag = selectIndex + mapView.addAnnotation(pointAnnotation) + + /// 记录当前的选中车辆id + selectedVehicleId = vehicleModel.vehicleId + + /// 刷新tableview + dispatchOrderView.dispatchPannelView.tableView.reloadData() + } + + func resetSelectedOfDataModel() { + // 去掉其他tableview的选中 + for index in 0...create(bufferSize: 1) public var dispatchCompletionHandler: ((Int) -> Void)? + + private var shouldShowSmallAnnotation : Bool? = true /// 用于标记是否需要显示最小的annotation + private var isShowSmallAnnotation : Bool? = false /// 用于标记是否已经显示最小的annotation + + public var zIndex = 0 /// 用于annotation的位置靠前靠后 + + private var selectedModel : DispatchVehicleListDataModel? /// 用于选中 + private var selectedVehicleId : Int? /// 用于选中 + + private let pannelPanGes = DDUIPanGestureRecognizer.init() /// 用于pannel的拖动效果 + public init(userOrderId:Int,taskOrderId:Int,serviceAddressLat:Double,serviceAddressLon:Double) { self.userOrderId = userOrderId self.taskOrderId = taskOrderId @@ -402,9 +563,17 @@ open class DispatchOrderController : ZDViewController { bottomView.backgroundColor = .white view.addSubview(bottomView) + dispatchOrderView.maMapView.maMapView.isRotateCameraEnabled = false dispatchOrderView.maMapView.delegate = self dispatchOrderView.dispatchPannelView.tableView.delegate = self dispatchOrderView.dispatchPannelView.tableView.dataSource = self + + pannelPanGes.panGesValue.from = .bottom + pannelPanGes.expandLevelChangedHandler = {[weak self] old, new in + self?.modifyMapAnchor() + } + pannelPanGes.panGesValue.expandLevel = .max + dispatchOrderView.dispatchPannelView.addGestureRecognizer(pannelPanGes) } open override func viewWillLayoutSubviews() { @@ -419,6 +588,18 @@ open class DispatchOrderController : ZDViewController { } } + open override func viewSafeAreaInsetsDidChange() { + super.viewSafeAreaInsetsDidChange() + var bottom : CGFloat = 0 + if view.safeAreaInsets.bottom != 0 { + bottom = view.safeAreaInsets.bottom + } + + pannelPanGes.panGesValue.minDisplayHeight = dispatchPannelViewTopInset + bottom + pannelPanGes.panGesValue.maxDisplayHeight = dispatchPannelViewHeight + pannelPanGes.panGesValue.defaultDisplayHeight = dispatchPannelViewHeight + } + open override var preferredStatusBarStyle: UIStatusBarStyle { return .darkContent } @@ -426,9 +607,12 @@ open class DispatchOrderController : ZDViewController { open class DispatchOrderPannelCell : DDTableViewCell { private let radiusView : DDView + public let icon : DDImageView + public let iconStateLabel : DDLabel public let stateLabel : DDLabel + public let nameView : DDView public let name : DDLabel - public let phone : DDLabel + public let phoneButton : DDButton public let distance : DDLabel public let dispatchButton : DDButton public var dispatchLayer : CAGradientLayer = { @@ -445,9 +629,12 @@ open class DispatchOrderPannelCell : DDTableViewCell { public override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { radiusView = DDView() + icon = DDImageView() + iconStateLabel = DDLabel.dd_init(withText: "", font: .mediumFont(auto(10)), textColor: .white) stateLabel = DDLabel.dd_init(withText: "", font: .mediumFont(auto(13)), textColor: .hex("3364B7")) + nameView = DDView() name = DDLabel.dd_init(withText: "", font: .mediumFont(auto(13)), textColor: .hex("3364B7")) - phone = DDLabel.dd_init(withText: "", font: .mediumFont(auto(13)), textColor: .hex("3364B7")) + phoneButton = DDButton.dd_initCustom() distance = DDLabel.dd_init(withText: "", font: .mediumFont(auto(13)), textColor: .hex("3364B7")) dispatchButton = DDButton.dd_initCustom() super.init(style: style, reuseIdentifier: reuseIdentifier) @@ -456,11 +643,18 @@ open class DispatchOrderPannelCell : DDTableViewCell { // stateLabel.lineBreakMode = .byTruncatingMiddle radiusView.backgroundColor = .white contentView.addSubview(radiusView) + radiusView.addSubview(icon) + iconStateLabel.textAlignment = .center + icon.addSubview(iconStateLabel) stateLabel.numberOfLines = 0 radiusView.addSubview(stateLabel) + radiusView.addSubview(nameView) name.numberOfLines = 0 - radiusView.addSubview(name) - radiusView.addSubview(phone) + nameView.isUserInteractionEnabled = true + nameView.addSubview(name) + phoneButton.setImage(UIImage(named: "vehicleMonitor_call_cell"), for: .normal) + phoneButton.isUserInteractionEnabled = true + nameView.addSubview(phoneButton) distance.numberOfLines = 0 radiusView.addSubview(distance) dispatchButton.layer.cornerRadius = auto(4) @@ -475,26 +669,40 @@ open class DispatchOrderPannelCell : DDTableViewCell { make.height.greaterThanOrEqualTo(auto(44)).priority(.high) } + icon.snp.makeConstraints { make in + make.left.equalToSuperview().offset(auto(10)) + make.centerY.equalToSuperview() + } + + iconStateLabel.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + stateLabel.snp.makeConstraints { make in - make.left.equalTo(auto(10)) + make.left.equalTo(icon.snp.right).offset(auto(5)) make.centerY.equalToSuperview() make.width.equalTo(auto(95)) } + nameView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview() + make.height.greaterThanOrEqualTo(phoneButton) + } + name.snp.makeConstraints { make in - make.left.equalTo(stateLabel.snp.right).offset(auto(5)) + make.left.equalToSuperview() make.centerY.equalToSuperview() - make.width.equalTo(auto(40)) } - phone.snp.makeConstraints { make in - make.left.equalTo(name.snp.right).offset(auto(5)) + phoneButton.snp.makeConstraints { make in + make.left.equalTo(name.snp.right) + make.right.equalToSuperview() make.centerY.equalToSuperview() - make.width.equalTo(auto(100)) } - + distance.snp.makeConstraints { make in - make.left.equalTo(phone.snp.right).offset(0) + make.right.equalTo(dispatchButton.snp.left).offset(-auto(5)) make.centerY.equalToSuperview() make.width.equalTo(auto(60)) } @@ -524,31 +732,18 @@ open class DispatchOrderPannelCell : DDTableViewCell { open class DispatchOrderView : DDView { public let dispatchPannelView : DispatchOrderPannelView public let maMapView : DDMAMapView - public let coverView : DDView - public let tapGes : UITapGestureRecognizer - public let panGes : UIPanGestureRecognizer public override init(frame: CGRect) { dispatchPannelView = DispatchOrderPannelView() maMapView = DDMAMapView() - coverView = DDView() - tapGes = UITapGestureRecognizer() - panGes = UIPanGestureRecognizer() super.init(frame: frame) addSubview(maMapView) - coverView.addGestureRecognizer(tapGes) - coverView.addGestureRecognizer(panGes) - addSubview(coverView) addSubview(dispatchPannelView) maMapView.snp.makeConstraints { make in make.edges.equalToSuperview() } - - coverView.snp.makeConstraints { make in - make.edges.equalToSuperview() - } - + dispatchPannelView.snp.makeConstraints { make in make.bottom.equalToSuperview() make.left.right.equalToSuperview() @@ -613,12 +808,12 @@ open class DispatchOrderPannelView : DDView { tapBackgroundView.snp.makeConstraints { make in make.left.right.equalToSuperview() make.top.equalToSuperview().offset(-auto(20)) - make.height.equalTo(auto(65)) + make.height.equalTo(dispatchPannelViewTopInset + auto(20)) } onlineButton.snp.makeConstraints { make in make.top.equalToSuperview() - make.height.equalTo(auto(45)) + make.height.equalTo(dispatchPannelViewTopInset) make.width.equalToSuperview().multipliedBy(0.5) make.left.equalToSuperview() } @@ -626,7 +821,7 @@ open class DispatchOrderPannelView : DDView { offlineButton.snp.makeConstraints { make in make.top.equalToSuperview() make.right.equalToSuperview() - make.height.equalTo(auto(45)) + make.height.equalTo(dispatchPannelViewTopInset) make.width.equalToSuperview().multipliedBy(0.5) } @@ -794,91 +989,127 @@ class DispatchMapSericeAddressPointAnnotation : MAAnnotationView { } } -class DispatchMapStatePointAnnotation : MAAnnotationView { - public let radiusView : DDView - public let stateImageView : DDImageView - public let stateLabel : DDLabel - public let nameLabel : DDLabel - public let verticalView : UIView - public let pointView : UIView - +open class DispatchMapStatePointAnnotation : MAAnnotationView { + public let clearView : DDView + public var disposeBag : DisposeBag + public var smallImageView : DDImageView + public var middleImageView : DDImageView + public var bigImageView : DDImageView + public var titleLabel : DDLabel + public var middleStateLabel : DDLabel + public var bigStateLabel : DDLabel + public var middleWorkingCountlabel : DDLabel + public var bigWorkingCountlabel : DDLabel override init!(annotation: MAAnnotation!, reuseIdentifier: String!) { - radiusView = DDView.init() - stateImageView = DDImageView.init() - stateLabel = DDLabel.dd_init(withText: "", font: .mediumFont(auto(10)), textColor: .white(alpha: 1.0)) - nameLabel = DDLabel.dd_init(withText: "", font: .mediumFont(auto(12)), textColor: .hex("#2C395F")) - verticalView = UIView.init() - pointView = UIView.init() + clearView = DDView.init() + disposeBag = DisposeBag() + smallImageView = DDImageView() + middleImageView = DDImageView() + bigImageView = DDImageView() + titleLabel = DDLabel.dd_init(withText: "", font: .mediumFont(11), textColor: .hex("03030F")) + middleStateLabel = DDLabel.dd_init(withText: "", font: .mediumFont(10), textColor: .white) + bigStateLabel = DDLabel.dd_init(withText: "", font: .mediumFont(18), textColor: .white) + middleWorkingCountlabel = DDLabel.dd_init(withText: "", font: .mediumFont(7), textColor: .white) + bigWorkingCountlabel = DDLabel.dd_init(withText: "", font: .mediumFont(9), textColor: .white) super.init(annotation: annotation, reuseIdentifier: reuseIdentifier) setUpSubviews() } - required init?(coder: NSCoder) { + required public init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + open override func prepareForReuse() { + super.prepareForReuse() + disposeBag = DisposeBag() + } + func setUpSubviews(){ - backgroundColor = .white - frame = CGRect(x: 0, y: 0, width: auto(100), height: auto(30)) - layer.cornerRadius = auto(4) + clearView.isUserInteractionEnabled = false + addSubview(clearView) - radiusView.backgroundColor = .white(alpha: 1) - radiusView.layer.cornerRadius = auto(4) - radiusView.layer.masksToBounds = true - radiusView.isUserInteractionEnabled = false - addSubview(radiusView) - radiusView.snp.makeConstraints { make in - make.top.equalTo(0) - make.centerX.equalToSuperview() - make.width.equalTo(auto(100)) - make.height.equalTo(auto(30)) - } + smallImageView.layer.cornerRadius = auto(5) + smallImageView.layer.borderColor = UIColor.white.cgColor + smallImageView.layer.borderWidth = 1 + smallImageView.backgroundColor = .hex("858585") + clearView.addSubview(smallImageView) - stateImageView.isUserInteractionEnabled = false - radiusView.addSubview(stateImageView) - stateImageView.snp.makeConstraints { make in - make.left.top.bottom.equalToSuperview() - make.centerY.equalToSuperview() - make.width.height.equalTo(auto(30)) - } + titleLabel.textAlignment = .center + clearView.addSubview(titleLabel) - stateLabel.textAlignment = .center - stateLabel.isUserInteractionEnabled = false - stateImageView.addSubview(stateLabel) - stateLabel.snp.makeConstraints { make in + middleImageView.layer.cornerRadius = auto(11) + middleImageView.layer.borderColor = UIColor.white.cgColor + middleImageView.layer.borderWidth = 1 + middleImageView.backgroundColor = .hex("858585") + clearView.addSubview(middleImageView) + middleImageView.addSubview(middleStateLabel) + middleWorkingCountlabel.backgroundColor = .hex("F93D3D") + middleWorkingCountlabel.textAlignment = .center + middleWorkingCountlabel.layer.borderColor = UIColor.white.cgColor + middleWorkingCountlabel.layer.borderWidth = 1 + middleImageView.addSubview(middleWorkingCountlabel) + + clearView.addSubview(bigImageView) + bigImageView.addSubview(bigStateLabel) + bigWorkingCountlabel.backgroundColor = .hex("F93D3D") + bigWorkingCountlabel.textAlignment = .center + bigWorkingCountlabel.layer.borderColor = UIColor.white.cgColor + bigWorkingCountlabel.layer.borderWidth = 1 + bigImageView.addSubview(bigWorkingCountlabel) + + clearView.snp.makeConstraints { make in make.edges.equalToSuperview() } - nameLabel.textAlignment = .center - nameLabel.numberOfLines = 0 - nameLabel.isUserInteractionEnabled = false - radiusView.addSubview(nameLabel) - nameLabel.snp.makeConstraints { make in - make.left.equalTo(stateImageView.snp.right) - make.right.equalToSuperview() - make.centerY.equalTo(stateImageView.snp.centerY) - } - - verticalView.isUserInteractionEnabled = false - addSubview(verticalView) - verticalView.snp.makeConstraints { make in - make.centerX.equalToSuperview() - make.top.equalTo(radiusView.snp.bottom) - make.width.equalTo(auto(2.5)) - make.height.equalTo(auto(15)) - } - - pointView.isUserInteractionEnabled = false - pointView.layer.cornerRadius = auto(5) - pointView.layer.borderColor = UIColor.white.cgColor - pointView.layer.borderWidth = auto(2) - addSubview(pointView) - pointView.snp.makeConstraints { make in - make.centerX.equalTo(verticalView.snp.centerX) - make.top.equalTo(verticalView.snp.bottom).offset(0) + smallImageView.snp.makeConstraints { make in + make.centerX.centerY.equalToSuperview() make.width.height.equalTo(auto(10)) } + titleLabel.snp.makeConstraints { make in + make.bottom.left.right.equalToSuperview() + } + + middleImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().priority(.high) + make.width.height.equalTo(auto(22)) + make.bottom.equalTo(titleLabel.snp.top) + } + + middleStateLabel.snp.makeConstraints { make in + make.centerX.centerY.equalTo(middleImageView) + } + + middleWorkingCountlabel.layer.cornerRadius = auto(5) + middleWorkingCountlabel.layer.masksToBounds = true + middleWorkingCountlabel.isHidden = true + middleWorkingCountlabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(-auto(5)) + make.right.equalToSuperview().offset(auto(5)) + make.width.height.equalTo(10) + } + + bigImageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.top.equalToSuperview().priority(.high) + make.width.equalTo(auto(42)) + make.height.equalTo(auto(50)) + make.bottom.equalTo(titleLabel.snp.top) + } + + bigStateLabel.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.centerY.equalToSuperview().offset(-auto(4)) + } + + bigWorkingCountlabel.layer.cornerRadius = auto(7.5) + bigWorkingCountlabel.layer.masksToBounds = true + bigWorkingCountlabel.isHidden = true + bigWorkingCountlabel.snp.makeConstraints { make in + make.top.equalToSuperview().offset(-auto(2.5)) + make.right.equalToSuperview().offset(auto(2.5)) + make.width.height.equalTo(15) + } } } - diff --git a/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift b/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift index 73da954..19c6a22 100644 --- a/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift +++ b/OrderScheduling/VehicleMonitoring/ViewController/VehicleMonitoringController.swift @@ -705,9 +705,9 @@ extension VehicleMonitoringController { func showMapCenter(with vehicleModel: VehicleMonitorListDataModel.ItemModel) { /// 将镜头设置为选中的item,需要修改锚点 if let lat = vehicleModel.lat,let lon = vehicleModel.lon { - vehicleMonitoringView.maMapView.maMapView.setCenter(CLLocationCoordinate2D(latitude: Double(lat) ?? 0, longitude: Double(lon) ?? 0), animated: true) - modifyMapAnchor() + + vehicleMonitoringView.maMapView.maMapView.setCenter(CLLocationCoordinate2D(latitude: Double(lat) ?? 0, longitude: Double(lon) ?? 0), animated: true) } } @@ -1114,20 +1114,6 @@ open class VehicleMonitoringPointAnnotation : MAAnnotationView { } } -extension MAPointAnnotation { - struct DDMAPointAnnotationKey { - static var vehicleIdKey : Int = 0 - } - public var vehicleId : Int? { - get { - return objc_getAssociatedObject(self, &DDMAPointAnnotationKey.vehicleIdKey) as? Int - } - set { - objc_setAssociatedObject(self, &DDMAPointAnnotationKey.vehicleIdKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } -} - class VehicleMonitoringListDetailView : DDView, JXCategoryListContainerViewDelegate, JXCategoryViewDelegate { func number(ofListsInlistContainerView listContainerView: JXCategoryListContainerView!) -> Int { return taskModels.count diff --git a/fastlane/report.xml b/fastlane/report.xml index e9c6e0d..8e022c7 100644 --- a/fastlane/report.xml +++ b/fastlane/report.xml @@ -5,17 +5,17 @@ - + - + - +