Commit 992c5094 authored by Steven杜宇's avatar Steven杜宇

Merge branch 'develop' of http://gitlab.galaxy-immi.com/mobile-group/galaxy-iOS into develop

parents c8cd1043 df0e361f
......@@ -223,6 +223,13 @@
044F39322CB64CC0007CA277 /* YHBottomPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F39312CB64CC0007CA277 /* YHBottomPresentationController.swift */; };
044F39342CB6507D007CA277 /* YHVisaRenewalGuideVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F39332CB6507D007CA277 /* YHVisaRenewalGuideVC.swift */; };
044F39362CB6574D007CA277 /* YHVisaRenewalGuideHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F39352CB6574D007CA277 /* YHVisaRenewalGuideHeaderCell.swift */; };
044F39382CB77359007CA277 /* YHVisaRenewalGuideParagraphCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F39372CB77359007CA277 /* YHVisaRenewalGuideParagraphCell.swift */; };
044F393A2CB7772D007CA277 /* YHVisaRenewalGuideRemarkCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F39392CB7772D007CA277 /* YHVisaRenewalGuideRemarkCell.swift */; };
044F393C2CB777D3007CA277 /* YHVisaRenewalGuideIndentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F393B2CB777D3007CA277 /* YHVisaRenewalGuideIndentCell.swift */; };
044F393E2CB7827B007CA277 /* YHVisaRenewalGuideTipsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F393D2CB7827B007CA277 /* YHVisaRenewalGuideTipsCell.swift */; };
044F39402CB7CB6B007CA277 /* YHVisaRenewalTroubleshootingGuideVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F393F2CB7CB6B007CA277 /* YHVisaRenewalTroubleshootingGuideVC.swift */; };
044F39422CB7CCBB007CA277 /* YHVisaRenewalTroubleshootingGuideHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F39412CB7CCBB007CA277 /* YHVisaRenewalTroubleshootingGuideHeaderCell.swift */; };
044F39442CB7D72C007CA277 /* YHVisaRenewalWorkflowCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 044F39432CB7D72C007CA277 /* YHVisaRenewalWorkflowCell.swift */; };
04506F552C6F57E600738EA1 /* YHFamilyMemberInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04506F542C6F57E600738EA1 /* YHFamilyMemberInfoCell.swift */; };
045A08C02C37ABF500BCBABA /* YHSegmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 045A08BF2C37ABF500BCBABA /* YHSegmentView.swift */; };
045A08C22C37EB8B00BCBABA /* YHMyFileListNoneCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 045A08C12C37EB8B00BCBABA /* YHMyFileListNoneCell.swift */; };
......@@ -540,6 +547,18 @@
04C85DE72C36ADAE008B20D6 /* YHMyFileListHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C85DE62C36ADAE008B20D6 /* YHMyFileListHeaderView.swift */; };
04C85DE92C36BF49008B20D6 /* YHMyFileListFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C85DE82C36BF49008B20D6 /* YHMyFileListFooterView.swift */; };
04C8F4832B7216D800ADF59B /* YHUserInfoHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04C8F4822B7216D800ADF59B /* YHUserInfoHeaderView.swift */; };
04CA2BE82CB769CD00F36DE7 /* YHResignUploadTravelCardListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BE72CB769CD00F36DE7 /* YHResignUploadTravelCardListViewController.swift */; };
04CA2BEA2CB7708E00F36DE7 /* YHResignUploadTravelCardListheadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BE92CB7708E00F36DE7 /* YHResignUploadTravelCardListheadView.swift */; };
04CA2BEC2CB7740000F36DE7 /* YHResignUploadTravelCardListfootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BEB2CB7740000F36DE7 /* YHResignUploadTravelCardListfootView.swift */; };
04CA2BEE2CB7771000F36DE7 /* YHResignUploadTravelCardFootViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BED2CB7771000F36DE7 /* YHResignUploadTravelCardFootViewController.swift */; };
04CA2BF02CB7A74C00F36DE7 /* YHResignUploadTravelHKViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BEF2CB7A74C00F36DE7 /* YHResignUploadTravelHKViewController.swift */; };
04CA2BF22CB7AA7600F36DE7 /* YHResignUploadTravelPassportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BF12CB7AA7600F36DE7 /* YHResignUploadTravelPassportViewController.swift */; };
04CA2BF42CB7B33500F36DE7 /* YHResignUploadTravelGuideView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BF32CB7B33500F36DE7 /* YHResignUploadTravelGuideView.swift */; };
04CA2BFB2CB7BAC600F36DE7 /* YHResignUploadDocListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BFA2CB7BAC600F36DE7 /* YHResignUploadDocListViewController.swift */; };
04CA2BFD2CB7C36D00F36DE7 /* YHResignUploadDocListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BFC2CB7C36D00F36DE7 /* YHResignUploadDocListCell.swift */; };
04CA2BFF2CB7C9A000F36DE7 /* YHResignUploadSuccessDocListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2BFE2CB7C9A000F36DE7 /* YHResignUploadSuccessDocListCell.swift */; };
04CA2C012CB7CEDC00F36DE7 /* YHResignUploadDocDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2C002CB7CEDC00F36DE7 /* YHResignUploadDocDetailViewController.swift */; };
04CA2C032CB7D3C200F36DE7 /* YHFileExplainReasonInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CA2C022CB7D3C200F36DE7 /* YHFileExplainReasonInputView.swift */; };
04CC2EF02BC3DDB2000305DD /* YHServiceBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CC2EEF2BC3DDB2000305DD /* YHServiceBannerView.swift */; };
04CCEDF72CA0FCB10026EA70 /* YHHKImmigrationRecordsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CCEDF62CA0FCB10026EA70 /* YHHKImmigrationRecordsViewModel.swift */; };
04CCEDF92CA0FD5F0026EA70 /* YHHKImmigrationRecordsSummaryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04CCEDF82CA0FD5F0026EA70 /* YHHKImmigrationRecordsSummaryModel.swift */; };
......@@ -1095,6 +1114,13 @@
044F39312CB64CC0007CA277 /* YHBottomPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHBottomPresentationController.swift; sourceTree = "<group>"; };
044F39332CB6507D007CA277 /* YHVisaRenewalGuideVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalGuideVC.swift; sourceTree = "<group>"; };
044F39352CB6574D007CA277 /* YHVisaRenewalGuideHeaderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalGuideHeaderCell.swift; sourceTree = "<group>"; };
044F39372CB77359007CA277 /* YHVisaRenewalGuideParagraphCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalGuideParagraphCell.swift; sourceTree = "<group>"; };
044F39392CB7772D007CA277 /* YHVisaRenewalGuideRemarkCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalGuideRemarkCell.swift; sourceTree = "<group>"; };
044F393B2CB777D3007CA277 /* YHVisaRenewalGuideIndentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalGuideIndentCell.swift; sourceTree = "<group>"; };
044F393D2CB7827B007CA277 /* YHVisaRenewalGuideTipsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalGuideTipsCell.swift; sourceTree = "<group>"; };
044F393F2CB7CB6B007CA277 /* YHVisaRenewalTroubleshootingGuideVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalTroubleshootingGuideVC.swift; sourceTree = "<group>"; };
044F39412CB7CCBB007CA277 /* YHVisaRenewalTroubleshootingGuideHeaderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalTroubleshootingGuideHeaderCell.swift; sourceTree = "<group>"; };
044F39432CB7D72C007CA277 /* YHVisaRenewalWorkflowCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHVisaRenewalWorkflowCell.swift; sourceTree = "<group>"; };
04506F542C6F57E600738EA1 /* YHFamilyMemberInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHFamilyMemberInfoCell.swift; sourceTree = "<group>"; };
045A08BF2C37ABF500BCBABA /* YHSegmentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHSegmentView.swift; sourceTree = "<group>"; };
045A08C12C37EB8B00BCBABA /* YHMyFileListNoneCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyFileListNoneCell.swift; sourceTree = "<group>"; };
......@@ -1415,6 +1441,18 @@
04C85DE62C36ADAE008B20D6 /* YHMyFileListHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyFileListHeaderView.swift; sourceTree = "<group>"; };
04C85DE82C36BF49008B20D6 /* YHMyFileListFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMyFileListFooterView.swift; sourceTree = "<group>"; };
04C8F4822B7216D800ADF59B /* YHUserInfoHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHUserInfoHeaderView.swift; sourceTree = "<group>"; };
04CA2BE72CB769CD00F36DE7 /* YHResignUploadTravelCardListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadTravelCardListViewController.swift; sourceTree = "<group>"; };
04CA2BE92CB7708E00F36DE7 /* YHResignUploadTravelCardListheadView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadTravelCardListheadView.swift; sourceTree = "<group>"; };
04CA2BEB2CB7740000F36DE7 /* YHResignUploadTravelCardListfootView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadTravelCardListfootView.swift; sourceTree = "<group>"; };
04CA2BED2CB7771000F36DE7 /* YHResignUploadTravelCardFootViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadTravelCardFootViewController.swift; sourceTree = "<group>"; };
04CA2BEF2CB7A74C00F36DE7 /* YHResignUploadTravelHKViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadTravelHKViewController.swift; sourceTree = "<group>"; };
04CA2BF12CB7AA7600F36DE7 /* YHResignUploadTravelPassportViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadTravelPassportViewController.swift; sourceTree = "<group>"; };
04CA2BF32CB7B33500F36DE7 /* YHResignUploadTravelGuideView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadTravelGuideView.swift; sourceTree = "<group>"; };
04CA2BFA2CB7BAC600F36DE7 /* YHResignUploadDocListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadDocListViewController.swift; sourceTree = "<group>"; };
04CA2BFC2CB7C36D00F36DE7 /* YHResignUploadDocListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadDocListCell.swift; sourceTree = "<group>"; };
04CA2BFE2CB7C9A000F36DE7 /* YHResignUploadSuccessDocListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadSuccessDocListCell.swift; sourceTree = "<group>"; };
04CA2C002CB7CEDC00F36DE7 /* YHResignUploadDocDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHResignUploadDocDetailViewController.swift; sourceTree = "<group>"; };
04CA2C022CB7D3C200F36DE7 /* YHFileExplainReasonInputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHFileExplainReasonInputView.swift; sourceTree = "<group>"; };
04CC2EEF2BC3DDB2000305DD /* YHServiceBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHServiceBannerView.swift; sourceTree = "<group>"; };
04CCEDF62CA0FCB10026EA70 /* YHHKImmigrationRecordsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHHKImmigrationRecordsViewModel.swift; sourceTree = "<group>"; };
04CCEDF82CA0FD5F0026EA70 /* YHHKImmigrationRecordsSummaryModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHHKImmigrationRecordsSummaryModel.swift; sourceTree = "<group>"; };
......@@ -2184,6 +2222,8 @@
0449EEE52C8EE99000A397FD /* Resign(续签) */ = {
isa = PBXGroup;
children = (
04CA2BF52CB7BA3700F36DE7 /* ResignUploadDoc(续签补件) */,
04CA2BE22CB7693500F36DE7 /* UploadTravelCrad(上传旅行证件) */,
04912F652CB6A56900CC3105 /* ResignHKAppoint(在港递交预约) */,
04912F562CB6675D00CC3105 /* ResignInfoConfirm(续签信息确认) */,
044F39272CB54BB3007CA277 /* HongKongVisaRenewalPayment(续签在港缴费) */,
......@@ -2439,6 +2479,7 @@
children = (
044F392B2CB54C5E007CA277 /* YHHKVisaRenewalPaymentVC.swift */,
044F39332CB6507D007CA277 /* YHVisaRenewalGuideVC.swift */,
044F393F2CB7CB6B007CA277 /* YHVisaRenewalTroubleshootingGuideVC.swift */,
);
path = C;
sourceTree = "<group>";
......@@ -2457,6 +2498,12 @@
044F39312CB64CC0007CA277 /* YHBottomPresentationController.swift */,
044F392F2CB55D5E007CA277 /* YHDashLineView.swift */,
044F39352CB6574D007CA277 /* YHVisaRenewalGuideHeaderCell.swift */,
044F39432CB7D72C007CA277 /* YHVisaRenewalWorkflowCell.swift */,
044F39412CB7CCBB007CA277 /* YHVisaRenewalTroubleshootingGuideHeaderCell.swift */,
044F39372CB77359007CA277 /* YHVisaRenewalGuideParagraphCell.swift */,
044F39392CB7772D007CA277 /* YHVisaRenewalGuideRemarkCell.swift */,
044F393B2CB777D3007CA277 /* YHVisaRenewalGuideIndentCell.swift */,
044F393D2CB7827B007CA277 /* YHVisaRenewalGuideTipsCell.swift */,
);
path = V;
sourceTree = "<group>";
......@@ -3604,6 +3651,96 @@
path = C;
sourceTree = "<group>";
};
04CA2BE22CB7693500F36DE7 /* UploadTravelCrad(上传旅行证件) */ = {
isa = PBXGroup;
children = (
04CA2BE62CB7697300F36DE7 /* M */,
04CA2BE52CB7696C00F36DE7 /* VM */,
04CA2BE42CB7696700F36DE7 /* V */,
04CA2BE32CB7696000F36DE7 /* C */,
);
path = "UploadTravelCrad(上传旅行证件)";
sourceTree = "<group>";
};
04CA2BE32CB7696000F36DE7 /* C */ = {
isa = PBXGroup;
children = (
04CA2BE72CB769CD00F36DE7 /* YHResignUploadTravelCardListViewController.swift */,
04CA2BEF2CB7A74C00F36DE7 /* YHResignUploadTravelHKViewController.swift */,
04CA2BF12CB7AA7600F36DE7 /* YHResignUploadTravelPassportViewController.swift */,
);
path = C;
sourceTree = "<group>";
};
04CA2BE42CB7696700F36DE7 /* V */ = {
isa = PBXGroup;
children = (
04CA2BE92CB7708E00F36DE7 /* YHResignUploadTravelCardListheadView.swift */,
04CA2BEB2CB7740000F36DE7 /* YHResignUploadTravelCardListfootView.swift */,
04CA2BED2CB7771000F36DE7 /* YHResignUploadTravelCardFootViewController.swift */,
04CA2BF32CB7B33500F36DE7 /* YHResignUploadTravelGuideView.swift */,
);
path = V;
sourceTree = "<group>";
};
04CA2BE52CB7696C00F36DE7 /* VM */ = {
isa = PBXGroup;
children = (
);
path = VM;
sourceTree = "<group>";
};
04CA2BE62CB7697300F36DE7 /* M */ = {
isa = PBXGroup;
children = (
);
path = M;
sourceTree = "<group>";
};
04CA2BF52CB7BA3700F36DE7 /* ResignUploadDoc(续签补件) */ = {
isa = PBXGroup;
children = (
04CA2BF92CB7BAA800F36DE7 /* VM */,
04CA2BF82CB7BAA100F36DE7 /* M */,
04CA2BF72CB7BA9D00F36DE7 /* C */,
04CA2BF62CB7BA9800F36DE7 /* V */,
);
path = "ResignUploadDoc(续签补件)";
sourceTree = "<group>";
};
04CA2BF62CB7BA9800F36DE7 /* V */ = {
isa = PBXGroup;
children = (
04CA2BFC2CB7C36D00F36DE7 /* YHResignUploadDocListCell.swift */,
04CA2BFE2CB7C9A000F36DE7 /* YHResignUploadSuccessDocListCell.swift */,
04CA2C022CB7D3C200F36DE7 /* YHFileExplainReasonInputView.swift */,
);
path = V;
sourceTree = "<group>";
};
04CA2BF72CB7BA9D00F36DE7 /* C */ = {
isa = PBXGroup;
children = (
04CA2BFA2CB7BAC600F36DE7 /* YHResignUploadDocListViewController.swift */,
04CA2C002CB7CEDC00F36DE7 /* YHResignUploadDocDetailViewController.swift */,
);
path = C;
sourceTree = "<group>";
};
04CA2BF82CB7BAA100F36DE7 /* M */ = {
isa = PBXGroup;
children = (
);
path = M;
sourceTree = "<group>";
};
04CA2BF92CB7BAA800F36DE7 /* VM */ = {
isa = PBXGroup;
children = (
);
path = VM;
sourceTree = "<group>";
};
04CCEDF52CA0FC850026EA70 /* VM */ = {
isa = PBXGroup;
children = (
......@@ -4954,6 +5091,7 @@
045EEEF62B9F171A0022A143 /* YHSpousePrimaryInfoVC.swift in Sources */,
044867B82BA1C75700DFAD4A /* YHCertificateUploadFailTipsView.swift in Sources */,
04256DE02C72DC0600A37BA4 /* YHCertificateAppointOptionView.swift in Sources */,
04CA2BEE2CB7771000F36DE7 /* YHResignUploadTravelCardFootViewController.swift in Sources */,
044D0C062C22736F00C5CF5E /* YHSetExplainView.swift in Sources */,
04256DF02C733B2D00A37BA4 /* YHGrabNumberInfoView.swift in Sources */,
04213B252C48C15400797900 /* YHHomeIdentityViewController.swift in Sources */,
......@@ -4963,6 +5101,7 @@
04213B352C4F85A900797900 /* YHHomeLifeCategoryModel.swift in Sources */,
0430E6602C7470AD000511E2 /* YHAdopterTravelViewController.swift in Sources */,
04FB01CE2C23DDBD0040115D /* YHPeopleMatchNoDataView.swift in Sources */,
04CA2BEC2CB7740000F36DE7 /* YHResignUploadTravelCardListfootView.swift in Sources */,
A5ACE9362B4564F7002C94D2 /* YHNetworkStatusManager.swift in Sources */,
048787D52BCE880B0036E221 /* YHServiceOrderListViewController.swift in Sources */,
04912F802CB7CC0000CC3105 /* YHResignAppointedScheduleItemView.swift in Sources */,
......@@ -5007,6 +5146,7 @@
048058352C7DC7AC00502CAA /* YHMyTestViewController.swift in Sources */,
045EEEA72B9F171A0022A143 /* YHWorkExperienceViewController.swift in Sources */,
A5FD63BD2B623C2C00D1D9DA /* YHInformationPerfectListVC.swift in Sources */,
04CA2BEA2CB7708E00F36DE7 /* YHResignUploadTravelCardListheadView.swift in Sources */,
045EEE8D2B9F171A0022A143 /* YHPreviewInfoCell.swift in Sources */,
047AA3E22C4A66CE009C4554 /* YHLifeItemTableViewCell.swift in Sources */,
04358E0C2C7836BB00811928 /* YHSelectHKPlaceListView.swift in Sources */,
......@@ -5051,6 +5191,7 @@
0430E6882C771B06000511E2 /* YHAdopterItemView.swift in Sources */,
045EEEB32B9F171A0022A143 /* YHWorkFileSyncTableViewCell.swift in Sources */,
045EEEF12B9F171A0022A143 /* YHChildInfoContainerVC.swift in Sources */,
04CA2BFD2CB7C36D00F36DE7 /* YHResignUploadDocListCell.swift in Sources */,
045EEF0B2B9F171A0022A143 /* YHBasicInfoFillViewController.swift in Sources */,
0430E6582C7434F2000511E2 /* YHAdopterNewPeopleViewController.swift in Sources */,
A582B2452BBA4CF9009D098C /* YHHKPlanDocModel.swift in Sources */,
......@@ -5076,15 +5217,18 @@
A598E9E22C7CB32D00F84739 /* YHTravelDocsPreparationListModel.swift in Sources */,
A598E9D72C7C9EF300F84739 /* YHTravelDocsPreparationListViewController.swift in Sources */,
A520124F2BABCE05008655EA /* YHFileListContentView.swift in Sources */,
04CA2BFF2CB7C9A000F36DE7 /* YHResignUploadSuccessDocListCell.swift in Sources */,
04CE1AE12C2AD91F001CB80A /* YHActivityDetailItemView.swift in Sources */,
A517A4E42BB6C4BB000DEECD /* YHDocumentUploadView.swift in Sources */,
045EEF042B9F171A0022A143 /* YHIdentityCardCell.swift in Sources */,
045EEEB42B9F171A0022A143 /* YHWorkExampleMessageTableViewCell.swift in Sources */,
04C85DE52C369AB5008B20D6 /* YHMyFileListCell.swift in Sources */,
045EEF132B9F171A0022A143 /* YHCountryMessage.swift in Sources */,
04CA2BF22CB7AA7600F36DE7 /* YHResignUploadTravelPassportViewController.swift in Sources */,
04EC2F812C22888E002907D7 /* YHFriendRequestView.swift in Sources */,
044EE24C2C94396E00A2FE3A /* YHResignCertificatePassportTableViewCell.swift in Sources */,
04F2435B2C9D140C00DF2C74 /* YHHKRecordsTitleCell.swift in Sources */,
044F393A2CB7772D007CA277 /* YHVisaRenewalGuideRemarkCell.swift in Sources */,
041892242C91BCF100B9FB94 /* YHResignRoundCellType.swift in Sources */,
04912F7A2CB7A5F400CC3105 /* YHResignAppointApplicantInfoCell.swift in Sources */,
0430E6722C749E74000511E2 /* YHAdopterBirthViewController.swift in Sources */,
......@@ -5159,6 +5303,7 @@
F8BAADA32C4FB41F0074D6C3 /* YHUatHelper.swift in Sources */,
0468D4282B50D4AF00CFB916 /* YHPrivacyAlertView.swift in Sources */,
045EEEB22B9F171A0022A143 /* YHWorkActionView.swift in Sources */,
04CA2BF02CB7A74C00F36DE7 /* YHResignUploadTravelHKViewController.swift in Sources */,
A58AC09F2BAC05BA00A30FA9 /* YHFileListItemsView.swift in Sources */,
A5000F512C3BC28B00843452 /* YHHomeHoldViewPageViewController.swift in Sources */,
04CE1ACF2C2AD91F001CB80A /* YHActivityViewModel.swift in Sources */,
......@@ -5243,6 +5388,7 @@
A5FD45232C523DD300908AD9 /* YHJsApi.swift in Sources */,
04B360E32C60A346001EB053 /* YHPrinciplePhotoListCell.swift in Sources */,
044EE2512C955CDE00A2FE3A /* YHResignGuidelinesExampleViewController.swift in Sources */,
04CA2C032CB7D3C200F36DE7 /* YHFileExplainReasonInputView.swift in Sources */,
04213B292C48EF5300797900 /* YHHomeInformationViewController.swift in Sources */,
A5DF9C692C78BE6000CE48E6 /* YHUploadCertificateDetailModel.swift in Sources */,
044EE2442C92F48200A2FE3A /* YHResignCertificateEvisaTableViewCell.swift in Sources */,
......@@ -5277,6 +5423,7 @@
04F243572C9C437F00DF2C74 /* YHHKRecordsRemarkCell.swift in Sources */,
A5D5ADEF2BB90FBC0039FA6B /* YHCheckEamilAlertView.swift in Sources */,
04A671602BA0280800C1FB91 /* YHFileRenameInputView.swift in Sources */,
04CA2BF42CB7B33500F36DE7 /* YHResignUploadTravelGuideView.swift in Sources */,
A5ACE93F2B4564F7002C94D2 /* UIViewController+Extension.swift in Sources */,
A53B61192BB3C9960010B573 /* YHMyDocListHeaderView.swift in Sources */,
04F243662C9D5CB200DF2C74 /* YHResignDocumentViewModel.swift in Sources */,
......@@ -5313,6 +5460,7 @@
044D0C1C2C22C30B00C5CF5E /* YHEditSchoolViewController.swift in Sources */,
A5CA3F562C74850200EB22F5 /* YHUploadCertificateDetailVC.swift in Sources */,
A5ACE9532B4564F7002C94D2 /* YHBaseViewController.swift in Sources */,
044F39422CB7CCBB007CA277 /* YHVisaRenewalTroubleshootingGuideHeaderCell.swift in Sources */,
04912F622CB66E6300CC3105 /* YHResignInfoConfirmViewController.swift in Sources */,
04EFC8E92C903F1100FC680F /* YHResignMaterialViewModel.swift in Sources */,
04256DE82C7314B500A37BA4 /* YHSelectApplicantCell.swift in Sources */,
......@@ -5336,6 +5484,7 @@
04256E1D2C75C74200A37BA4 /* YHAppointHKResultModel.swift in Sources */,
04CE1ADB2C2AD91F001CB80A /* YHActivityTitleItemView.swift in Sources */,
A5FD63BF2B6250BC00D1D9DA /* YHInformationPerfectCell.swift in Sources */,
044F393E2CB7827B007CA277 /* YHVisaRenewalGuideTipsCell.swift in Sources */,
045EEE942B9F171A0022A143 /* YHPreviewInfoQuestionAndAnswerItemView.swift in Sources */,
04F5F86A2C1A95BB004A463C /* YHOtherServiceViewController.swift in Sources */,
0430E6762C74A4BE000511E2 /* YHAdopterMarryViewController.swift in Sources */,
......@@ -5395,6 +5544,7 @@
045EEE9E2B9F171A0022A143 /* YHWorkExampleModel.swift in Sources */,
045EEE8A2B9F171A0022A143 /* YHPreviewOtherInformationViewController.swift in Sources */,
04F2433B2C9ACED700DF2C74 /* YHHKRecordsSummaryVC.swift in Sources */,
044F39402CB7CB6B007CA277 /* YHVisaRenewalTroubleshootingGuideVC.swift in Sources */,
A5FD63C72B638CA000D1D9DA /* YHSubmintAllInfoSuccessTipView.swift in Sources */,
043D2C8A2C0EEF3F00172438 /* YHOrderSearchViewController.swift in Sources */,
04C85DE12C3677CB008B20D6 /* YHConsultantQRCodeView.swift in Sources */,
......@@ -5483,6 +5633,7 @@
0430E6662C7487B8000511E2 /* YHAdopterTravelItemTableViewCell.swift in Sources */,
045EEEE22B9F171A0022A143 /* YHMySignatureDetailViewModel.swift in Sources */,
045EEE7D2B9F171A0022A143 /* YHWorkExpDataModel.swift in Sources */,
044F39382CB77359007CA277 /* YHVisaRenewalGuideParagraphCell.swift in Sources */,
0485DFDA2C660EFA00B50293 /* YHPrincipleRequestModel.swift in Sources */,
A5CA3F522C744A5000EB22F5 /* YHUploadCertificateTitleCell.swift in Sources */,
045EEE832B9F171A0022A143 /* YHMainInfoPreviewModel.swift in Sources */,
......@@ -5507,6 +5658,7 @@
04CE1AE32C2AD91F001CB80A /* YHApplyActivityAlert.swift in Sources */,
A598E9E42C7EEFD300F84739 /* YHTravelDocsPreparationDetailModel.swift in Sources */,
04A7BD132BA42F4200BD35A2 /* YHMyDocumentsDetailViewController.swift in Sources */,
04CA2C012CB7CEDC00F36DE7 /* YHResignUploadDocDetailViewController.swift in Sources */,
04A671622BA058DE00C1FB91 /* YHCertificateEditSheetView.swift in Sources */,
04AD317D2C295AE800DF5655 /* YHUserInfoSettingViewModel.swift in Sources */,
045A08C22C37EB8B00BCBABA /* YHMyFileListNoneCell.swift in Sources */,
......@@ -5540,6 +5692,7 @@
047AA3E02C4A63B2009C4554 /* YHLifeSectionView.swift in Sources */,
0430E67E2C75872E000511E2 /* YHAdopterOtherViewController.swift in Sources */,
044F39302CB55D5E007CA277 /* YHDashLineView.swift in Sources */,
044F39442CB7D72C007CA277 /* YHVisaRenewalWorkflowCell.swift in Sources */,
04174D772BCD5B74000BA46D /* YHMessageDetailListVC.swift in Sources */,
044D0BFE2C21649A00C5CF5E /* YHUserInformationModel.swift in Sources */,
0430E67A2C757F13000511E2 /* YHAdoptedChinaTravelViewController.swift in Sources */,
......@@ -5602,6 +5755,7 @@
0430E6822C75E068000511E2 /* YHAdopterCardOtherGuideView.swift in Sources */,
04174D742BCD5B74000BA46D /* IMAppKey.swift in Sources */,
A567E5B62BD7643D00D5D5A0 /* YHHomeBannerIndicatorView.swift in Sources */,
04CA2BFB2CB7BAC600F36DE7 /* YHResignUploadDocListViewController.swift in Sources */,
045EEEAD2B9F171A0022A143 /* YHWorkExperienceListTableViewCell.swift in Sources */,
049A48A82B49417300D0C641 /* YHAboutUsViewController.swift in Sources */,
047619E92BA9867100F45358 /* YHCountryHotView.swift in Sources */,
......@@ -5612,6 +5766,7 @@
A598E9E62C7EF39D00F84739 /* YHTravelDocsPreparationDetailVC.swift in Sources */,
045EEEF82B9F171A0022A143 /* YHFormItemOnlyDoubleChoiceCell.swift in Sources */,
A598E9DF2C7CB2C400F84739 /* YHTravelDocsPreparationViewModel.swift in Sources */,
04CA2BE82CB769CD00F36DE7 /* YHResignUploadTravelCardListViewController.swift in Sources */,
0480976D2BA158A1000B9DCA /* YHCertificateListVC.swift in Sources */,
04CCEDFF2CA161910026EA70 /* YHHKRecordsFamilyMembers.swift in Sources */,
0430E6522C733D82000511E2 /* YHAdopterIncomeFileTableViewCell.swift in Sources */,
......@@ -5707,6 +5862,7 @@
04EA230A2BB5172F009DA928 /* YHDocumentPromptTableViewCell.swift in Sources */,
A5EB6C6F2C69FB9A0081FB6C /* YHOfficalLetterListModel.swift in Sources */,
045EEF092B9F171A0022A143 /* YHBasicInfoFillModel.swift in Sources */,
044F393C2CB777D3007CA277 /* YHVisaRenewalGuideIndentCell.swift in Sources */,
044EE2422C92EF0C00A2FE3A /* YHResignCertificateDetailEVisaViewController.swift in Sources */,
A5ACE9352B4564F7002C94D2 /* YHNetRequest.swift in Sources */,
04F243612C9D488200DF2C74 /* YHHKRecordsPersonnelSelectCell.swift in Sources */,
......@@ -5832,7 +5988,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyTestEnv.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 8;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -5858,7 +6014,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.9.9;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -5974,7 +6130,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 8;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -6000,7 +6156,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.9.9;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -6179,7 +6335,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxyDebug.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 8;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -6205,7 +6361,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.9.9;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......@@ -6226,7 +6382,7 @@
CODE_SIGN_ENTITLEMENTS = galaxy/galaxy.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 8;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = RXHYW88XR7;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
FRAMEWORK_SEARCH_PATHS = (
......@@ -6252,7 +6408,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 0.9.9;
MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.intelligence.galaxy;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
......
......@@ -23,8 +23,8 @@ class YHBannerModel: SmartCodable {
var isLocalItemFlag : Bool = false
//分享相关参数
var isShareH5Flag : Bool = false
var addtitionParam: YHBannerAdditionModel?
var is_share_h5_flag : Bool = false
var addtition_param : YHBannerAdditionModel?
required init() {
}
......@@ -41,9 +41,9 @@ class YHBannerModel: SmartCodable {
class YHBannerAdditionModel : SmartCodable {
var shareH5Title : String = ""
var shareH5Describe : String = ""
var shareH5Url:String = ""
var ShareH5Title : String = ""
var ShareH5Describe : String = ""
var ShareH5Url:String = ""
required init() {
}
......
......@@ -152,13 +152,13 @@ extension YHHomeBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
vc.url = url
vc.isFullScreenFlag = false
if model.isShareH5Flag {
if let tModel = model.addtitionParam {
if !tModel.shareH5Url.isEmpty {
if model.is_share_h5_flag {
if let tModel = model.addtition_param {
if !tModel.ShareH5Url.isEmpty {
vc.isShowRightShareItemFlag = true
vc.shareH5Title = tModel.shareH5Title
vc.shareH5Describe = tModel.shareH5Describe
vc.shareUrlFromOutside = tModel.shareH5Title
vc.shareH5Title = tModel.ShareH5Title
vc.shareH5Describe = tModel.ShareH5Describe
vc.shareUrlFromOutside = tModel.ShareH5Url
}
}
}
......
......@@ -185,7 +185,7 @@ extension YHHomePageViewModel {
// type: 0 APP首页 1 香港身份 2香港生活
func getHomeBanner(_ type: Int, callBackBlock:@escaping (_ success: Bool,_ error:YHErrorModel?)->()) {
let params: [String : Any] = ["type": type]
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.Common.banner
let strUrl = YHBaseUrlManager.shared.curURL() + YHAllApiName.Common.bannerApi
let _ = YHNetRequest.getRequest(url: strUrl, params: params) { [weak self] json, code in
guard let self = self else { return }
//1. json字符串 转 对象
......
......@@ -238,7 +238,10 @@ extension YHServiceCenterViewController {
}
@objc func pushOrderView() {
// let vc = YHResignUploadTravelHKViewController()
// self.navigationController?.pushViewController(vc)
//
// return
var flag = true
if self.state == 1 || self.state == 3 {
flag = false
......
......@@ -194,6 +194,24 @@ class YHServiceOrderListView: YHBaseViewController {
//续签文书管理
let vc = YHResignDocumentManagementVC(orderId: orderId, id: stepId)
UIViewController.current?.navigationController?.pushViewController(vc)
} else if type == 33 {
//续签信息确认
} else if type == 34 {
//在港递交预约
} else if type == 35 {
//查看续签结果
} else if type == 36 {
//续签补件
} else if type == 37 {
//在港签证缴费
} else if type == 38 {
//上传旅行证件
}
}
}
......@@ -377,7 +395,7 @@ extension YHServiceOrderListView : UITableViewDelegate,UITableViewDataSource {
let arr = self.arrDataForSeviceCenterProgress
if 0 <= indexPath.row, indexPath.row < arr.count {
let model = arr[indexPath.row]
if model.type == 27 || model.type == 32 || model.type == 31 {
if model.type == 27 || model.type == 32 || model.type == 31 || model.type == 34 {
return 162
}
return 144
......
......@@ -28,6 +28,7 @@ class YHHKVisaRenewalPaymentVC: YHBaseViewController {
return view
}()
private var didShowGuideVC = false
private let orderId: Int
init(orderId: Int) {
......@@ -44,6 +45,16 @@ class YHHKVisaRenewalPaymentVC: YHBaseViewController {
setupUI()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !didShowGuideVC {
didShowGuideVC = true
let didShowGuide = YHVisaRenewalGuideVC.didShowGuide
if !didShowGuide {
showGuideVC()
}
}
}
}
extension YHHKVisaRenewalPaymentVC {
......@@ -69,6 +80,28 @@ extension YHHKVisaRenewalPaymentVC {
tableView.tableHeaderView = UIView(frame: CGRect.init(x: 0, y: 0, width: KScreenWidth, height: kMargin))
tableView.tableFooterView = UIView(frame: CGRect.init(x: 0, y: 0, width: KScreenWidth, height: kMargin))
}
private func showGuideVC() {
let vc = YHVisaRenewalGuideVC()
let pc = YHBottomPresentationController(presentedViewController: vc, presenting: self)
pc.customRadius = 16.0
vc.transitioningDelegate = pc
vc.sureButtonEvent = { [weak vc] in
vc?.dismiss(animated: true)
}
present(vc, animated: true, completion: nil)
}
private func showTroubleshootingGuideVC() {
let vc = YHVisaRenewalTroubleshootingGuideVC()
let pc = YHBottomPresentationController(presentedViewController: vc, presenting: self)
pc.customRadius = 16.0
vc.transitioningDelegate = pc
vc.sureButtonEvent = { [weak vc] in
vc?.dismiss(animated: true)
}
present(vc, animated: true, completion: nil)
}
}
extension YHHKVisaRenewalPaymentVC: UITableViewDelegate, UITableViewDataSource {
......
......@@ -7,8 +7,22 @@
//
import UIKit
import AttributedString
class YHVisaRenewalGuideVC: YHBaseViewController {
static private let showCardGuideKey = "VisaRenewalGuideVCDidShow"
static var didShowGuide: Bool {
UserDefaults.standard.value(forKey: showCardGuideKey) as? Bool == true
}
enum TableRow {
case header
case paragraph(_ title: String, _ detail: String)
case indent(_ title: String, _ detail: String)
case tips(_ title: String, _ detail: ASAttributedString)
case remark(_ detail: String)
}
private lazy var tableView: UITableView = {
let view = UITableView(frame: .zero, style: .plain)
......@@ -19,7 +33,11 @@ class YHVisaRenewalGuideVC: YHBaseViewController {
view.dataSource = self
view.delegate = self
view.showsVerticalScrollIndicator = false
view.register(YHHKRecordsHeaderCell.self, forCellReuseIdentifier: YHHKRecordsHeaderCell.cellReuseIdentifier)
view.register(YHVisaRenewalGuideHeaderCell.self, forCellReuseIdentifier: YHVisaRenewalGuideHeaderCell.cellReuseIdentifier)
view.register(YHVisaRenewalGuideParagraphCell.self, forCellReuseIdentifier: YHVisaRenewalGuideParagraphCell.cellReuseIdentifier)
view.register(YHVisaRenewalGuideRemarkCell.self, forCellReuseIdentifier: YHVisaRenewalGuideRemarkCell.cellReuseIdentifier)
view.register(YHVisaRenewalGuideIndentCell.self, forCellReuseIdentifier: YHVisaRenewalGuideIndentCell.cellReuseIdentifier)
view.register(YHVisaRenewalGuideTipsCell.self, forCellReuseIdentifier: YHVisaRenewalGuideTipsCell.cellReuseIdentifier)
return view
}()
......@@ -32,10 +50,13 @@ class YHVisaRenewalGuideVC: YHBaseViewController {
button.setTitle("我已知悉,确认", for: .highlighted)
button.setTitleColor( UIColor(hex:0xffffff), for: .normal)
button.setTitleColor( UIColor(hex:0xffffff), for: .highlighted)
button.setTitleColor( UIColor(hex:0xffffff), for: .disabled)
button.addTarget(self, action: #selector(clickSureButton), for: .touchUpInside)
button.layer.cornerRadius = kCornerRadius3
button.clipsToBounds = true
button.backgroundColor = .brandMainColor
let isEnable = YHVisaRenewalGuideVC.didShowGuide
button.backgroundColor = isEnable ? .brandMainColor : UIColor(hex: 0xB7C0CC, alpha: 1.0)
button.isEnabled = isEnable
return button
}()
......@@ -45,9 +66,33 @@ class YHVisaRenewalGuideVC: YHBaseViewController {
return view
}()
var sureButtonEvent: (() -> Void)?
private lazy var datas: [TableRow] = []
private var isStartTimer: Bool = false
private let maxCount = 5
private var timer: DispatchSourceTimer?
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
setupDatas()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !isStartTimer {
isStartTimer = true
let didShowGuide = YHVisaRenewalGuideVC.didShowGuide
if !didShowGuide {
setupTimer()
}
}
}
deinit {
cancelTimer()
}
}
......@@ -55,7 +100,7 @@ class YHVisaRenewalGuideVC: YHBaseViewController {
extension YHVisaRenewalGuideVC {
@objc private func clickSureButton() {
//
sureButtonEvent?()
}
private func setupUI() {
......@@ -85,21 +130,111 @@ extension YHVisaRenewalGuideVC {
make.top.equalToSuperview()
make.bottom.equalTo(bottomView.snp.top)
}
tableView.tableFooterView = UIView(frame: CGRect.init(x: 0, y: 0, width: KScreenWidth, height: kMargin))
tableView.tableFooterView = UIView(frame: CGRect.init(x: 0, y: 0, width: KScreenWidth, height: 82))
preferredContentSize = CGSize(width: KScreenWidth, height: KScreenHeight - k_Height_NavigationtBarAndStatuBar)
}
private func setupDatas() {
datas.append(.header)
datas.append(.paragraph("二、原签证未过期但已离境,需赴港缴费领取新签证", "携带港澳通行证逗留D签注(如是护照申请则为护照)、香港身份证;香港关请务必走香港居民通道"))
datas.append(.indent("内地关", "使用港澳通行证逗留D签注"))
datas.append(.indent("香港关", "已有香港身份证则使用香港身份证走香港居民通道;未满11岁无香港身份证,则使用对应旅行证件和电子签证走香港居民人工通道"))
datas.append(.paragraph("三、原签证已过期且已离境,需赴港缴费领取新签证", "携带港澳通行证旅游签注(如护照申请,则同时携带护照)、香港身份证;香港关也走访客通道"))
datas.append(.indent("内地关", "使用港澳通行证旅游签注"))
datas.append(.indent("香港关", "使用港澳通行证旅游签注(如护照申请则使用护照)走访客通道"))
datas.append(.remark("备注:如用中国护照申请,从内地赴港,在非需前往其他国家的情况下可能无法直接持护照过关,需提前办理港澳通行证旅游签注备用;建议联合其他国行程,香港作为中转,即可护照顺利入境"))
let firstAtt: ASAttributedString = .init(string: "1、信用卡(只接受VISA、万事达卡、银联卡及JCB),缴费灵,「转数快」或内地电子钱包(只接受支付宝、微信支付及云闪付App)缴付。付款成功后,申请人随即可自行下载或打印「电子签证」\n\n2、缴费过程中或需填写获批者的出生日期与旅行证件号码,请提前准备\n\n3、手机端电脑端都可缴费,建议使用电脑端(每位获批者都需单独缴费一次)", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70), .paragraph(.lineHeightMultiple(1.07)))
datas.append(.tips("缴费注意事项:", firstAtt))
let secLine1a: ASAttributedString = .init(string: "1、涉及的申请人若已在港,并在赴港时使用正确证件,走正确通道才可以去缴费查看签证;未入境前一旦尝试缴费签证就会被锁;若刚入境香港,", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70))
let secLine1b: ASAttributedString = .init(string: "至少2个小时后再进行缴费", .font(UIFont.PFSC_M(ofSize: 13)), .foreground(UIColor.brandMainColor))
let secLine1c: ASAttributedString = .init(string: ",避免海关还未识别到入境记录,导致签证被锁\n\n", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70))
let secLine2a: ASAttributedString = .init(string: "2、签证过期后,再入境香港缴费只能以访客身份入境,会有签证被锁的风险。", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70))
let secLine2b: ASAttributedString = .init(string: "建议尽量在工作日到港缴费", .font(UIFont.PFSC_M(ofSize: 13)), .foreground(UIColor.brandMainColor))
let secLine2c: ASAttributedString = .init(string: ",如遇签证被锁情况方便去入境处核实情况及申请重发,目前重发周期预计是3-6周,重发后需要再次来港缴费", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70))
let secAtt: ASAttributedString = (secLine1a + secLine1b + secLine1c + secLine2a + secLine2b + secLine2c).add(attributes: .paragraph(.lineHeightMultiple(1.07)))
datas.append(.tips("风险提示:", secAtt))
tableView.reloadData()
}
/// 设置定时器
private func setupTimer() {
var countDown = maxCount + 1
timer = DispatchSource.makeTimerSource(queue: .main)
timer?.schedule(deadline: .now(), repeating: .seconds(1))
timer?.setEventHandler(handler: { [weak self] in
guard let self = self else {
return
}
DispatchQueue.main.async {
countDown -= 1
if countDown == 0 {
self.cancelTimer()
self.sureButton.isEnabled = true
self.sureButton.backgroundColor = .brandMainColor
UserDefaults.standard.set(true, forKey: YHVisaRenewalGuideVC.showCardGuideKey)
UserDefaults.standard.synchronize()
return
}
self.sureButton.isEnabled = false
self.sureButton.setTitle("请上滑看完指引后操作(\(countDown)s)", for: .disabled)
self.sureButton.backgroundColor = UIColor(hex: 0xB7C0CC, alpha: 1.0)
}
})
timer?.resume()
}
/// 取消定时器
private func cancelTimer() {
if timer != nil {
timer?.cancel()
timer = nil
}
}
}
extension YHVisaRenewalGuideVC: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 0
return datas.count > 0 ? 1 : 0
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
return datas.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard datas.count > indexPath.row else {
return UITableViewCell()
}
let tableRow = datas[indexPath.row]
switch tableRow {
case .header:
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalGuideHeaderCell.cellReuseIdentifier) as? YHVisaRenewalGuideHeaderCell {
return cell
}
case let .paragraph(title, detail):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalGuideParagraphCell.cellReuseIdentifier) as? YHVisaRenewalGuideParagraphCell {
cell.setupCellInfo(title: title, detail: detail)
return cell
}
case let .indent(title, detail):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalGuideIndentCell.cellReuseIdentifier) as? YHVisaRenewalGuideIndentCell {
cell.setupCellInfo(title: title, detail: detail)
return cell
}
case let .tips(title, detail):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalGuideTipsCell.cellReuseIdentifier) as? YHVisaRenewalGuideTipsCell {
cell.setupCellInfo(title: title, detail: detail)
return cell
}
case let .remark(detail):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalGuideRemarkCell.cellReuseIdentifier) as? YHVisaRenewalGuideRemarkCell {
cell.setupCellInfo(detail: detail)
return cell
}
}
return UITableViewCell()
}
......
//
// YHVisaRenewalTroubleshootingGuideVC.swift
// galaxy
//
// Created by alexzzw on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHVisaRenewalTroubleshootingGuideVC: YHBaseViewController {
enum TableRow {
case header
case tips(_ title: String, _ detail: ASAttributedString)
case workflow(_ title: String, _ workflows: [String])
}
private lazy var tableView: UITableView = {
let view = UITableView(frame: .zero, style: .plain)
view.backgroundColor = .clear
view.separatorStyle = .none
view.rowHeight = UITableView.automaticDimension
view.estimatedRowHeight = 52.0
view.dataSource = self
view.delegate = self
view.showsVerticalScrollIndicator = false
view.register(YHVisaRenewalTroubleshootingGuideHeaderCell.self, forCellReuseIdentifier: YHVisaRenewalTroubleshootingGuideHeaderCell.cellReuseIdentifier)
view.register(YHVisaRenewalWorkflowCell.self, forCellReuseIdentifier: YHVisaRenewalWorkflowCell.cellReuseIdentifier)
view.register(YHVisaRenewalGuideTipsCell.self, forCellReuseIdentifier: YHVisaRenewalGuideTipsCell.cellReuseIdentifier)
return view
}()
private lazy var sureButton: UIButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
button.setTitle("我知道了", for: .normal)
button.setTitle("我知道了", for: .highlighted)
button.setTitleColor( UIColor(hex:0xffffff), for: .normal)
button.setTitleColor( UIColor(hex:0xffffff), for: .highlighted)
button.setTitleColor( UIColor(hex:0xffffff), for: .disabled)
button.addTarget(self, action: #selector(clickSureButton), for: .touchUpInside)
button.layer.cornerRadius = kCornerRadius3
button.clipsToBounds = true
button.backgroundColor = .brandMainColor
return button
}()
private lazy var bottomView: UIView = {
let view = UIView()
view.backgroundColor = .white
return view
}()
var sureButtonEvent: (() -> Void)?
private lazy var datas: [TableRow] = []
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
setupDatas()
}
}
extension YHVisaRenewalTroubleshootingGuideVC {
@objc private func clickSureButton() {
sureButtonEvent?()
}
private func setupUI() {
gk_navBarAlpha = 0
gk_navigationBar.isHidden = true
view.backgroundColor = UIColor.white
view.addSubview(tableView)
view.addSubview(bottomView)
bottomView.addSubview(sureButton)
bottomView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.right.equalToSuperview()
make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom)
make.height.equalTo(64)
}
sureButton.snp.makeConstraints { make in
make.left.equalToSuperview().offset(kMargin)
make.right.equalToSuperview().offset(-kMargin)
make.centerY.equalToSuperview()
make.height.equalTo(48)
}
tableView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.top.equalToSuperview()
make.bottom.equalTo(bottomView.snp.top)
}
tableView.tableFooterView = UIView(frame: CGRect.init(x: 0, y: 0, width: KScreenWidth, height: 24))
preferredContentSize = CGSize(width: KScreenWidth, height: KScreenHeight - k_Height_NavigationtBarAndStatuBar)
}
private func setupDatas() {
datas.append(.header)
let firstAtt: ASAttributedString = .init(string: "将军澳出入境大厅(将军澳宝邑路61号,港铁将军澳B出口,或调景岭A2出口)", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70), .paragraph(.lineHeightMultiple(1.07)))
datas.append(.tips("办理地址:", firstAtt))
let secAtt: ASAttributedString = .init(string: "有效旅行证件原件、香港身份证原件、获批函", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70), .paragraph(.lineHeightMultiple(1.07)))
datas.append(.tips("携带资料:", secAtt))
datas.append(.workflow("操作流程:", ["将军澳出入境6楼接待窗口取号", "等待叫号,告知主任需要缴费查看签证,等待主任核实", "若核实是以访客身份入境,现场写一份声明解释为何没有及时回港", "等待重发,预计3-6周,重发期间可以先离开香港", "重发后再持有效申请旅行证件入境香港后线上缴费"]))
let fourthAtt: ASAttributedString = .init(string: "1、可尝试现场和主任说明为何不能长期待在香港的原因,争取能够直接签证缴费,比如两地都有业务需要自己处理\n\n2、如验证码失效、网页加载无法接入确认缴费页面,请退出后检查网络后重新操作\n\n3、如缴费提示正在有一笔付款进行中要隔1个小时后再重新进到网页操作", .font(UIFont.PFSC_R(ofSize: 13)), .foreground(UIColor.mainTextColor70), .paragraph(.lineHeightMultiple(1.07)))
datas.append(.tips("注意事项:", fourthAtt))
tableView.reloadData()
}
}
extension YHVisaRenewalTroubleshootingGuideVC: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return datas.count > 0 ? 1 : 0
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return datas.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard datas.count > indexPath.row else {
return UITableViewCell()
}
let tableRow = datas[indexPath.row]
switch tableRow {
case .header:
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalTroubleshootingGuideHeaderCell.cellReuseIdentifier) as? YHVisaRenewalTroubleshootingGuideHeaderCell {
return cell
}
case let .tips(title, detail):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalGuideTipsCell.cellReuseIdentifier) as? YHVisaRenewalGuideTipsCell {
cell.setupCellInfo(title: title, detail: detail)
return cell
}
case let .workflow(title, workflows):
if let cell = tableView.dequeueReusableCell(withIdentifier: YHVisaRenewalWorkflowCell.cellReuseIdentifier) as? YHVisaRenewalWorkflowCell {
cell.setupCellInfo(title: title, workflows: workflows)
return cell
}
}
return UITableViewCell()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
}
......@@ -9,109 +9,93 @@
import UIKit
class YHBottomPresentationController: UIPresentationController {
/*
let vc = UIViewController()
let pc = YHBottomPresentationController(presentedViewController: vc, presenting: self)
pc.customRadius = 12.0
vc.transitioningDelegate = pc
vc.closeButtonClickClosure = { [weak vc] in
vc?.dismiss(animated: true)
}
pc.dimmingViewTapAction = {
vc.dismiss(animated: true, completion: nil)
}
present(vc, animated: true, completion: nil)
*/
// MARK: - Properties
@IBInspectable public var customRadius: CGFloat = 8.0
@IBInspectable public var blurEffectAlpha: CGFloat = 0.5
public var dimmingViewTapAction: (() -> Void)?
private var dimmingView: UIView?
private var presentationWrappingView: UIView?
private enum TransitionState {
case presenting
case dismissing
}
private struct Constants {
static let animationDuration: TimeInterval = 0.35
static let shadowOpacity: Float = 0.44
static let shadowRadius: CGFloat = 13.0
static let shadowOffset: CGSize = CGSize(width: 0, height: -6)
}
// MARK: - Lazy Properties
private lazy var dimmingView: UIView = {
let view = UIView()
view.backgroundColor = UIColor.black.withAlphaComponent(blurEffectAlpha)
view.isOpaque = false
view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dimmingViewTapped(_:))))
return view
}()
public var customRadius: CGFloat = 8.0
var blurEffectAlpha: CGFloat = 0.5
var dimmingViewTapAction: (() -> Void)?
private lazy var visualEffectView: UIVisualEffectView = {
let effect = UIBlurEffect(style: .dark)
let view = UIVisualEffectView(effect: effect)
view.alpha = blurEffectAlpha
view.alpha = 0.5
return view
}()
// MARK: - Initialization
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?) {
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
presentedViewController.modalPresentationStyle = .custom
}
// MARK: - Overrides
override var presentedView: UIView? {
return presentationWrappingView
}
override func presentationTransitionWillBegin() {
guard let containerView = containerView else { return }
let presentationWrapperView = createPresentationWrapperView()
let presentationWrapperView = UIView(frame: frameOfPresentedViewInContainerView)
presentationWrapperView.layer.shadowOpacity = 0.44
presentationWrapperView.layer.shadowRadius = 13.0
presentationWrapperView.layer.shadowOffset = CGSize(width: 0, height: -6)
presentationWrappingView = presentationWrapperView
let presentationRoundedCornerView = UIView(frame: presentationWrapperView.bounds.inset(by: UIEdgeInsets(top: 0, left: 0, bottom: -customRadius, right: 0)))
presentationRoundedCornerView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
presentationRoundedCornerView.layer.cornerRadius = customRadius
presentationRoundedCornerView.layer.masksToBounds = true
setupDimmingView(in: containerView)
let presentedViewControllerWrapperView = UIView(frame: presentationRoundedCornerView.bounds.inset(by: UIEdgeInsets(top: 0, left: 0, bottom: customRadius, right: 0)))
presentedViewControllerWrapperView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
let presentedViewControllerView = super.presentedView
if let presentedViewControllerView = presentedViewControllerView {
presentedViewControllerView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
presentedViewControllerView.frame = presentedViewControllerWrapperView.bounds
presentedViewControllerWrapperView.addSubview(presentedViewControllerView)
}
presentationRoundedCornerView.addSubview(presentedViewControllerWrapperView)
presentationWrapperView.addSubview(presentationRoundedCornerView)
if let containerView = containerView {
let dimmingView = UIView(frame: containerView.bounds)
visualEffectView.frame = dimmingView.bounds
visualEffectView.alpha = blurEffectAlpha
dimmingView.addSubview(visualEffectView)
visualEffectView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
dimmingView.backgroundColor = UIColor.black.withAlphaComponent(blurEffectAlpha)
dimmingView.isOpaque = false
dimmingView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
dimmingView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dimmingViewTapped(_:))))
self.dimmingView = dimmingView
containerView.addSubview(dimmingView)
let transitionCoordinator = presentingViewController.transitionCoordinator
dimmingView.alpha = 0.0
transitionCoordinator?.animate(alongsideTransition: { [weak self] _ in
self?.dimmingView.alpha = 1
self?.dimmingView?.alpha = 1
}, completion: nil)
}
}
override func presentationTransitionDidEnd(_ completed: Bool) {
if !completed {
presentationWrappingView = nil
dimmingView.removeFromSuperview()
dimmingView = nil
}
}
override func dismissalTransitionWillBegin() {
let transitionCoordinator = presentingViewController.transitionCoordinator
transitionCoordinator?.animate(alongsideTransition: { [weak self] _ in
self?.dimmingView.alpha = 0
self?.dimmingView?.alpha = 0
}, completion: nil)
}
override func dismissalTransitionDidEnd(_ completed: Bool) {
if completed {
presentationWrappingView = nil
dimmingView.removeFromSuperview()
dimmingView = nil
}
}
// MARK: Layout
override func preferredContentSizeDidChange(forChildContentContainer container: UIContentContainer) {
super.preferredContentSizeDidChange(forChildContentContainer: container)
if container === presentedViewController {
......@@ -120,17 +104,19 @@ class YHBottomPresentationController: UIPresentationController {
}
override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize {
if container === presentedViewController {
if container === presentedViewController, (container as? UIViewController) != nil {
return container.preferredContentSize
}
} else {
return super.size(forChildContentContainer: container, withParentContainerSize: parentSize)
}
}
override var frameOfPresentedViewInContainerView: CGRect {
guard let containerView = containerView else { return .zero }
guard let containerView = containerView else {
return CGRect.zero
}
let containerViewBounds = containerView.bounds
let presentedViewContentSize = size(forChildContentContainer: presentedViewController, withParentContainerSize: containerViewBounds.size)
let presentedViewContentSize = size(forChildContentContainer: self.presentedViewController, withParentContainerSize: containerViewBounds.size)
var presentedViewControllerFrame = containerViewBounds
presentedViewControllerFrame.size.height = presentedViewContentSize.height
......@@ -140,102 +126,87 @@ class YHBottomPresentationController: UIPresentationController {
override func containerViewWillLayoutSubviews() {
super.containerViewWillLayoutSubviews()
dimmingView.frame = containerView?.bounds ?? .zero
dimmingView?.frame = containerView?.bounds ?? CGRect.zero
presentationWrappingView?.frame = frameOfPresentedViewInContainerView
}
// MARK: - Private Methods
private func createPresentationWrapperView() -> UIView {
let wrapperView = UIView(frame: frameOfPresentedViewInContainerView)
wrapperView.layer.shadowOpacity = Constants.shadowOpacity
wrapperView.layer.shadowRadius = Constants.shadowRadius
wrapperView.layer.shadowOffset = Constants.shadowOffset
let roundedCornerView = createRoundedCornerView(in: wrapperView)
let presentedControllerWrapperView = createPresentedControllerWrapperView(in: roundedCornerView)
if let presentedView = super.presentedView {
presentedView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
presentedView.frame = presentedControllerWrapperView.bounds
presentedControllerWrapperView.addSubview(presentedView)
}
return wrapperView
}
private func createRoundedCornerView(in wrapperView: UIView) -> UIView {
let roundedCornerView = UIView(frame: wrapperView.bounds.inset(by: UIEdgeInsets(top: 0, left: 0, bottom: -customRadius, right: 0)))
roundedCornerView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
roundedCornerView.layer.cornerRadius = customRadius
roundedCornerView.layer.masksToBounds = true
wrapperView.addSubview(roundedCornerView)
return roundedCornerView
}
private func createPresentedControllerWrapperView(in roundedCornerView: UIView) -> UIView {
let wrapperView = UIView(frame: roundedCornerView.bounds.inset(by: UIEdgeInsets(top: 0, left: 0, bottom: customRadius, right: 0)))
wrapperView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
roundedCornerView.addSubview(wrapperView)
return wrapperView
}
private func setupDimmingView(in containerView: UIView) {
dimmingView.frame = containerView.bounds
visualEffectView.frame = dimmingView.bounds
dimmingView.addSubview(visualEffectView)
visualEffectView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
containerView.addSubview(dimmingView)
}
// MARK: - Actions
// MARK: Tap Gesture Recognizer
@objc private func dimmingViewTapped(_: UITapGestureRecognizer) {
@objc func dimmingViewTapped(_: UITapGestureRecognizer) {
dimmingViewTapAction?()
}
}
// MARK: - UIViewControllerAnimatedTransitioning
extension YHBottomPresentationController: UIViewControllerAnimatedTransitioning {
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return transitionContext?.isAnimated == true ? Constants.animationDuration : 0
return (transitionContext?.isAnimated ?? false) ? 0.35 : 0
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let state: TransitionState = (transitionContext.viewController(forKey: .from) === presentingViewController) ? .presenting : .dismissing
guard let view = state == .presenting ? transitionContext.view(forKey: .to) : transitionContext.view(forKey: .from) else { return }
let initialFrame = view.frame
let finalFrame = state == .presenting ? transitionContext.finalFrame(for: presentedViewController) : initialFrame.offsetBy(dx: 0, dy: initialFrame.height)
let fromViewController = transitionContext.viewController(forKey: .from)
let toViewController = transitionContext.viewController(forKey: .to)
let toView = transitionContext.view(forKey: .to)
let fromView = transitionContext.view(forKey: .from)
view.frame = state == .presenting ? initialFrame : finalFrame
let containerView = transitionContext.containerView
let isPresenting = (fromViewController === presentingViewController)
var fromViewFinalFrame = CGRect.zero
var toViewInitialFrame = CGRect.zero
var toViewFinalFrame = CGRect.zero
let animator = UIViewPropertyAnimator(duration: Constants.animationDuration, curve: .easeInOut) {
view.frame = state == .presenting ? finalFrame : initialFrame
if let fromViewController = fromViewController {
_ = transitionContext.initialFrame(for: fromViewController)
fromViewFinalFrame = transitionContext.finalFrame(for: fromViewController)
}
animator.addCompletion { _ in
transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
if let toViewController = toViewController {
toViewInitialFrame = transitionContext.initialFrame(for: toViewController)
toViewFinalFrame = transitionContext.finalFrame(for: toViewController)
}
if let toView = toView {
containerView.addSubview(toView)
}
animator.startAnimation()
if isPresenting {
toViewInitialFrame.origin = CGPoint(x: containerView.bounds.minX, y: containerView.bounds.maxY)
toViewInitialFrame.size = toViewFinalFrame.size
if let toView = toView {
toView.frame = toViewInitialFrame
}
} else {
if let fromView = fromView {
fromViewFinalFrame = fromView.frame.offsetBy(dx: 0, dy: fromView.frame.size.height)
}
}
let transitionDuration = self.transitionDuration(using: transitionContext)
UIView.animate(withDuration: transitionDuration) {
if isPresenting {
if let toView = toView {
toView.frame = toViewFinalFrame
}
} else {
if let fromView = fromView {
fromView.frame = fromViewFinalFrame
}
}
} completion: { _ in
let wasCancelled = transitionContext.transitionWasCancelled
transitionContext.completeTransition(!wasCancelled)
}
}
}
// MARK: - UIViewControllerTransitioningDelegate
extension YHBottomPresentationController: UIViewControllerTransitioningDelegate {
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
func presentationController(forPresented presented: UIViewController, presenting _: UIViewController?, source _: UIViewController) -> UIPresentationController? {
assert(presentedViewController === presented, "You didn't initialize \(self) with the correct presentedViewController. Expected \(presented), got \(presentedViewController).")
return self
}
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
func animationController(forPresented _: UIViewController, presenting _: UIViewController, source _: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
func animationController(forDismissed _: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return self
}
}
......@@ -12,11 +12,13 @@ class YHDashLineView: UIView {
private var strokeColor: CGColor = UIColor(hex: 0x121A26, alpha: 0.12).cgColor
private var lineWidth: CGFloat = 1
private var lineDashPattern: [NSNumber] = [2, 2]
private var isHorizontal: Bool = true
init(strokeColor: CGColor = UIColor(hex: 0x121A26, alpha: 0.12).cgColor, lineWidth: CGFloat = 1, lineDashPattern: [NSNumber] = [2, 2]) {
init(strokeColor: CGColor = UIColor(hex: 0x121A26, alpha: 0.12).cgColor, lineWidth: CGFloat = 1, lineDashPattern: [NSNumber] = [2, 2], isHorizontal: Bool = true) {
self.strokeColor = strokeColor
self.lineWidth = lineWidth
self.lineDashPattern = lineDashPattern
self.isHorizontal = isHorizontal
super.init(frame: CGRect.zero)
}
......@@ -36,9 +38,13 @@ class YHDashLineView: UIView {
shapeLayer.lineDashPattern = lineDashPattern // 实线长度,间隔长度
let path = CGMutablePath()
if isHorizontal {
path.move(to: CGPoint(x: 0, y: bounds.midY))
path.addLine(to: CGPoint(x: bounds.width, y: bounds.midY))
} else {
path.move(to: CGPoint(x: bounds.midX, y: 0)) // 从顶部中间开始
path.addLine(to: CGPoint(x: bounds.midX, y: bounds.height)) // 到底部中间结束
}
shapeLayer.path = path
layer.addSublayer(shapeLayer)
}
......
......@@ -144,10 +144,11 @@ extension YHHKVisaRenewalPaymentStepView {
private func getStepLabel(_ title: String) -> UILabel {
let label = UILabel()
label.font = UIFont(name: "DIN Alternate Bold", size: 12)
label.textColor = .mainTextColor70
label.backgroundColor = UIColor(hex: 0xf4f6fa)
label.textColor = .brandMainColor
label.layer.cornerRadius = stepLabelHeight / 2.0
label.clipsToBounds = true
label.layer.borderWidth = 1
label.layer.borderColor = UIColor.brandMainColor16.cgColor
label.text = title
label.textAlignment = .center
return label
......@@ -156,13 +157,13 @@ extension YHHKVisaRenewalPaymentStepView {
private func getStepNameLabel(_ title: String) -> UILabel {
let label = UILabel()
label.font = .PFSC_R(ofSize: 12)
label.textColor = .mainTextColor70
label.textColor = .mainTextColor
label.text = title
return label
}
private func getDashLineView() -> YHDashLineView {
let view = YHDashLineView(strokeColor: UIColor(hex: 0x121A26, alpha: 0.12).cgColor, lineWidth: 1, lineDashPattern: [2, 2])
let view = YHDashLineView(strokeColor: UIColor.brandMainColor16.cgColor, lineWidth: 1, lineDashPattern: [2, 2])
return view
}
}
......@@ -12,49 +12,109 @@ import AttributedString
class YHVisaRenewalGuideHeaderCell: UITableViewCell {
static let cellReuseIdentifier = "YHVisaRenewalGuideHeaderCell"
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_M(ofSize: 17)
label.textColor = UIColor(hexString: "#222222")
return label
private lazy var infoTitleIcon: UIImageView = {
let view = UIImageView()
view.contentMode = .scaleAspectFit
view.image = UIImage(named: "resign_visa_guide_title")
return view
}()
private lazy var tipIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "right_arrow_black_20")
view.image = UIImage(named: "resign_visa_guide_tips")
return view
}()
private lazy var bgIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "resign_visa_guide_bg")
return view
}()
private lazy var tipTitleLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_M(ofSize: 17)
label.textColor = UIColor(hexString: "#222222")
label.font = .PFSC_B(ofSize: 14)
label.textColor = .mainTextColor
label.text = "香港入境处政策"
return label
}()
private lazy var firstDotView: UIView = {
let view = UIView()
view.backgroundColor = .brandMainColor30
view.layer.cornerRadius = 3
view.clipsToBounds = true
return view
}()
private lazy var secondDotView: UIView = {
let view = UIView()
view.backgroundColor = .brandMainColor30
view.layer.cornerRadius = 3
view.clipsToBounds = true
return view
}()
private lazy var firstTipDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 13)
label.textColor = .mainTextColor70
label.text = "获批后,3个月内完成缴费,否则身份会失效"
label.numberOfLines = 0
return label
}()
private lazy var tipDetailLabel: UILabel = {
private lazy var secondTipDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_M(ofSize: 17)
label.textColor = UIColor(hexString: "#222222")
label.font = .PFSC_R(ofSize: 13)
label.textColor = .mainTextColor70
label.text = "缴费领取电子签证时,涉及到的申请人应身在香港"
label.numberOfLines = 0
return label
}()
private lazy var subContainerView: YHBaseDynamicCornerRadiusView = {
let view = YHBaseDynamicCornerRadiusView(cornerRadius: 8, corner: .none)
view.backgroundColor = .white
let view = YHBaseDynamicCornerRadiusView(cornerRadius: 6, corner: .allCorners)
view.backgroundColor = UIColor(hexString: "#FFF5EB")
return view
}()
private lazy var warrnIcon: UIImageView = {
private lazy var warnIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "right_arrow_black_20")
view.image = UIImage(named: "resign_visa_guide_warn")
return view
}()
private lazy var warrnDetailLabel: UILabel = {
private lazy var warnDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 13)
label.textColor = UIColor(hex: 0xFF8000)
label.text = "在港缴费领取电子签证时使用的入境证件,请务必和递交续签资料时入境香港使用的旅行证件保持一致"
label.numberOfLines = 0
return label
}()
private lazy var paragraphTitleLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_M(ofSize: 17)
label.textColor = UIColor(hexString: "#222222")
label.font = .PFSC_B(ofSize: 16)
label.textColor = .mainTextColor
label.numberOfLines = 0
label.text = "一、递交续签申请后,未离境一直在港"
return label
}()
private lazy var paragraphDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 14)
label.textColor = .mainTextColor70
label.numberOfLines = 0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.07
let attributedText = NSAttributedString(
string: "一直未离港,获批后,可在港直接缴费并领取新电子签证",
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)
label.attributedText = attributedText
return label
}()
......@@ -67,33 +127,114 @@ class YHVisaRenewalGuideHeaderCell: UITableViewCell {
fatalError("init(coder:) has not been implemented")
}
func setupCellInfo(title: String?, detail: String?) {
// infoTitleLabel.text = title
// infoDetailLabel.text = detail
}
func setupCellASAttributedInfo(title: String?, detail: ASAttributedString?, detailColor: UIColor = .mainTextColor50) {
// infoTitleLabel.text = title
// infoDetailLabel.textColor = detailColor
// infoDetailLabel.attributed.text = detail
}
}
extension YHVisaRenewalGuideHeaderCell {
private func setupUI() {
selectionStyle = .none
backgroundColor = .clear
contentView.addSubview(bgIcon)
contentView.addSubview(infoTitleIcon)
contentView.addSubview(tipIcon)
contentView.addSubview(tipTitleLabel)
contentView.addSubview(firstDotView)
contentView.addSubview(secondDotView)
contentView.addSubview(firstTipDetailLabel)
contentView.addSubview(secondTipDetailLabel)
contentView.addSubview(subContainerView)
subContainerView.addSubview(warnIcon)
subContainerView.addSubview(warnDetailLabel)
contentView.addSubview(paragraphTitleLabel)
contentView.addSubview(paragraphDetailLabel)
// subContainerView.snp.makeConstraints { make in
// make.edges.equalToSuperview()
// }
//
// bottomLineView.snp.makeConstraints { make in
// make.bottom.equalToSuperview()
// make.left.equalToSuperview().offset(18)
// make.right.equalToSuperview().offset(-18)
// make.height.equalTo(0.5)
// }
bgIcon.setContentHuggingPriority(.defaultLow, for: .vertical)
infoTitleIcon.setContentHuggingPriority(.required, for: .vertical)
tipTitleLabel.setContentHuggingPriority(.required, for: .vertical)
firstTipDetailLabel.setContentHuggingPriority(.required, for: .vertical)
secondTipDetailLabel.setContentHuggingPriority(.required, for: .vertical)
subContainerView.setContentHuggingPriority(.required, for: .vertical)
warnDetailLabel.setContentHuggingPriority(.required, for: .vertical)
paragraphTitleLabel.setContentHuggingPriority(.required, for: .vertical)
paragraphDetailLabel.setContentHuggingPriority(.required, for: .vertical)
bgIcon.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
infoTitleIcon.snp.makeConstraints { make in
make.top.equalToSuperview().offset(25)
make.left.equalToSuperview().offset(22)
make.height.equalTo(25)
make.width.equalTo(253)
}
tipIcon.snp.makeConstraints { make in
make.top.equalTo(infoTitleIcon.snp.bottom).offset(34)
make.left.equalToSuperview().offset(20)
make.height.equalTo(20)
make.width.equalTo(20)
}
tipTitleLabel.snp.makeConstraints { make in
make.left.equalTo(tipIcon.snp.right).offset(8)
make.centerY.equalTo(tipIcon)
}
firstDotView.snp.makeConstraints { make in
make.top.equalTo(tipIcon.snp.bottom).offset(19)
make.left.equalTo(tipIcon)
make.height.equalTo(6)
make.width.equalTo(6)
}
firstTipDetailLabel.snp.makeConstraints { make in
make.top.equalTo(tipIcon.snp.bottom).offset(12)
make.left.equalTo(firstDotView.snp.right).offset(6)
make.right.lessThanOrEqualToSuperview().offset(-20)
}
secondDotView.snp.makeConstraints { make in
make.top.equalTo(firstTipDetailLabel.snp.bottom).offset(19)
make.left.equalTo(tipIcon)
make.height.equalTo(6)
make.width.equalTo(6)
}
secondTipDetailLabel.snp.makeConstraints { make in
make.top.equalTo(firstTipDetailLabel.snp.bottom).offset(12)
make.left.equalTo(secondDotView.snp.right).offset(6)
make.right.lessThanOrEqualToSuperview().offset(-20)
}
subContainerView.snp.makeConstraints { make in
make.top.equalTo(secondTipDetailLabel.snp.bottom).offset(20)
make.left.equalTo(tipIcon)
make.right.equalToSuperview().offset(-20)
}
warnIcon.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.top.equalToSuperview().offset(19)
make.width.height.equalTo(14)
}
warnDetailLabel.snp.makeConstraints { make in
make.left.equalTo(warnIcon.snp.right).offset(8)
make.right.equalToSuperview().offset(-16)
make.top.equalToSuperview().offset(16)
make.bottom.equalToSuperview().offset(-16)
}
paragraphTitleLabel.snp.makeConstraints { make in
make.top.equalTo(subContainerView.snp.bottom).offset(20)
make.left.equalTo(tipIcon)
make.right.lessThanOrEqualToSuperview().offset(-20)
}
paragraphDetailLabel.snp.makeConstraints { make in
make.top.equalTo(paragraphTitleLabel.snp.bottom).offset(12)
make.left.equalTo(tipIcon)
make.right.lessThanOrEqualToSuperview().offset(-20)
make.bottom.equalToSuperview()
}
}
}
//
// YHVisaRenewalGuideIndentCell.swift
// galaxy
//
// Created by alexzzw on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHVisaRenewalGuideIndentCell: UITableViewCell {
static let cellReuseIdentifier = "YHVisaRenewalGuideIndentCell"
private let infoTitleLabelHorizontalOffset: CGFloat = 5
private let infoTitleLabelToDetail: CGFloat = 4
private lazy var subContainerView: YHBaseDynamicCornerRadiusView = {
let view = YHBaseDynamicCornerRadiusView(cornerRadius: 2, corner: .allCorners)
view.backgroundColor = UIColor(hex: 0xF4F6FA)
return view
}()
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.font = .PFSC_M(ofSize: 13)
label.textColor = .brandMainColor
return label
}()
private lazy var infoDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 13)
label.textColor = .mainTextColor70
label.numberOfLines = 0
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupCellInfo(title: String, detail: String) {
infoTitleLabel.text = title
infoTitleLabel.sizeToFit()
subContainerView.sizeToFit()
let paragraphStyle = NSMutableParagraphStyle()
// 设置首行缩进量,单位为points
paragraphStyle.firstLineHeadIndent = infoTitleLabel.bounds.size.width + infoTitleLabelHorizontalOffset * 2 + infoTitleLabelToDetail
paragraphStyle.headIndent = 0
paragraphStyle.lineHeightMultiple = 1.07
let attributedText = NSAttributedString(
string: detail,
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)
infoDetailLabel.attributedText = attributedText
}
}
extension YHVisaRenewalGuideIndentCell {
private func setupUI() {
selectionStyle = .none
contentView.addSubview(subContainerView)
subContainerView.addSubview(infoTitleLabel)
contentView.addSubview(infoDetailLabel)
subContainerView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.left.equalToSuperview().offset(20)
}
infoTitleLabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(infoTitleLabelHorizontalOffset)
make.right.equalToSuperview().offset(-infoTitleLabelHorizontalOffset)
make.top.bottom.equalToSuperview()
}
infoDetailLabel.snp.makeConstraints { make in
make.top.equalTo(subContainerView)
make.left.equalTo(subContainerView)
make.right.lessThanOrEqualToSuperview().offset(-20)
make.bottom.equalToSuperview()
}
}
}
//
// YHVisaRenewalGuideParagraphCell.swift
// galaxy
//
// Created by alexzzw on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHVisaRenewalGuideParagraphCell: UITableViewCell {
static let cellReuseIdentifier = "YHVisaRenewalGuideParagraphCell"
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_B(ofSize: 16)
label.textColor = .mainTextColor
label.numberOfLines = 0
return label
}()
private lazy var infoDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 14)
label.textColor = .mainTextColor70
label.numberOfLines = 0
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupCellInfo(title: String, detail: String) {
infoTitleLabel.text = title
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.07
let attributedText = NSAttributedString(
string: detail,
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)
infoDetailLabel.attributedText = attributedText
}
}
extension YHVisaRenewalGuideParagraphCell {
private func setupUI() {
selectionStyle = .none
contentView.addSubview(infoTitleLabel)
contentView.addSubview(infoDetailLabel)
infoTitleLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.left.equalToSuperview().offset(20)
make.right.lessThanOrEqualToSuperview().offset(-20)
}
infoDetailLabel.snp.makeConstraints { make in
make.top.equalTo(infoTitleLabel.snp.bottom).offset(20)
make.left.equalTo(infoTitleLabel)
make.right.lessThanOrEqualToSuperview().offset(-20)
make.bottom.equalToSuperview()
}
}
}
//
// YHVisaRenewalGuideRemarkCell.swift
// galaxy
//
// Created by alexzzw on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHVisaRenewalGuideRemarkCell: UITableViewCell {
static let cellReuseIdentifier = "YHVisaRenewalGuideRemarkCell"
private lazy var infoDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 14)
label.textColor = .mainTextColor70
label.numberOfLines = 0
return label
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupCellInfo(detail: String) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.07
let attributedText = NSAttributedString(
string: detail,
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)
infoDetailLabel.attributedText = attributedText
}
}
extension YHVisaRenewalGuideRemarkCell {
private func setupUI() {
selectionStyle = .none
contentView.addSubview(infoDetailLabel)
infoDetailLabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(12)
make.left.equalToSuperview().offset(20)
make.right.lessThanOrEqualToSuperview().offset(-20)
make.bottom.equalToSuperview()
}
}
}
//
// YHVisaRenewalGuideTipsCell.swift
// galaxy
//
// Created by alexzzw on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHVisaRenewalGuideTipsCell: UITableViewCell {
static let cellReuseIdentifier = "YHVisaRenewalGuideTipsCell"
private lazy var iconView: UIView = {
let view = UIView()
view.backgroundColor = .brandMainColor
return view
}()
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_B(ofSize: 14)
label.textColor = .mainTextColor
return label
}()
private lazy var infoDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 13)
label.textColor = .mainTextColor70
label.numberOfLines = 0
return label
}()
private lazy var subContainerView: YHBaseDynamicCornerRadiusView = {
let view = YHBaseDynamicCornerRadiusView(cornerRadius: 6, corner: .allCorners)
view.backgroundColor = .contentBkgColor
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupCellInfo(title: String, detail: ASAttributedString) {
infoTitleLabel.text = title
infoDetailLabel.attributed.text = detail
}
}
extension YHVisaRenewalGuideTipsCell {
private func setupUI() {
selectionStyle = .none
contentView.addSubview(subContainerView)
subContainerView.addSubview(iconView)
subContainerView.addSubview(infoTitleLabel)
subContainerView.addSubview(infoDetailLabel)
subContainerView.setContentHuggingPriority(.defaultLow, for: .vertical)
subContainerView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.bottom.equalToSuperview()
}
iconView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(18)
make.left.equalToSuperview()
make.width.equalTo(4)
make.height.equalTo(14)
}
infoTitleLabel.snp.makeConstraints { make in
make.centerY.equalTo(iconView)
make.left.equalTo(iconView.snp.right).offset(12)
make.right.lessThanOrEqualToSuperview().offset(-16)
}
infoDetailLabel.snp.makeConstraints { make in
make.top.equalTo(infoTitleLabel.snp.bottom).offset(12)
make.left.equalTo(infoTitleLabel)
make.right.lessThanOrEqualToSuperview().offset(-16)
make.bottom.equalToSuperview().offset(-16)
}
}
}
//
// YHVisaRenewalTroubleshootingGuideHeaderCell.swift
// galaxy
//
// Created by alexzzw on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHVisaRenewalTroubleshootingGuideHeaderCell: UITableViewCell {
static let cellReuseIdentifier = "YHVisaRenewalTroubleshootingGuideHeaderCell"
private lazy var infoTitleIcon: UIImageView = {
let view = UIImageView()
view.contentMode = .scaleAspectFit
view.image = UIImage(named: "resign_visa_guide_error_title")
return view
}()
private lazy var bgIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "resign_visa_guide_bg")
return view
}()
private lazy var paragraphDetailLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_R(ofSize: 14)
label.textColor = .mainTextColor70
label.numberOfLines = 0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.07
let attributedText = NSAttributedString(
string: "如缴费页面最终出现“不符合使用網上付款服務的资格”字样,请亲自前往将军澳入境处人工处理,以下是办理指引:",
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)
label.attributedText = attributedText
return label
}()
private lazy var errorIcon: UIImageView = {
let view = UIImageView()
view.image = UIImage(named: "resign_visa_guide_error_content")
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension YHVisaRenewalTroubleshootingGuideHeaderCell {
private func setupUI() {
selectionStyle = .none
contentView.addSubview(bgIcon)
contentView.addSubview(infoTitleIcon)
contentView.addSubview(paragraphDetailLabel)
contentView.addSubview(errorIcon)
bgIcon.snp.makeConstraints { make in
make.left.top.right.equalToSuperview()
make.width.equalTo(bgIcon.snp.height)
}
infoTitleIcon.snp.makeConstraints { make in
make.top.equalToSuperview().offset(25)
make.left.equalToSuperview().offset(22)
make.height.equalTo(25)
make.width.equalTo(202)
}
paragraphDetailLabel.snp.makeConstraints { make in
make.top.equalTo(infoTitleIcon.snp.bottom).offset(34)
make.left.equalToSuperview().offset(20)
make.right.lessThanOrEqualToSuperview().offset(-20)
}
let whR = 335.0 / 300.0
errorIcon.snp.makeConstraints { make in
make.top.equalTo(paragraphDetailLabel.snp.bottom).offset(12)
make.left.equalTo(paragraphDetailLabel)
make.right.equalToSuperview().offset(-20)
make.width.equalTo(errorIcon.snp.height).multipliedBy(whR)
make.bottom.equalToSuperview()
}
}
}
//
// YHVisaRenewalWorkflowCell.swift
// galaxy
//
// Created by alexzzw on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHVisaRenewalWorkflowCell: UITableViewCell {
static let cellReuseIdentifier = "YHVisaRenewalWorkflowCell"
private let circleWidth: CGFloat = 8
private var stepLabels: [UILabel] = []
private var circleViews: [UIView] = []
private var dashLines: [YHDashLineView] = []
private lazy var iconView: UIView = {
let view = UIView()
view.backgroundColor = .brandMainColor
return view
}()
private lazy var infoTitleLabel: UILabel = {
let label = UILabel()
label.font = .PFSC_B(ofSize: 14)
label.textColor = .mainTextColor
return label
}()
private lazy var subContainerView: YHBaseDynamicCornerRadiusView = {
let view = YHBaseDynamicCornerRadiusView(cornerRadius: 6, corner: .allCorners)
view.backgroundColor = .contentBkgColor
return view
}()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupCellInfo(title: String, workflows: [String]) {
infoTitleLabel.text = title
stepLabels.removeAll()
circleViews.removeAll()
dashLines.removeAll()
let count = workflows.count
workflows.enumerated().forEach { [weak self] index, title in
guard let self = self else {
return
}
let circleView = self.getCircleView()
let label = self.getStepLabel(title)
self.stepLabels.append(label)
self.circleViews.append(circleView)
self.subContainerView.addSubview(label)
self.subContainerView.addSubview(circleView)
label.snp.makeConstraints { make in
if index == 0 {
make.top.equalTo(self.infoTitleLabel.snp.bottom).offset(12)
} else {
make.top.equalTo(self.stepLabels[index - 1].snp.bottom).offset(16)
}
make.left.equalTo(circleView.snp.right).offset(8)
make.right.lessThanOrEqualToSuperview().offset(-16)
if index == count - 1 {
make.bottom.equalToSuperview().offset(-20)
}
}
circleView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.top.equalTo(label.snp.top).offset(6)
make.width.height.equalTo(self.circleWidth)
}
if index != count - 1 {
let dashLine = self.getDashLineView()
self.dashLines.append(dashLine)
self.subContainerView.addSubview(dashLine)
}
}
guard dashLines.count > 0 else {
return
}
dashLines.enumerated().forEach { [weak self] index, line in
guard let self = self else {
return
}
guard self.circleViews.count > index + 1 else {
return
}
line.snp.makeConstraints { make in
make.width.equalTo(1)
make.centerX.equalTo(self.circleViews[index])
make.top.equalTo(self.circleViews[index].snp.bottom).offset(1)
make.bottom.equalTo(self.circleViews[index + 1].snp.top).offset(-1)
}
}
}
}
extension YHVisaRenewalWorkflowCell {
private func setupUI() {
selectionStyle = .none
contentView.addSubview(subContainerView)
subContainerView.addSubview(iconView)
subContainerView.addSubview(infoTitleLabel)
subContainerView.setContentHuggingPriority(.defaultLow, for: .vertical)
subContainerView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.bottom.equalToSuperview()
}
iconView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(18)
make.left.equalToSuperview()
make.width.equalTo(4)
make.height.equalTo(14)
}
infoTitleLabel.snp.makeConstraints { make in
make.centerY.equalTo(iconView)
make.left.equalTo(iconView.snp.right).offset(12)
make.right.lessThanOrEqualToSuperview().offset(-16)
make.bottom.lessThanOrEqualToSuperview().offset(-20)
}
}
private func getStepLabel(_ title: String) -> UILabel {
let label = UILabel()
label.font = .PFSC_R(ofSize: 13)
label.textColor = .mainTextColor70
label.numberOfLines = 0
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = 1.1
let attributedText = NSAttributedString(
string: title,
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]
)
label.attributedText = attributedText
return label
}
private func getDashLineView() -> YHDashLineView {
let view = YHDashLineView(strokeColor: UIColor.brandMainColor30.cgColor, lineWidth: 1, lineDashPattern: [2, 2], isHorizontal: false)
return view
}
private func getCircleView() -> UIView {
let view = UIView()
view.layer.cornerRadius = circleWidth / 2.0
view.clipsToBounds = true
view.layer.borderColor = UIColor.brandMainColor30.cgColor
view.layer.borderWidth = 1.5
return view
}
}
//
// YHResignUploadDocDetailViewController.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import IQKeyboardManagerSwift
import AttributedString
class YHResignUploadDocDetailViewController: YHBaseViewController {
// 进入该页面以下三个参数必传
// 订单id
var orderId: Int = 0
// 批次id
var batchId: Int = 0
var materialId : Int = 0
var materialModel: YHMaterialModel = YHMaterialModel() {
didSet {
self.tableView.reloadData()
}
}
var templateModel: YHResignTemplateDetail = YHResignTemplateDetail()
var templateArr: [YHResignTemplateItemModel] = []
var categoryId: Int = 0
var supplementId: Int = 0
var viewModel: YHResignMaterialViewModel = YHResignMaterialViewModel()
var items:[YHMaterialModelItemModel] = []
var selectEditItem: YHMaterialModelItemModel?
lazy var previewFileTool:YHFilePreviewTool = {
let tool = YHFilePreviewTool(targetVC: self)
return tool
}()
var renameInputView: YHFileRenameInputView = {
let view = YHFileRenameInputView.inputView(defalutText: "请输入名称")
return view
}()
// var renameInputView: YHFileRenameInputView = {
// let view = YHFileRenameInputView.inputView(defalutText: "请输入名称")
// return view
// }()
lazy var blackMaskView: UIView = {
let view = UIView(frame:UIScreen.main.bounds)
view.backgroundColor = UIColor(hex: 0x0F1214, alpha: 0.5)
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissed))
view.addGestureRecognizer(tap)
view.isHidden = true
return view
}()
lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped)
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
}
tableView.showsVerticalScrollIndicator = false
tableView.backgroundColor = .white
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
tableView.register(YHResignMaterialNameCell.self, forCellReuseIdentifier: YHResignMaterialNameCell.cellReuseIdentifier)
tableView.register(YHCertificateTemplateCell.self, forCellReuseIdentifier: YHCertificateTemplateCell.cellReuseIdentifier)
return tableView
}()
lazy var uploadBtn:UIButton = {
let btn = UIButton()
btn.setTitle("继续上传".local, for: .normal)
btn.titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
btn.setTitleColor(.white, for: .normal)
btn.backgroundColor = UIColor.brandMainColor
btn.layer.cornerRadius = kCornerRadius3
btn.addTarget(self, action: #selector(didClickUploadBtn), for: .touchUpInside)
btn.isHidden = true
return btn
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
self.gk_navTitle = "资料上传"
addKeyBoardNotify()
createUI()
requestMaterialDetail()
renameInputView.editBlock = {
[weak self] text in
guard let self = self else { return }
if let selectEditItem = selectEditItem, var text = text {
// 重命名
text = text + "." + selectEditItem.getFileSuffixName()
YHHUD.show(.progress(message: "重命名中..."))
selectEditItem.name = text
self.viewModel.updateMaterials(material: self.materialModel, addInfoArr: []) {
success, error in
YHHUD.hide()
if success {
YHHUD.flash(message: "重命名成功")
} else {
var msg = "重命名失败"
if let errorMsg = error?.errorMsg, !errorMsg.isEmpty {
msg = errorMsg
}
YHHUD.flash(message:msg)
}
self.requestMaterialDetail()
}
}
}
}
deinit {
removeNotify()
}
@objc func didClickUploadBtn() {
if items.count >= 99 {
YHHUD.flash(message: "已达上限\n最多上传99张图片或文件")
return
}
let sheetView = YHCertificateUploadSheetView.sheetView()
sheetView.maxSelectImageCount = 99-items.count
sheetView.tips = "支持的文件格式为jpg/jpeg、png、bmp、doc/docx、xls/xlsx、pdf,最多可上传99张图片或文件"
sheetView.fileTypes = [ "public.image",
"com.adobe.pdf",
"com.microsoft.word.doc",
"org.openxmlformats.wordprocessingml.document",
"org.openxmlformats.spreadsheetml.sheet",
"com.microsoft.excel.xls",]
sheetView.uploadFilesBlock = {
[weak self] fileUrl in
guard let self = self else { return }
print(fileUrl)
self.viewModel.uploadFilesWithMaterial(material:self.materialModel, fileUrl: fileUrl) {
[weak self] in
guard let self = self else { return }
self.requestMaterialDetail()
}
}
sheetView.uploadImageBlock = {
[weak self] targetImgArr in
guard let self = self else { return }
self.viewModel.uploadImageArr(targetImgArr, material: self.materialModel) {
[weak self] in
guard let self = self else { return }
self.requestMaterialDetail()
}
}
sheetView.show()
}
func createUI() {
view.addSubview(uploadBtn)
view.addSubview(tableView)
view.addSubview(blackMaskView)
view.addSubview(renameInputView)
tableView.snp.makeConstraints { make in
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.left.right.bottom.equalToSuperview()
}
uploadBtn.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(48.0)
make.bottom.equalToSuperview().offset(-8-k_Height_safeAreaInsetsBottom())
}
renameInputView.snp.makeConstraints { make in
make.left.right.equalTo(view)
make.height.equalTo(YHFileRenameInputView.height)
make.bottom.equalToSuperview().offset(YHFileRenameInputView.height)
}
}
}
extension YHResignUploadDocDetailViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return templateArr.count
}
return items.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: YHCertificateTemplateCell.cellReuseIdentifier, for: indexPath) as! YHCertificateTemplateCell
cell.update(bottomMargin: 15)
if 0 <= indexPath.row && indexPath.row < templateArr.count {
cell.templateModel = templateArr[indexPath.row]
}
return cell
}
let cell = tableView.dequeueReusableCell(withIdentifier: YHResignMaterialNameCell.cellReuseIdentifier, for: indexPath) as! YHResignMaterialNameCell
if 0 <= indexPath.row && indexPath.row < items.count {
let item = items[indexPath.row]
cell.updateModel(item)
cell.editBlock = {
[weak self] contentItem in
guard let self = self else { return }
selectEditItem = contentItem
var items = [YHCertificateEditItem(type:.rename, title:"重命名"),
YHCertificateEditItem(type:.preview, title:"预览"),
YHCertificateEditItem(type:.delete, title:"删除"),
YHCertificateEditItem(type:.cancel, title:"取消")]
if self.materialModel.status == YHMaterialStatus.completed.rawValue {
items = [YHCertificateEditItem(type:.preview, title:"预览"),
YHCertificateEditItem(type:.cancel, title:"取消")]
}
YHCertificateEditSheetView.sheetView(items:items) {
[weak self] editType in
guard let self = self else { return }
print("editType:\(editType.rawValue)")
if editType == .rename { // 重命名
IQKeyboardManager.shared.enable = false
var name = contentItem.getFileNameWithoutSuffix()
if name.count > 30 {
name = name[safe: ..<30]!
}
renameInputView.textField.text = name
renameInputView.textField.becomeFirstResponder()
} else if editType == .delete { // 删除
let msg = "您确定要删除文档\(contentItem.name)吗?"
YHTwoOptionAlertView.showAlertView(message:msg) { sure in
if !sure { return }
// 删除
YHHUD.show(.progress(message: "删除中..."))
var deleteIndex = -1
for (index, item) in self.materialModel.info.enumerated() {
if contentItem.url == item.url {
deleteIndex = index
break
}
}
if deleteIndex == -1 { // 没有找到对应资料文件
YHHUD.flash(message: "删除成功")
return
}
self.materialModel.info.remove(at: deleteIndex)
self.viewModel.updateMaterials(material: self.materialModel, addInfoArr: []) {
success, error in
YHHUD.hide()
if success {
YHHUD.flash(message: "删除成功")
} else {
var msg = "删除失败"
if let errorMsg = error?.errorMsg, !errorMsg.isEmpty {
msg = errorMsg
}
YHHUD.flash(message:msg)
}
self.requestMaterialDetail()
}
}
} else if editType == .preview { // 预览
print(contentItem.url)
self.viewModel.getPublicImageUrl(contentItem.url) { success, error in
if let success = success {
self.previewFileTool.openXLSXRemoteFile(urlString: success, fileName:contentItem.name)
}
}
}
}.show()
}
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section == 0 {
return 77.0
}
return UITableView.automaticDimension
}
private func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return UITableView.automaticDimension
}
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
if section == 0 { // 证件示例模板
let titlelabel = UILabel()
titlelabel.textColor = UIColor.mainTextColor
titlelabel.textAlignment = .left
titlelabel.font = UIFont.PFSC_M(ofSize:17)
titlelabel.text = "\(self.materialModel.getName())示例模板"
titlelabel.numberOfLines = 0
view.addSubview(titlelabel)
titlelabel.snp.makeConstraints { make in
make.top.equalToSuperview().offset(16)
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
}
let tipsLabel = UILabel()
tipsLabel.textColor = UIColor.labelTextColor2
tipsLabel.textAlignment = .left
tipsLabel.font = UIFont.PFSC_R(ofSize:14)
tipsLabel.numberOfLines = 0
if !self.templateModel.remark.isEmpty {
tipsLabel.text = "注意事项:\(self.templateModel.remark)"
}
view.addSubview(tipsLabel)
tipsLabel.snp.makeConstraints { make in
make.top.equalTo(titlelabel.snp.bottom).offset(5)
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.bottom.equalToSuperview().offset(-15)
}
return view
}
// 证件标题和状态
let titlelabel = UILabel()
titlelabel.textColor = UIColor.mainTextColor
titlelabel.textAlignment = .left
titlelabel.font = UIFont.PFSC_M(ofSize:17)
titlelabel.text = self.materialModel.getName()
titlelabel.numberOfLines = 0
view.addSubview(titlelabel)
let statusLabel = UILabel()
statusLabel.textAlignment = .center
statusLabel.font = UIFont.PFSC_M(ofSize:10)
statusLabel.layer.cornerRadius = kCornerRadius3
statusLabel.clipsToBounds = true
view.addSubview(statusLabel)
var text = ""
var textColor:UIColor = .clear
var bgColor:UIColor = .clear
if self.materialModel.status == YHMaterialStatus.review.rawValue {
text = "审核中".local
textColor = UIColor(hexString: "#FF9900")!
bgColor = UIColor(hexString: "#FF9900", transparency: 0.08)!
} else if self.materialModel.status == YHMaterialStatus.preUpload.rawValue {
text = "待上传".local
textColor = UIColor(hexString: "#2F7EF6")!
bgColor = UIColor(hexString: "#2F7EF6", transparency: 0.08)!
} else if self.materialModel.status == YHMaterialStatus.completed.rawValue {
text = "已完成".local
textColor = UIColor(hexString: "#49D2B1")!
bgColor = UIColor(hexString: "#49D2B1", transparency: 0.08)!
} else if self.materialModel.status == YHMaterialStatus.rejected.rawValue {
text = "已驳回".local
textColor = UIColor.failColor
bgColor = UIColor(hexString: "#F81D22", transparency: 0.08)!
}
statusLabel.text = text
statusLabel.textColor = textColor
statusLabel.backgroundColor = bgColor
let tipsLabel = UILabel()
tipsLabel.textColor = .labelTextColor2
tipsLabel.font = UIFont.PFSC_R(ofSize:14)
tipsLabel.textAlignment = .left
tipsLabel.numberOfLines = 0
tipsLabel.text = "支持的文件格式为jpg/jpeg、png、bmp、doc/docx、xls/xlsx、pdf,最多可上传99张图片或文件"
view.addSubview(tipsLabel)
titlelabel.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.top.equalToSuperview()
}
statusLabel.snp.makeConstraints { make in
make.centerY.equalTo(titlelabel)
make.left.equalTo(titlelabel.snp.right).offset(4)
make.right.lessThanOrEqualTo(view).offset(-20)
make.height.equalTo(16)
make.width.equalTo(38)
}
tipsLabel.snp.remakeConstraints { make in
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.top.equalTo(titlelabel.snp.bottom).offset(7)
make.bottom.equalToSuperview().offset(-15)
}
if self.materialModel.status != YHMaterialStatus.rejected.rawValue {
return view
}
if self.materialModel.audit_remark.isEmpty { // 无驳回理由
return view
}
// 有驳回理由
let rejectView = UIView()
view.addSubview(rejectView)
let warningImgV = UIImageView(image: UIImage(named: "my_cer_upload_warning"))
rejectView.addSubview(warningImgV)
let rejectTitleLabel = UILabel()
rejectTitleLabel.textColor = .failColor
rejectTitleLabel.font = UIFont.PFSC_R(ofSize:12)
rejectTitleLabel.textAlignment = .left
rejectTitleLabel.text = "驳回原因:"
rejectView.addSubview(rejectTitleLabel)
let rejectContentLabel = UILabel()
rejectContentLabel.textColor = .failColor
rejectContentLabel.font = UIFont.PFSC_R(ofSize:12)
rejectContentLabel.numberOfLines = 0
rejectContentLabel.textAlignment = .left
rejectContentLabel.text = self.materialModel.audit_remark
rejectView.addSubview(rejectContentLabel)
tipsLabel.snp.remakeConstraints { make in
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.top.equalTo(titlelabel.snp.bottom).offset(7)
make.bottom.equalTo(rejectView.snp.top).offset(-20)
}
rejectView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.bottom.equalToSuperview().offset(-12)
}
warningImgV.snp.makeConstraints { make in
make.width.height.equalTo(14)
make.left.top.equalTo(0)
}
rejectTitleLabel.snp.makeConstraints { make in
make.centerY.equalTo(warningImgV)
make.left.equalTo(warningImgV.snp.right).offset(4)
}
rejectContentLabel.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(warningImgV.snp.bottom).offset(7)
make.bottom.equalToSuperview()
}
return view
}
private func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> CGFloat {
if section == 0 {
return 20.0
}
return 60.0
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
if section == 0 {
return view
}
let label = UILabel(frame: CGRect(x: 0, y: 20, width:KScreenWidth, height:20))
label.textColor = UIColor.labelTextColor2
label.textAlignment = .center
label.font = UIFont.PFSC_R(ofSize:12)
let tipsFont = UIFont.PFSC_R(ofSize: 12)
let a: ASAttributedString = .init("已上传", .font(tipsFont),.foreground(UIColor.labelTextColor2))
let b: ASAttributedString = .init(" \(items.count)/99 ", .font(UIFont.PFSC_M(ofSize: 12)), .foreground(UIColor.init(hexString:"#2F2F2F")!))
let c: ASAttributedString = .init("张图片或文件", .font(tipsFont), .foreground(UIColor.labelTextColor2))
label.attributed.text = a+b+c
view.addSubview(label)
label.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
make.bottom.equalToSuperview().offset(-20)
}
return view
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.section == 0 { // 模板列表
if 0 <= indexPath.row && indexPath.row < templateArr.count {
let path = templateArr[indexPath.row]
print(path.fileUrl)
if !path.fileUrl.isEmpty {
self.previewFileTool.openXLSXRemoteFile(urlString:path.fileUrl, fileName:"预览")
}
}
} else if indexPath.section == 1 { // 证件列表
if 0 <= indexPath.row && indexPath.row < items.count {
let cer = items[indexPath.row]
if !cer.url.isEmpty {
print(cer.url)
self.viewModel.getPublicImageUrl(cer.url) { success, error in
if let success = success {
self.previewFileTool.openXLSXRemoteFile(urlString: success, fileName:cer.name)
}
}
}
}
}
}
@objc func dismissed() {
renameInputView.textField.resignFirstResponder()
}
}
extension YHResignUploadDocDetailViewController {
func addKeyBoardNotify() {
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}
func removeNotify() {
NotificationCenter.default.removeObserver(self)
}
@objc func handleKeyboardNotification(_ notification: Notification) {
if notification.userInfo != nil {
guard let keyboardFrame = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as AnyObject).cgRectValue else {return }
let isKeyboardShow = notification.name == UIResponder.keyboardWillShowNotification
self.blackMaskView.isHidden = !isKeyboardShow
let bottomMargin = (isKeyboardShow ? -keyboardFrame.height : YHFileRenameInputView.height)
if !isKeyboardShow {
IQKeyboardManager.shared.enable = true
}
self.renameInputView.snp.updateConstraints { make in
make.bottom.equalToSuperview().offset(bottomMargin)
}
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}
}
}
extension YHResignUploadDocDetailViewController {
func requestMaterialDetail() {
YHHUD.show(.progress(message: "加载中..."))
viewModel.getMaterialDeal(orderId: orderId, id: batchId, materialId: materialId) {
[weak self] success, error in
YHHUD.hide()
guard let self = self else { return }
self.materialModel = self.viewModel.materialDeal
self.items = self.materialModel.info
if self.materialModel.status == YHMaterialStatus.completed.rawValue {
self.uploadBtn.isHidden = true
} else {
self.uploadBtn.isHidden = false
self.uploadBtn.alpha = (items.count >= 99 ? 0.5 : 1.0)
}
self.tableView.snp.remakeConstraints { make in
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.left.right.equalToSuperview()
if self.materialModel.status == YHMaterialStatus.completed.rawValue {
make.bottom.equalToSuperview()
} else {
make.bottom.equalTo(self.uploadBtn.snp.top).offset(-34)
}
}
self.tableView.reloadData()
self.requestTemplate()
if let errorMsg = error?.errorMsg, errorMsg.count > 0 {
YHHUD.flash(message: errorMsg, duration:3)
}
}
}
func requestTemplate() {
viewModel.getTemplateInfo(templateId: self.materialModel.template_id) {
[weak self] success, error in
guard let self = self else { return }
self.templateModel = self.viewModel.templateDeail
self.templateArr = self.templateModel.file_url
self.tableView.reloadData()
}
}
}
//
// YHResignUploadDocListViewController.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHResignUploadDocListViewController: YHBaseViewController {
var orderId: Int = 0
lazy var viewModel: YHTravelDocsPreparationViewModel = {
let vm = YHTravelDocsPreparationViewModel()
return vm
}()
var bgImageView: UIImageView!
var titleLabel: UILabel!
var messageLabel: UILabel!
lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped)
tableView.estimatedSectionHeaderHeight = 16.0
tableView.estimatedSectionFooterHeight = 0.01
tableView.contentInsetAdjustmentBehavior = .never
tableView.showsVerticalScrollIndicator = false
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.backgroundColor = .clear
tableView.register(YHResignUploadDocListCell.self, forCellReuseIdentifier: YHResignUploadDocListCell.cellReuseIdentifier)
tableView.register(YHTravelDocsPreparationTipsCell.self, forCellReuseIdentifier: YHTravelDocsPreparationTipsCell.cellReuseIdentifier)
return tableView
}()
//我已知悉,确认
lazy var rewardBtn: UIButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 15)
button.contentHorizontalAlignment = .center
button.setTitle("去查看港府续签结果结", for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.setTitleColor(UIColor.white, for: .disabled)
button.layer.cornerRadius = kCornerRadius3
button.clipsToBounds = true
button.addTarget(self, action: #selector(clickNextBtn), for: .touchUpInside)
button.backgroundColor = UIColor.brandMainColor
return button
}()
lazy var bottomView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.addSubview(self.rewardBtn)
self.rewardBtn.snp.makeConstraints { make in
make.top.equalToSuperview().offset(10)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(44)
}
view.layer.zPosition = 10
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
loadData()
}
@objc func clickNextBtn() {
}
}
private extension YHResignUploadDocListViewController {
func loadData() {
let params: [String : Any] = ["order_id": orderId]
YHHUD.show(.progress(message: "加载中..."))
viewModel.getTravelDocsList(param: params){ success, error in
YHHUD.hide()
if success {
} else {
// let msg = error?.errorMsg ?? "获取数据出错"
// YHHUD.flash(message: msg)
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
// self.navigationController?.popViewController()
// }
}
self.tableView.reloadData()
}
}
func setupUI() {
gk_navTitle = "续签补件"
view.backgroundColor = UIColor.contentBkgColor
bgImageView = {
let imageView = UIImageView()
imageView.image = UIImage(named: "resign_upload_doc_head")
return imageView
}()
view.addSubview(bgImageView)
bgImageView.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
make.height.equalTo(375.fix)
}
titleLabel = {
let label = UILabel()
label.numberOfLines = 0
let a = ASAttributedString.init("您申请的【优才入境计划】续签,", .font(UIFont.PFSC_M(ofSize:17)), .foreground(UIColor.mainTextColor50))
let b = ASAttributedString.init("港澳通行证逗留(D)签注延期-办理指引", .font(UIFont.PFSC_M(ofSize:17)),.foreground(UIColor.yhOrangeColor))
label.attributed.text = a+b
return label
}()
view.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.height.equalTo(60)
make.top.equalTo(k_Height_NavigationtBarAndStatuBar + 24)
}
messageLabel = {
let label = UILabel()
label.numberOfLines = 0
let a = ASAttributedString.init("请您于", .font(UIFont.PFSC_M(ofSize:14)), .foreground(UIColor.mainTextColor50))
let b = ASAttributedString.init("2024年8月8日前", .font(UIFont.PFSC_M(ofSize:14)),.foreground(UIColor.brandMainColor))
let c = ASAttributedString.init("根据补件清单上传资料递交至港府;如无及时递交,可能导致身份失效!", .font(UIFont.PFSC_M(ofSize:14)), .foreground(UIColor.mainTextColor50))
label.attributed.text = a+b+c
return label
}()
view.addSubview(messageLabel)
messageLabel.snp.makeConstraints { make in
make.left.equalTo(20)
make.right.equalTo(-20)
make.height.equalTo(44)
make.top.equalTo(k_Height_NavigationtBarAndStatuBar + 84)
}
view.addSubview(bottomView)
bottomView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.height.equalTo(98)
make.bottom.equalToSuperview()
}
view.addSubview(tableView)
tableView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar + 160)
make.bottom.equalTo(-98)
}
}
}
extension YHResignUploadDocListViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let approveCell = tableView.dequeueReusableCell(withIdentifier: YHResignUploadDocListCell.cellReuseIdentifier, for: indexPath) as! YHResignUploadDocListCell
return approveCell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return YHTravelDocsPreparationListCell.cellH
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
private func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> CGFloat {
return 16.0
}
private func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> CGFloat {
return 0.01
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
}
//
// YHFileExplainReasonInputView.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHFileExplainReasonInputView: UIView {
static let height = 294.0
var maxWordsCount = 50
var editBlock:((String?)->Void)?
var dismissBlock:(()->())?
lazy var blackMaskView: UIView = {
let view = UIView(frame:UIScreen.main.bounds)
view.backgroundColor = UIColor(hex: 0x0F1214, alpha: 0.5)
let tap = UITapGestureRecognizer(target: self, action: #selector(dismiss))
view.addGestureRecognizer(tap)
return view
}()
lazy var whiteContentView: UIView = {
let view = UIView()
view.backgroundColor = .white
let tap = UITapGestureRecognizer(target: self, action: #selector(didWhiteContentViewTap))
view.addGestureRecognizer(tap)
return view
}()
lazy var titleLabel: UILabel = {
let label = UILabel()
label.textColor = UIColor.mainTextColor
label.textAlignment = .center
label.font = UIFont.PFSC_B(ofSize:17)
label.text = "文件重命名"
return label
}()
lazy var closeBtn: UIButton = {
let btn = UIButton()
btn.setImage(UIImage(named:"my_cer_sheet_close"), for: .normal)
btn.addTarget(self, action: #selector(dismiss), for: .touchUpInside)
return btn
}()
lazy var topLine:UIView = {
let view = UIView()
view.backgroundColor = .separatorColor
return view
}()
lazy var inputContentView: UIView = {
let view = UIView()
view.backgroundColor = .contentBkgColor
view.layer.cornerRadius = kCornerRadius6
view.clipsToBounds = true
return view
}()
lazy var textField: UITextView = {
let textField = UITextView()
textField.backgroundColor = .clear
textField.font = UIFont.PFSC_M(ofSize: 16)
textField.tintColor = UIColor.brandMainColor
textField.textColor = UIColor.mainTextColor
textField.delegate = self
textField.returnKeyType = .done
return textField
}()
lazy var cancelBtn:UIButton = {
let btn = UIButton()
btn.setTitle("取消", for: .normal)
btn.titleLabel?.font = UIFont.PFSC_M(ofSize: 14)
btn.setTitleColor(UIColor.mainTextColor, for: .normal)
btn.backgroundColor = .contentBkgColor
btn.layer.cornerRadius = kCornerRadius3
btn.addTarget(self, action: #selector(didClickCancelBtn), for: .touchUpInside)
return btn
}()
lazy var confirmBtn:UIButton = {
let btn = UIButton()
btn.setTitle("确定".local, for: .normal)
btn.titleLabel?.font = UIFont.PFSC_M(ofSize: 14)
btn.setTitleColor(.white, for: .normal)
btn.backgroundColor = UIColor.brandMainColor
btn.layer.cornerRadius = kCornerRadius3
btn.addTarget(self, action: #selector(didClickConfirmBtn), for: .touchUpInside)
return btn
}()
override init(frame: CGRect) {
super.init(frame:frame)
createUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
static func inputView(defalutText:String?,_ placeholde: String = "请输入文件名称", _ title: String = "文件重命名")-> YHFileExplainReasonInputView {
let view = YHFileExplainReasonInputView(frame:CGRect(x: 0, y: 0, width:KScreenWidth, height:Self.height))
view.textField.text = defalutText
view.titleLabel.text = title
return view
}
func createUI() {
self.addSubview(whiteContentView)
whiteContentView.addSubview(titleLabel)
whiteContentView.addSubview(closeBtn)
whiteContentView.addSubview(topLine)
whiteContentView.addSubview(inputContentView)
inputContentView.addSubview(textField)
whiteContentView.addSubview(cancelBtn)
whiteContentView.addSubview(confirmBtn)
let corner = UIRectCorner(rawValue: UIRectCorner.topLeft.rawValue | UIRectCorner.topRight.rawValue)
let path = UIBezierPath(roundedRect:bounds,byRoundingCorners: corner,cornerRadii:CGSizeMake(kCornerRadius6, kCornerRadius6));
let layer = CAShapeLayer();
layer.frame = whiteContentView.bounds;
layer.path = path.cgPath;
whiteContentView.layer.mask = layer;
whiteContentView.snp.makeConstraints { make in
make.left.right.top.bottom.equalToSuperview()
}
titleLabel.snp.makeConstraints { make in
make.left.right.top.equalToSuperview()
make.height.equalTo(52.0)
}
closeBtn.snp.makeConstraints { make in
make.width.height.equalTo(24.0)
make.right.equalToSuperview().offset(-20)
make.centerY.equalTo(titleLabel)
}
topLine.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.top.equalTo(titleLabel.snp.bottom)
make.height.equalTo(1)
}
inputContentView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(20)
make.right.equalToSuperview().offset(-20)
make.top.equalTo(topLine.snp.bottom).offset(20)
make.height.equalTo(48)
}
textField.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.right.equalToSuperview().offset(-16)
make.height.equalTo(20)
make.centerY.equalToSuperview()
}
cancelBtn.snp.makeConstraints { make in
make.left.equalToSuperview().offset(16)
make.right.equalTo(whiteContentView.snp.centerX).offset(-6)
make.top.equalTo(inputContentView.snp.bottom).offset(30)
make.height.equalTo(45)
}
confirmBtn.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-16)
make.left.equalTo(whiteContentView.snp.centerX).offset(6)
make.top.equalTo(cancelBtn)
make.height.equalTo(45)
}
}
}
extension YHFileExplainReasonInputView {
@objc func dismiss() {
self.textField.resignFirstResponder()
UIApplication.shared.yhKeyWindow()?.endEditing(true)
self.dismissBlock?()
}
@objc func didWhiteContentViewTap() {
self.textField.becomeFirstResponder()
}
@objc func didClickCancelBtn() {
dismiss()
}
@objc func didClickConfirmBtn() {
if isEmptyString(textField.text) {
YHHUD.flash(message: "重命名不可为空")
return
}
if let editBlock = editBlock {
editBlock(textField.text)
}
dismiss()
}
}
extension YHFileExplainReasonInputView: UITextViewDelegate {
}
//
// YHResignUploadDocListCell.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHResignUploadDocListCell: UITableViewCell {
static let cellReuseIdentifier = "YHResignUploadDocListCell"
typealias ExperienceListBlock = (_ model: YHAdopterDependentModel) -> ()
var clickBlock: ExperienceListBlock?
var centerView: UIView!
var titleLabel: UILabel!
var mainItemView: UIView!
var lineView: UIView!
var dataSource: [YHAdopterDependentModel]? {
didSet {
updateAllViews()
}
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
selectionStyle = .none
setupUI()
}
func setupUI() {
backgroundColor = .clear
centerView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
return view
}()
contentView.addSubview(centerView)
centerView.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(14)
make.bottom.equalTo(-7)
}
titleLabel = {
let label = UILabel()
label.font = UIFont.PFSC_M(ofSize: 17)
label.text = "新增受养人"
label.textColor = UIColor.mainTextColor
return label
}()
centerView.addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(23)
make.height.equalTo(24)
make.right.equalTo(-20)
}
lineView = {
let view = UIView()
view.backgroundColor = UIColor.separatorColor
return view
}()
centerView.addSubview(lineView)
lineView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(62.5)
make.height.equalTo(0.5)
}
mainItemView = {
let view = UIView()
view.backgroundColor = .white
view.layer.cornerRadius = kCornerRadius6
return view
}()
centerView.addSubview(mainItemView)
mainItemView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.bottom.equalTo(-63)
make.top.equalTo(63)
}
}
func updateAllViews() {
mainItemView.removeSubviews()
guard let dataSource = dataSource else {
return
}
var total = 0
for i in 0 ..< dataSource.count {
if i != 0 {
let line = UIView()
line.backgroundColor = UIColor.separatorColor
mainItemView.addSubview(line)
line.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(total)
make.height.equalTo(0.5)
make.right.equalTo(-18)
}
}
total = total + 1
let itemView = YHResignUploadDocItemView()
itemView.clickBlock = {[weak self] model in
guard let self = self else { return }
if let block = self.clickBlock {
block(model)
}
}
let model = dataSource[i]
itemView.tag = 4000 + i
itemView.dataSource = dataSource[i]
mainItemView.addSubview(itemView)
itemView.snp.makeConstraints { make in
make.left.equalTo(18)
make.top.equalTo(total)
make.height.equalTo(51)
make.right.equalTo(-18)
}
total = total + 51
}
}
}
class YHResignUploadDocItemView: UIView {
typealias ItemBlock = (_ model: YHAdopterDependentModel) -> ()
var clickBlock: ItemBlock?
var deleteBlock: ItemBlock?
var titleLabel: UILabel!
var explainLabel: UILabel!
var nextStepImageView: UIImageView!
var centerButton: UIButton!
var dataSource: YHAdopterDependentModel? {
didSet {
updateAllViews()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .white
setUpView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setUpView() {
titleLabel = {
let label = UILabel()
label.font = UIFont.PFSC_B(ofSize: 14)
label.textAlignment = .left
label.numberOfLines = 2
label.textColor = UIColor.mainTextColor
return label
}()
addSubview(titleLabel)
titleLabel.snp.makeConstraints { make in
make.left.top.bottom.equalToSuperview()
make.right.equalTo(-30)
}
explainLabel = {
let label = UILabel()
label.font = UIFont.PFSC_R(ofSize: 14)
label.textAlignment = .right
label.textColor = UIColor.labelTextColor2
return label
}()
addSubview(explainLabel)
explainLabel.snp.makeConstraints { make in
make.right.equalTo(-24)
make.left.equalToSuperview()
make.height.equalTo(20)
make.centerY.equalToSuperview()
}
nextStepImageView = {
let imageView = UIImageView()
imageView.image = UIImage(named: "form_right_arrow")
return imageView
}()
addSubview(nextStepImageView)
nextStepImageView.snp.makeConstraints { make in
make.right.equalToSuperview()
make.centerY.equalTo(explainLabel.snp.centerY)
make.height.width.equalTo(20)
}
centerButton = {
let button = UIButton(type: .custom)
button.addTarget(self, action: #selector(centerClick), for: .touchUpInside)
return button
}()
addSubview(centerButton)
centerButton.snp.makeConstraints { make in
make.right.top.bottom.equalToSuperview()
make.left.equalTo(112)
}
}
func updateAllViews() {
guard let dataSource = dataSource else { return }
var spouse = "子女"
if dataSource.is_spouse == 1 {
spouse = "配偶"
}
if dataSource.dep_name.count != 0 {
titleLabel.text = spouse + "(\(dataSource.dep_name))"
} else {
titleLabel.text = spouse
}
if dataSource.status == 0 {
explainLabel.text = "待上传"
explainLabel.textColor = UIColor.brandMainColor
nextStepImageView.image = UIImage(named: "service_adopter_income_start")
}
if dataSource.status == 1 {
explainLabel.text = "审核中"
explainLabel.textColor = UIColor(hex: 0xff8000)
nextStepImageView.image = UIImage(named: "service_adopter_income_wait")
}
if dataSource.status == 2 {
explainLabel.text = "已驳回"
explainLabel.textColor = UIColor.failColor
nextStepImageView.image = UIImage(named: "service_adopter_income_fail")
}
if dataSource.status == 3 {
explainLabel.text = "已完成"
explainLabel.textColor = UIColor(hex: 0x3cc694)
nextStepImageView.image = UIImage(named: "service_adopter_income_success")
}
}
func updateDocAllViews() {
guard let dataSource = dataSource else { return }
if dataSource.status == 0 {
explainLabel.text = "待确认"// “待签字”
explainLabel.textColor = UIColor.brandMainColor
nextStepImageView.image = UIImage(named: "service_adopter_income_start")
}
if dataSource.status == 1 {
explainLabel.text = "写作中"// 定稿中 审核中
explainLabel.textColor = UIColor(hex: 0xff8000)
nextStepImageView.image = UIImage(named: "service_adopter_income_wait")
}
if dataSource.status == 2 {
explainLabel.text = "已驳回"
explainLabel.textColor = UIColor.failColor
nextStepImageView.image = UIImage(named: "service_adopter_income_fail")
}
if dataSource.status == 3 {
explainLabel.text = "已完成"
explainLabel.textColor = UIColor(hex: 0x3cc694)
nextStepImageView.image = UIImage(named: "service_adopter_income_success")
}
}
@objc func centerClick() {
if let block = clickBlock {
block(self.dataSource ?? YHAdopterDependentModel())
}
}
}
//
// YHResignUploadSuccessDocListCell.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHResignUploadSuccessDocListCell: UITableViewCell {
static let cellReuseIdentifier = "YHResignUploadSuccessDocListCell"
typealias ExperienceListBlock = (_ model: YHWorkExperienceFileModel, _ type: YHWorkFileClickType) -> ()
var experienceListBlock: ExperienceListBlock?
var mainItemView: UIView!
var dataSource: [YHWorkExperienceFileModel]?{
didSet {
updateAllViews()
}
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
selectionStyle = .none
setupUI()
}
func setupUI() {
backgroundColor = .clear
mainItemView = {
let view = UIView()
view.backgroundColor = .white
return view
}()
contentView.addSubview(mainItemView)
mainItemView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.bottom.equalToSuperview()
make.top.equalTo(16)
}
}
func updateAllViews() {
mainItemView.removeSubviews()
for i in 0 ..< (dataSource?.count ?? 0) {
let itemView = YHResignUploadFileItemView()
itemView.dataSource = dataSource?[i]
itemView.block = {[weak self] model, type in
guard let self = self else { return }
if let block = self.experienceListBlock {
block(model, type)
}
}
mainItemView.addSubview(itemView)
itemView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(55 * i)
make.height.equalTo(55)
}
}
}
}
class YHResignUploadFileItemView: UIView {
typealias ItemBlock = (_ model: YHWorkExperienceFileModel, _ type: YHWorkFileClickType) -> ()
var block: ItemBlock?
var whiteView: UIButton!
var iconImgV: UIImageView!
var nameLabel: UILabel!
var timeLabel: UILabel!
var editBtn: UIButton!
var dataSource: YHWorkExperienceFileModel? {
didSet {
updateAllViews()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = .white
setUpView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setUpView() {
whiteView = UIButton()
whiteView.addTarget(self, action: #selector(itemClick), for: .touchUpInside)
addSubview(whiteView)
iconImgV = UIImageView(image:UIImage(named:"my_cer_type_jpg"))
whiteView.addSubview(iconImgV)
nameLabel = UILabel()
nameLabel.textColor = UIColor.mainTextColor
nameLabel.textAlignment = .left
nameLabel.numberOfLines = 0
nameLabel.font = UIFont.PFSC_M(ofSize:14)
whiteView.addSubview(nameLabel)
timeLabel = UILabel()
timeLabel.textColor = UIColor.labelTextColor2
timeLabel.textAlignment = .left
timeLabel.font = UIFont.PFSC_R(ofSize:11)
whiteView.addSubview(timeLabel)
editBtn = UIButton()
editBtn.setImage(UIImage(named:"my_cer_btn_edit"), for:.normal)
editBtn.setTitle("查看", for: .normal)
editBtn.setTitleColor(UIColor.mainTextColor, for: .normal)
editBtn.setBackgroundColor(color: UIColor(hex: 0xf4f6fa), forState: .normal)
editBtn.YH_clickEdgeInsets = UIEdgeInsets(top: 30, left: 30, bottom: 30, right: 30)
editBtn.addTarget(self, action: #selector(deleteClick), for: .touchUpInside)
editBtn.layer.cornerRadius = 10
whiteView.addSubview(editBtn)
whiteView.snp.makeConstraints { make in
make.left.equalTo(18)
make.right.equalTo(-18)
make.centerY.equalToSuperview()
make.height.equalTo(55)
}
iconImgV.snp.makeConstraints { make in
make.width.height.equalTo(31)
make.centerY.equalToSuperview()
make.left.equalToSuperview().offset(6)
}
nameLabel.snp.makeConstraints { make in
make.left.equalTo(iconImgV.snp.right).offset(18)
make.top.equalToSuperview().offset(7)
make.right.equalTo(editBtn.snp.left)
}
timeLabel.snp.makeConstraints { make in
make.left.right.equalTo(nameLabel)
make.top.equalTo(nameLabel.snp.bottom).offset(2)
make.bottom.equalToSuperview().offset(-7)
make.height.equalTo(20)
}
editBtn.snp.makeConstraints { make in
make.width.equalTo(38)
make.height.equalTo(20)
make.centerY.equalToSuperview()
make.right.equalToSuperview()
}
}
func updateAllViews() {
guard let dataSource = dataSource else { return }
nameLabel.text = dataSource.fileName
timeLabel.text = "上传于\(dataSource.uploadedAt)"
let suffix = dataSource.fileUrl.pathExtension.lowercased()
var iconImgName = ""
if suffix == "jpeg" {
iconImgName = "my_cer_type_jpg"
} else if suffix == "jpg" {
iconImgName = "my_cer_type_jpg"
} else if suffix == "png" {
iconImgName = "my_cer_type_png"
} else if suffix == "pdf" {
iconImgName = "my_cer_type_pdf"
} else if suffix == "doc" || suffix == "docx" {
iconImgName = "my_cer_type_word"
} else if suffix == "ppt" || suffix == "pptx" {
iconImgName = "my_cer_type_ppt"
} else if suffix == "bmp" {
iconImgName = "my_cer_type_bmp"
} else if suffix == "tiff" {
iconImgName = "my_cer_type_tiff"
} else if suffix == "xls" || suffix == "xlsx" {
iconImgName = "my_cer_type_excel"
}
iconImgV.image = UIImage(named: iconImgName)
}
@objc func itemClick() {
if let block = block, let dataSource = dataSource {
block(dataSource, .click)
}
}
@objc func deleteClick() {
if let block = block, let dataSource = dataSource {
block(dataSource, .click)
}
}
}
//
// YHResignUploadTravelCardListViewController.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHResignUploadTravelCardListViewController: YHBaseViewController {
var orderId: Int = 0
lazy var viewModel: YHTravelDocsPreparationViewModel = {
let vm = YHTravelDocsPreparationViewModel()
return vm
}()
lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped)
tableView.estimatedSectionHeaderHeight = 16.0
tableView.estimatedSectionFooterHeight = 0.01
tableView.contentInsetAdjustmentBehavior = .never
tableView.showsVerticalScrollIndicator = false
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.tableHeaderView = YHResignUploadTravelCardListheadView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: 16 + 90.fix))
tableView.tableFooterView = YHResignUploadTravelCardListfootView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: 837.fix))
tableView.backgroundColor = .clear
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
tableView.register(YHTravelDocsPreparationListCell.self, forCellReuseIdentifier: YHTravelDocsPreparationListCell.cellReuseIdentifier)
tableView.register(YHTravelDocsPreparationTipsCell.self, forCellReuseIdentifier: YHTravelDocsPreparationTipsCell.cellReuseIdentifier)
return tableView
}()
//我已知悉,确认
lazy var rewardBtn: UIButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 15)
button.contentHorizontalAlignment = .center
button.setTitle("下一步,去查看续签总结", for: .normal)
button.setTitle("下一步,去查看续签总结", for: .disabled)
button.setTitleColor(UIColor.white, for: .normal)
button.setTitleColor(UIColor.white, for: .disabled)
button.layer.cornerRadius = kCornerRadius3
button.clipsToBounds = true
button.addTarget(self, action: #selector(clickNextBtn), for: .touchUpInside)
button.backgroundColor = UIColor.brandMainColor
return button
}()
lazy var bottomView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.addSubview(self.rewardBtn)
self.rewardBtn.snp.makeConstraints { make in
make.top.equalToSuperview().offset(10)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(44)
}
view.layer.zPosition = 10
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
loadData()
}
@objc func clickNextBtn() {
}
}
private extension YHResignUploadTravelCardListViewController {
func loadData() {
let params: [String : Any] = ["order_id": orderId]
YHHUD.show(.progress(message: "加载中..."))
viewModel.getTravelDocsList(param: params){ success, error in
YHHUD.hide()
if success {
} else {
let msg = error?.errorMsg ?? "获取数据出错"
YHHUD.flash(message: msg)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.navigationController?.popViewController()
}
}
self.tableView.reloadData()
}
}
func setupUI() {
gk_navTitle = "上传旅行证件"
gk_navBarAlpha = 1.0
gk_navBackgroundColor = .white
view.backgroundColor = UIColor.contentBkgColor
if orderId == 0 {
if let id = UserDefaults.standard.value(forKey: "orderIdForPreview") {
self.orderId = (id as? Int) ?? 0
}
}
view.addSubview(bottomView)
bottomView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.height.equalTo(98)
make.bottom.equalToSuperview()
}
view.addSubview(tableView)
tableView.snp.makeConstraints { make in
make.left.equalToSuperview()
make.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.bottom.equalTo(-98)
}
}
}
extension YHResignUploadTravelCardListViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return viewModel.arrTravelDocs.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let approveCell = tableView.dequeueReusableCell(withIdentifier: YHTravelDocsPreparationListCell.cellReuseIdentifier, for: indexPath) as! YHTravelDocsPreparationListCell
approveCell.dataModel = viewModel.arrTravelDocs[indexPath.section]
return approveCell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return YHTravelDocsPreparationListCell.cellH
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let model = viewModel.arrTravelDocs[indexPath.section] {
if model.status == -1 {
return
} else {
let vc = YHTravelDocsPreparationDetailVC()
vc.dataModel = model
vc.orderId = orderId
self.navigationController?.pushViewController(vc)
}
}
}
private func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> CGFloat {
return 16.0
}
private func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> CGFloat {
return 0.01
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
}
//
// YHResignUploadTravelHKViewController.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHResignUploadTravelHKViewController: YHBaseViewController {
lazy var viewModel: YHResignCertificateDetailViewModel = {
let vm = YHResignCertificateDetailViewModel()
return vm
}()
//上个界面传递过来的数据对象
var dataModel : YHResignCertificateModel = YHResignCertificateModel()
var orderId: Int = 0
var tipsArr: [ASAttributedString] = []
var urls: [String] = ["",""]
var data: [YHItemModel] = []
var isShowPrompt = false
var failString: String = ""
lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped)
tableView.estimatedSectionHeaderHeight = 0.01
tableView.estimatedSectionFooterHeight = 14.0
tableView.contentInsetAdjustmentBehavior = .never
tableView.showsVerticalScrollIndicator = false
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.backgroundColor = UIColor(hex: 0xF8F9FB)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
tableView.register(YHTravelCertificateTipsCell.self, forCellReuseIdentifier: YHTravelCertificateTipsCell.cellReuseIdentifier)
tableView.register(YHResignCertificateHKTableViewCell.self, forCellReuseIdentifier: YHResignCertificateHKTableViewCell.cellReuseIdentifier)
return tableView
}()
let bottomViewHeight = 98.0
lazy var bottomView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.addSubview(bottomBtn)
bottomBtn.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(8)
make.height.equalTo(48)
}
return view
}()
lazy var bottomBtn: UIButton = {
let btn = UIButton()
btn.backgroundColor = .brandMainColor
btn.setTitle("确认,保存", for: .normal)
btn.setTitleColor(.white, for: .normal)
btn.titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
btn.addTarget(self, action: #selector(didSaveBtnClicked), for: .touchUpInside)
btn.layer.cornerRadius = kCornerRadius3
return btn
}()
override func viewDidLoad() {
super.viewDidLoad()
self.gk_navTitle = "上传旅行证件"
self.view.backgroundColor = .white
self.view.addSubview(self.tableView)
self.view.addSubview(bottomView)
self.tableView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.bottom.equalTo(bottomView.snp.top)
}
self.bottomView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(98)
}
self.bottomView.addSubview(bottomBtn)
self.bottomBtn.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(8)
make.height.equalTo(48)
}
loadDetailInfo()
}
func getTextWithType(type: Int, date:String) -> ASAttributedString {
if type == 0 {
return .init("上传《港澳通行证》(需有效期≥\(date))", .font(UIFont.PFSC_R(ofSize:14)),.foreground(UIColor.mainTextColor(alpha: 0.5)))
}
if type == 1 {
let a = ASAttributedString.init("办理逗留D签注延期(有效期≥签证时长)", .font(UIFont.PFSC_R(ofSize:14)), .foreground(UIColor.mainTextColor50))
let b = ASAttributedString.init("《", .font(UIFont.PFSC_R(ofSize:14)),.foreground(UIColor.brandMainColor))
let c = ASAttributedString.init("港澳通行证逗留(D)签注延期-办理指引", .font(UIFont.PFSC_R(ofSize:14)),.foreground(UIColor.brandMainColor), .underline(.single), .action {
//跳转提示
YHHUD.flash(message: "弹窗提示")
let view = YHResignUploadTravelGuideView.sheetView()
view.show()
})
let d = ASAttributedString.init("》", .font(UIFont.PFSC_R(ofSize:14)),.foreground(UIColor.brandMainColor))
return a+b+c+d
}
return .init("", .font(UIFont.PFSC_R(ofSize:14)),.foreground(UIColor.mainTextColor(alpha: 0.5)))
}
func getTipsWithType(date: String) -> [ASAttributedString] {
return [self.getTextWithType(type: 0, date: date),
self.getTextWithType(type: 1, date: date)]
}
func updateData() {
// travel_cert_type 证件类型 0-未知 1-护照 3-港澳通行证
// nationality : Int = -1 国籍 1-中国 2-国外
self.viewModel.dataModel = dataModel
if dataModel.cert_info.img_front.count != 0 {
urls[0] = dataModel.cert_info.img_front
}
if dataModel.cert_info.img_back.count != 0 {
urls[1] = dataModel.cert_info.img_back
}
self.data = viewModel.getBaseDataSource(isShowPrompt)
// 头部提示
tipsArr = getTipsWithType(date: self.dataModel.valid_date)
tableView.reloadData()
}
@objc func didSaveBtnClicked() {
if !checkInfo() {
isShowPrompt = true
updateData()
return
}
saveAllTravelCertificate()
}
func checkInfo() -> Bool {
if urls.first?.count == 0 {
failString = "请港澳通行证正面"
return false
}
if urls.last?.count == 0 {
failString = "请港澳通行证背面"
return false
}
if self.viewModel.dataModel.cert_info.issue_start.count == 0 {
return false
}
if self.viewModel.dataModel.cert_info.issue_end.count == 0 {
return false
}
if self.viewModel.dataModel.cert_info.validate_start.count == 0 {
return false
}
if self.viewModel.dataModel.cert_info.validate_end.count == 0 {
return false
}
return true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if dataModel.cert_info.is_show {
} else {
YHAdopterCardExampleView.exampleView(type: .travel).show()
let hkPassPort: [String: Any] = ["is_show": true,
"submit": false
]
let params : [String : Any] = [
"hkPassPort": hkPassPort,
"id":dataModel.id
]
viewModel.submitResignCertificateUpdate(params) { success, error in
}
}
}
}
private extension YHResignUploadTravelHKViewController {
//1、获取详情信息
func loadDetailInfo() {
self.updateData()
}
//2、保存旅行证件
func saveAllTravelCertificate() {
let hkPassPort: [String: Any] = ["name": "港澳通行证",
"issue_start": self.viewModel.dataModel.cert_info.issue_start,
"issue_end": self.viewModel.dataModel.cert_info.issue_end,
"img_front": urls[0],
"img_back": urls[1],
"validate_start": self.viewModel.dataModel.cert_info.validate_start,
"validate_end": self.viewModel.dataModel.cert_info.validate_end,
"sign_type": "D",
"submit": true,
"is_show": true]
let params : [String : Any] = [
"hkPassPort": hkPassPort,
"id": dataModel.id
]
viewModel.submitResignCertificateUpdate(params) { success, error in
if success {
YHHUD.flash(message: "保存成功")
self.navigationController?.popViewController()
} else {
let msg = error?.errorMsg ?? "保存失败,请重试"
YHHUD.flash(message: msg)
}
}
}
}
extension YHResignUploadTravelHKViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: YHTravelCertificateTipsCell.cellReuseIdentifier, for: indexPath) as! YHTravelCertificateTipsCell
cell.userName = self.dataModel.name
cell.tipsArr = tipsArr
return cell
}
let cell = tableView.dequeueReusableCell(withIdentifier: YHResignCertificateHKTableViewCell.cellReuseIdentifier, for: indexPath) as! YHResignCertificateHKTableViewCell
cell.firstImageName = "service_adopter_card_travel_front"
cell.lastImageName = "service_adopter_card_travel_back"
cell.firstLabelName = "港澳通行证正面"
cell.lastLabelName = "港澳通行证倍面"
cell.dataModel = dataModel
cell.failString = failString
cell.data = data
cell.urls = urls
cell.urlBlock = { [weak self] url, index in
guard let self = self else { return }
self.urls[index] = url
self.viewModel.getPublicImageUrl(url) {[weak self] success, error in
guard let self = self else { return }
guard let url = success else { return }
if index == 0 {
self.viewModel.getHKCardInfoByOcr(url, isBack: 0) { success, result in
YHHUD.hide()
if success, let result = result {
if !result.term_begins.isEmpty {
self.dataModel.cert_info.issue_start = result.term_begins
}
if !result.end_of_term.isEmpty {
self.dataModel.cert_info.issue_end = result.end_of_term
}
} else {
// OCR 无法识别
self.failString = "非逗留(D)签证,请检查文件"
}
self.updateData()
}
} else {
self.viewModel.getHKCardBackInfoByOcr(url, isBack: 1) { success, result in
YHHUD.hide()
if success, let result = result {
if !result.back_term_begins.isEmpty { self.dataModel.cert_info.validate_start = result.back_term_begins
}
if !result.back_end_of_term.isEmpty {
self.dataModel.cert_info.validate_end = result.back_end_of_term
}
} else {
// OCR 无法识别
self.failString = "非逗留(D)签证,请检查文件"
}
self.updateData()
}
}
}
}
cell.deleteBlock = { [weak self] url, index in
guard let self = self else { return }
self.urls[index] = url
if index == 0 {
self.dataModel.cert_info.img_front = ""
} else {
self.dataModel.cert_info.img_back = ""
}
}
cell.block = {[weak self] model in
guard let self = self else { return }
self.viewModel.updateModel(model)
self.dataModel = self.viewModel.dataModel
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section != 0 {
if urls[0].count == 0 && urls[1].count == 0 {
return 243
} else {
var tatol = 0
for item in data {
let isShow = item.isShowPrompts ?? false
let message = item.message ?? ""
let isNeed = item.isNeed ?? false
if isShow && message.count == 0 && isNeed {
tatol = tatol + 20
}
}
return CGFloat(521 + tatol)
}
}
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
private func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> CGFloat {
return 0.01
}
private func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> CGFloat {
return 14.0
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
if section == 0 {
view.backgroundColor = .white
}
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
}
//
// YHResignUploadTravelPassportViewController.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import AttributedString
class YHResignUploadTravelPassportViewController: YHBaseViewController {
lazy var viewModel: YHResignCertificateDetailViewModel = {
let vm = YHResignCertificateDetailViewModel()
return vm
}()
//上个界面传递过来的数据对象
var dataModel : YHResignCertificateModel = YHResignCertificateModel()
var orderId: Int = 0
var tipsArr: [ASAttributedString] = []
var urls: [String] = [""]
var data: [YHItemModel] = []
var isShowPrompt = false
var failString: String = ""
lazy var tableView: UITableView = {
let tableView = UITableView(frame:.zero, style:.grouped)
tableView.estimatedSectionHeaderHeight = 0.01
tableView.estimatedSectionFooterHeight = 14.0
tableView.contentInsetAdjustmentBehavior = .never
tableView.showsVerticalScrollIndicator = false
tableView.separatorStyle = .none
tableView.delegate = self
tableView.dataSource = self
tableView.backgroundColor = UIColor(hex: 0xF8F9FB)
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
tableView.register(YHTravelCertificateTipsCell.self, forCellReuseIdentifier: YHTravelCertificateTipsCell.cellReuseIdentifier)
tableView.register(YHResignCertificatePassportTableViewCell.self, forCellReuseIdentifier: YHResignCertificatePassportTableViewCell.cellReuseIdentifier)
return tableView
}()
let bottomViewHeight = 98.0
lazy var bottomView: UIView = {
let view = UIView()
view.backgroundColor = .white
view.addSubview(bottomBtn)
bottomBtn.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(8)
make.height.equalTo(48)
}
return view
}()
lazy var bottomBtn: UIButton = {
let btn = UIButton()
btn.backgroundColor = .brandMainColor
btn.setTitle("确认,保存", for: .normal)
btn.setTitleColor(.white, for: .normal)
btn.titleLabel?.font = UIFont.PFSC_M(ofSize: 16)
btn.addTarget(self, action: #selector(didSaveBtnClicked), for: .touchUpInside)
btn.layer.cornerRadius = kCornerRadius3
return btn
}()
override func viewDidLoad() {
super.viewDidLoad()
self.gk_navTitle = "上传旅行证件"
self.view.backgroundColor = .white
self.view.addSubview(self.tableView)
self.view.addSubview(bottomView)
self.tableView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
make.top.equalTo(k_Height_NavigationtBarAndStatuBar)
make.bottom.equalTo(bottomView.snp.top)
}
self.bottomView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.height.equalTo(98)
}
self.bottomView.addSubview(bottomBtn)
self.bottomBtn.snp.makeConstraints { make in
make.left.equalTo(16)
make.right.equalTo(-16)
make.top.equalTo(8)
make.height.equalTo(48)
}
loadDetailInfo()
}
func getTextWithType(type: Int, date:String) -> ASAttributedString {
if type == 0 {
return .init("上传《护照》(需有效期≥签证时长+3个月)", .font(UIFont.PFSC_R(ofSize:14)),.foreground(UIColor.mainTextColor(alpha: 0.5)))
}
return .init("", .font(UIFont.PFSC_R(ofSize:14)),.foreground(UIColor.mainTextColor(alpha: 0.5)))
}
func getTipsWithType(date: String) -> [ASAttributedString] {
return [self.getTextWithType(type: 0, date: date)]
}
func updateData() {
// travel_cert_type 证件类型 0-未知 1-护照 3-港澳通行证
// nationality : Int = -1 国籍 1-中国 2-国外
self.viewModel.dataModel = dataModel
if dataModel.cert_info.img_front.count != 0 {
urls[0] = dataModel.cert_info.img_front
}
self.data = viewModel.getPassPortDataSource(isShowPrompt)
// 头部提示
tipsArr = getTipsWithType(date: self.dataModel.valid_date)
tableView.reloadData()
}
@objc func didSaveBtnClicked() {
if !checkInfo() {
isShowPrompt = true
updateData()
return
}
saveAllTravelCertificate()
}
func checkInfo() -> Bool {
if urls.first?.count == 0 {
failString = "请上传护照"
return false
}
if self.viewModel.dataModel.cert_info.issue_start.count == 0 {
return false
}
if self.viewModel.dataModel.cert_info.issue_end.count == 0 {
return false
}
return true
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if dataModel.cert_info.is_show {
} else {
YHAdopterCardExampleView.exampleView(type: .chinaTravel).show()
let passPort: [String: Any] = ["is_show": true,
"submit": false
]
let params : [String : Any] = [
"passPort": passPort,
"id":dataModel.id
]
viewModel.submitResignCertificateUpdate(params) { success, error in
}
}
}
}
private extension YHResignUploadTravelPassportViewController {
//1、获取详情信息
func loadDetailInfo() {
self.updateData()
}
//2、保存旅行证件
func saveAllTravelCertificate() {
let passPort: [String: Any] = ["name": "护照",
"issue_start": self.viewModel.dataModel.cert_info.issue_start,
"issue_end": self.viewModel.dataModel.cert_info.issue_end,
"img_front": urls[0],
"submit": true,
"is_show": true]
let params : [String : Any] = [
"passPort": passPort,
"id": dataModel.id
]
viewModel.submitResignCertificateUpdate(params) { success, error in
if success {
YHHUD.flash(message: "保存成功")
self.navigationController?.popViewController()
} else {
let msg = error?.errorMsg ?? "保存失败,请重试"
YHHUD.flash(message: msg)
}
}
}
}
extension YHResignUploadTravelPassportViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: YHTravelCertificateTipsCell.cellReuseIdentifier, for: indexPath) as! YHTravelCertificateTipsCell
cell.userName = self.dataModel.name
cell.tipsArr = tipsArr
return cell
}
let cell = tableView.dequeueReusableCell(withIdentifier: YHResignCertificatePassportTableViewCell.cellReuseIdentifier, for: indexPath) as! YHResignCertificatePassportTableViewCell
cell.firstImageName = "service_adopter_card_china_travel_front"
cell.firstLabelName = "护照资料页"
cell.dataModel = dataModel
cell.failString = failString
cell.urls = urls
cell.data = data
cell.urlBlock = { [weak self] url, index in
guard let self = self else { return }
self.urls[index] = url
self.viewModel.getPublicImageUrl(url) {[weak self] success, error in
guard let self = self else { return }
guard let url = success else { return }
self.data = viewModel.getPassPortDataSource(isShowPrompt)
self.tableView.reloadData()
}
}
cell.deleteBlock = { [weak self] url, index in
guard let self = self else { return }
self.urls[index] = url
if index == 0 {
self.dataModel.cert_info.img_front = ""
}
}
cell.block = {[weak self] model in
guard let self = self else { return }
self.viewModel.updateModel(model)
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath.section != 0 {
if urls[0].count == 0 {
return 243
} else {
var tatol = 0
for item in data {
let isShow = item.isShowPrompts ?? false
let message = item.message ?? ""
let isNeed = item.isNeed ?? false
if isShow && message.count == 0 && isNeed {
tatol = tatol + 20
}
}
return CGFloat(345 + tatol)
}
}
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
private func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> CGFloat {
return 0.01
}
private func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> CGFloat {
return 14.0
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view = UIView()
if section == 0 {
view.backgroundColor = .white
}
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view = UIView()
return view
}
}
//
// YHResignUploadTravelCardFootViewController.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import JXSegmentedView
class YHResignUploadTravelCardFootViewController: YHBaseViewController {
var type: Int = 0
var imageView: UIImageView!
var linkButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
loadData()
}
}
extension YHResignUploadTravelCardFootViewController {
func loadData() {
}
func setupUI() {
gk_navBarAlpha = 0
gk_navigationBar.isHidden = true
view.backgroundColor = .white
imageView = {
let tableView = UIImageView()
return tableView
}()
view.addSubview(imageView)
var height = 0.0
if type == 0 {
height = 528.fix
imageView.image = UIImage(named: "resign_upload_travel_foot_one")
} else {
height = 699.fix
imageView.image = UIImage(named: "resign_upload_travel_foot_two")
}
imageView.snp.makeConstraints { make in
make.top.right.left.equalToSuperview()
make.height.equalTo(height)
}
if type == 1 {
linkButton = {
let tableView = UIButton(type: .custom)
tableView.addTarget(self, action: #selector(click), for: .touchUpInside)
return tableView
}()
view.addSubview(linkButton)
linkButton.snp.makeConstraints { make in
make.left.equalTo(44)
make.right.equalTo(-44)
make.top.equalTo(152.fix)
make.height.equalTo(40.fix)
}
}
view.layer.cornerRadius = kCornerRadius6
view.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
}
@objc func click() {
let vc = YHH5WebViewVC()
vc.url = "https://www.ctshk.com/mep/zh/"
vc.isShowRightShareItemFlag = false
vc.isFullScreenFlag = false
UIViewController.current?.navigationController?.pushViewController(vc)
}
}
extension YHResignUploadTravelCardFootViewController: JXSegmentedListContainerViewListDelegate {
func listView() -> UIView {
return view
}
}
//
// YHResignUploadTravelCardListfootView.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
import JXSegmentedView
class YHResignUploadTravelCardListfootView: UIView {
var lineView: UIView!
var titleLabel: UILabel!
var controllerOne: YHResignUploadTravelCardFootViewController = YHResignUploadTravelCardFootViewController()
var controllerTwo: YHResignUploadTravelCardFootViewController = YHResignUploadTravelCardFootViewController()
var arrItemTitles = ["大陆办理", "香港办理"]
var arrItemVCs: [YHResignUploadTravelCardFootViewController] = []
var segmentedView : JXSegmentedView = JXSegmentedView(frame: CGRect(x: 0, y: 0, width: KScreenWidth, height: 48))
lazy var segmentedDataSource: JXSegmentedDotDataSource = {
let dataSource = JXSegmentedDotDataSource()
dataSource.isTitleColorGradientEnabled = true
dataSource.titles = arrItemTitles
dataSource.titleNormalFont = UIFont.PFSC_M(ofSize: 14)
dataSource.titleNormalColor = .labelTextColor2
dataSource.titleSelectedFont = UIFont.PFSC_M(ofSize: 14)
dataSource.titleSelectedColor = .mainTextColor
dataSource.isItemSpacingAverageEnabled = false
dataSource.itemWidth = JXSegmentedViewAutomaticDimension
dataSource.itemSpacing = 16
dataSource.dotStates = [false, false, false, false]
dataSource.dotSize = CGSize(width: 6, height: 6)
return dataSource
}()
//分类title 所对应的VC
lazy var listContainerView: JXSegmentedListContainerView! = {
return JXSegmentedListContainerView(dataSource: self, type: .scrollView)
}()
override init(frame: CGRect) {
super.init(frame: frame)
setUpView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setUpView() {
backgroundColor = .clear
lineView = {
let view = UIView()
view.backgroundColor = UIColor.brandMainColor
return view
}()
addSubview(lineView)
lineView.snp.remakeConstraints { make in
make.left.equalTo(16)
make.top.equalTo(38)
make.height.equalTo(12)
make.width.equalTo(3)
}
titleLabel = {
let view = UILabel()
view.text = "港澳通行证逗留(D)签注延期-办理指引"
view.font = UIFont.PFSC_M(ofSize: 17)
view.textColor = UIColor.mainTextColor
return view
}()
addSubview(titleLabel)
titleLabel.snp.remakeConstraints { make in
make.left.equalTo(27)
make.centerY.equalTo(lineView.snp.centerY)
make.height.equalTo(24)
make.right.equalToSuperview()
}
controllerOne.type = 0
controllerTwo.type = 1
arrItemVCs.append(controllerOne)
arrItemVCs.append(controllerTwo)
//segmentedViewDataSource一定要通过属性强持有!!!!!!!!!
// segmentedView.backgroundColor = .clear
segmentedView.collectionView.backgroundColor = .white
// segmentedView.contentScrollView?.backgroundColor = .clear
addSubview(segmentedView)
segmentedView.listContainer = listContainerView
addSubview(listContainerView)
//分类Title
segmentedView.dataSource = segmentedDataSource
segmentedView.delegate = self
//配置指示器
let indicator = JXSegmentedIndicatorLineView()
indicator.indicatorWidth = 16
indicator.indicatorColor = UIColor.brandMainColor
indicator.indicatorHeight = 2
indicator.indicatorCornerRadius = 0
indicator.verticalOffset = 4
segmentedView.indicators = [indicator]
segmentedView.backgroundColor = UIColor(red: 0.95, green: 0.95, blue: 0.95, alpha: 1)
segmentedView.snp.remakeConstraints { make in
make.right.equalTo(-16)
make.left.equalTo(16)
make.top.equalTo(82)
make.height.equalTo(44)
}
listContainerView.snp.remakeConstraints { make in
make.right.equalTo(-16)
make.left.equalTo(16)
make.top.equalTo(segmentedView.snp.bottom)
make.height.equalTo(528.fix)
}
let whiteView = UIView()
whiteView.backgroundColor = .white
whiteView.layer.cornerRadius = kCornerRadius6
whiteView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
addSubview(whiteView)
whiteView.snp.remakeConstraints { make in
make.bottom.equalTo(segmentedView.snp.top)
make.right.equalTo(-16)
make.left.equalTo(16)
make.height.equalTo(6)
}
}
}
extension YHResignUploadTravelCardListfootView: JXSegmentedViewDelegate {
func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
if index == 0 {
listContainerView.snp.remakeConstraints { make in
make.right.equalTo(-16)
make.left.equalTo(16)
make.top.equalTo(segmentedView.snp.bottom)
make.height.equalTo(528.fix)
}
} else {
listContainerView.snp.remakeConstraints { make in
make.right.equalTo(-16)
make.left.equalTo(16)
make.top.equalTo(segmentedView.snp.bottom)
make.bottom.equalTo(-16)
}
}
// NotificationCenter.default.post(name: Notification.Name(rawValue: "scrollViewDidEndDragging"), object: nil)
}
/// 正在滚动中的回调
///
/// - Parameters:
/// - segmentedView: JXSegmentedView
/// - leftIndex: 正在滚动中,相对位置处于左边的index
/// - rightIndex: 正在滚动中,相对位置处于右边的index
/// - percent: 从左往右计算的百分比
func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {
// NotificationCenter.default.post(name: Notification.Name(rawValue: "scrollViewWillBeginDragging"), object: nil)
}
}
extension YHResignUploadTravelCardListfootView: JXSegmentedListContainerViewDataSource {
func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
if let titleDataSource = segmentedView.dataSource as? JXSegmentedBaseDataSource {
return titleDataSource.dataSource.count
}
return 0
}
func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
return arrItemVCs[index] as! JXSegmentedListContainerViewListDelegate
}
}
//
// YHResignUploadTravelCardListheadView.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHResignUploadTravelCardListheadView: UIView {
var fileImageView: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
setUpView()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setUpView() {
fileImageView = {
let view = UIImageView()
view.image = UIImage(named: "resign_upload_travel_head")
return view
}()
addSubview(fileImageView)
fileImageView.snp.makeConstraints { make in
make.right.equalTo(-16)
make.top.left.equalTo(16)
make.height.equalTo(90.fix)
}
}
}
//
// YHResignUploadTravelGuideView.swift
// galaxy
//
// Created by EDY on 2024/10/10.
// Copyright © 2024 https://www.galaxy-immi.com. All rights reserved.
//
import UIKit
class YHResignUploadTravelGuideView: UIView {
typealias Block = () -> ()
var block: Block?
lazy var blackMaskView: UIView = {
let view = UIView()
view.backgroundColor = UIColor(hex: 0x0F1214, alpha: 0.5)
// let tap = UITapGestureRecognizer(target: self, action: #selector(dismiss))
// view.addGestureRecognizer(tap)
return view
}()
lazy var whiteContentView: UIView = {
let view = UIView()
view.backgroundColor = .white
return view
}()
lazy var bottomView: UIView = {
let view = UIView()
view.backgroundColor = .clear
view.addSubview(self.rewardBtn)
self.rewardBtn.snp.makeConstraints { make in
make.top.equalToSuperview().offset(10)
make.left.equalTo(kMargin)
make.right.equalTo(-kMargin)
make.height.equalTo(44)
}
view.layer.zPosition = 10
return view
}()
//我已知悉,确认
lazy var rewardBtn: UIButton = {
let button = UIButton(type: .custom)
button.titleLabel?.font = UIFont.PFSC_M(ofSize: 15)
button.contentHorizontalAlignment = .center
button.setTitle("知道了", for: .normal)
button.setTitleColor(UIColor.white, for: .normal)
button.layer.cornerRadius = kCornerRadius3
button.clipsToBounds = true
button.addTarget(self, action: #selector(clickSureBtn), for: .touchUpInside)
button.backgroundColor = UIColor.brandMainColor
return button
}()
lazy var myScrollView: UIScrollView = {
let view = UIScrollView()
view.backgroundColor = .clear
view.showsVerticalScrollIndicator = false
view.delegate = self
return view
}()
lazy var bkgImageV: UIImageView = {
let imageV = UIImageView()
imageV.image = UIImage(named: "resign_upload_guideline")
imageV.contentMode = .scaleToFill
imageV.isUserInteractionEnabled = true
imageV.clipsToBounds = true
return imageV
}()
lazy var bkgImageV2: UIImageView = {
let imageV = UIImageView()
imageV.image = UIImage(named: "resign_upload_guideline_bkg")
imageV.contentMode = .scaleToFill
imageV.clipsToBounds = true
imageV.isUserInteractionEnabled = true
return imageV
}()
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
private var timer : Timer?
private var maxCount : Int = 5
//之前是否展示过
var ischeckBeforeFlag : Bool = false {
didSet {
if ischeckBeforeFlag {
setButtonEnable(true)
} else {
setButtonEnable(false)
startTimer()
}
}
}
}
extension YHResignUploadTravelGuideView {
static func sheetView() -> YHResignUploadTravelGuideView {
let view = YHResignUploadTravelGuideView(frame:UIScreen.main.bounds)
return view
}
func show() {
UIApplication.shared.yhKeyWindow()?.addSubview(self)
UIView.animate(withDuration: 0.5) {
let whiteHeight = KScreenHeight - k_Height_NavigationtBarAndStatuBar
self.whiteContentView.frame = CGRect(x: 0, y: KScreenHeight - whiteHeight, width: KScreenWidth, height: whiteHeight)
}
}
@objc func dismiss() {
self.removeFromSuperview()
}
@objc func clickSureBtn() {
self.block?()
dismiss()
}
@objc func clicklinkBtn() {
// self.block?()
dismiss()
let vc = YHH5WebViewVC()
vc.url = "https://www.ctshk.com/mep/zh/"
vc.isShowRightShareItemFlag = false
vc.isFullScreenFlag = false
UIViewController.current?.navigationController?.pushViewController(vc)
}
}
private extension YHResignUploadTravelGuideView {
@objc func timerFired() {
// 定时器触发时执行的代码
print("Timer fired")
self.maxCount = self.maxCount - 1
if self.maxCount < 0 {
self.stopTimer()
self.setButtonEnable(true)
} else {
rewardBtn.setTitle("请上滑看完指引后操作(\(maxCount)s)", for: .normal)
}
}
func startTimer() {
stopTimer()
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)
RunLoop.current.add(timer!, forMode: .common)
}
func stopTimer() {
maxCount = 5
timer?.invalidate()
timer = nil
}
func setButtonEnable(_ enable : Bool) {
rewardBtn.isEnabled = enable
if enable {
rewardBtn.setTitle("我已知悉,确认", for: .normal)
rewardBtn.backgroundColor = UIColor.brandMainColor
} else {
rewardBtn.setTitle("请上滑看完指引后操作(5s)", for: .normal)
rewardBtn.backgroundColor = UIColor(hex: 0xB7C0CC, alpha: 1.0)
}
}
func setupUI() {
self.addSubview(blackMaskView)
self.addSubview(whiteContentView)
let corner = UIRectCorner(rawValue: UIRectCorner.topLeft.rawValue | UIRectCorner.topRight.rawValue)
let path = UIBezierPath(roundedRect:bounds,byRoundingCorners: corner,cornerRadii:CGSizeMake(kCornerRadius6, kCornerRadius6));
let layer = CAShapeLayer();
layer.frame = whiteContentView.bounds;
layer.path = path.cgPath;
whiteContentView.layer.mask = layer;
whiteContentView.clipsToBounds = true
blackMaskView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
let whiteHeight = KScreenHeight - k_Height_NavigationtBarAndStatuBar
// whiteContentView.snp.makeConstraints { make in
// make.left.right.bottom.equalToSuperview()
// make.height.equalTo(whiteHeight)
// }
whiteContentView.frame = CGRect(x: 0, y: KScreenHeight, width: KScreenWidth, height: whiteHeight)
whiteContentView.addSubview(bkgImageV2)
bkgImageV2.snp.makeConstraints { make in
make.top.left.right.equalToSuperview()
make.height.equalTo(269.fix)
}
whiteContentView.addSubview(bottomView)
bottomView.snp.makeConstraints { make in
make.bottom.left.right.equalToSuperview()
make.height.equalTo(98)
}
whiteContentView.addSubview(myScrollView)
myScrollView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(20)
make.right.equalToSuperview()
make.width.equalTo(KScreenWidth)
make.height.equalTo(whiteHeight-98 - 20)
}
if let tmpImage = UIImage(named:"resign_upload_guideline") {
myScrollView.addSubview(bkgImageV)
bkgImageV.snp.makeConstraints { make in
make.top.equalToSuperview()
make.centerX.equalToSuperview()
make.width.equalTo(336.fix)
make.height.equalTo(1356.fix)
}
myScrollView.contentSize = CGSize(width: KScreenWidth, height: 1356.fix)
let button = UIButton(type: .custom)
button.addTarget(self, action: #selector(clicklinkBtn), for: .touchUpInside)
myScrollView.addSubview(button)
button.snp.makeConstraints { make in
make.left.equalTo(44)
make.height.equalTo(40)
make.width.equalTo(255.fix)
make.top.equalTo(756.fix)
}
}
let button = UIButton(type: .custom)
button.setBackgroundImage(UIImage(named: "service_card_close"), for: .normal)
button.addTarget(self, action: #selector(clickSureBtn), for: .touchUpInside)
whiteContentView.addSubview(button)
button.snp.makeConstraints { make in
make.right.equalTo(-21)
make.width.height.equalTo(24)
make.top.equalTo(16)
}
}
}
extension YHResignUploadTravelGuideView : UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if !ischeckBeforeFlag {
let scrollViewContentHeight = scrollView.contentSize.height
let scrollOffsetThreshold = scrollViewContentHeight - scrollView.bounds.size.height
// 当前滚动位置
let currentOffset = scrollView.contentOffset.y
if currentOffset > scrollOffsetThreshold { // 接近底部
// 滚动到了底部
ischeckBeforeFlag = true
stopTimer()
setButtonEnable(true)
} else {
// 没有滚动到底部
}
}
}
}
......@@ -123,16 +123,32 @@ extension YHServiceBannerView: FSPagerViewDataSource, FSPagerViewDelegate {
if model.skip_url.isEmpty == false {
switch model.skip_type {
case 1: //跳转H5
var url = ""
if YHLoginManager.shared.isLogin() {
let token = YHLoginManager.shared.h5Token
var url = model.skip_url + "?param=" + token
url = model.skip_url + "?param=" + token
let urlHasParam = String.hasQueryParameters(urlString: model.skip_url)
if urlHasParam {
url = model.skip_url + "&param=" + token
}
printLog("url: \(url)")
} else {
url = model.skip_url
}
let vc = YHH5WebViewVC()
vc.url = url
vc.isFullScreenFlag = false
if model.is_share_h5_flag {
if let tModel = model.addtition_param {
if !tModel.ShareH5Url.isEmpty {
vc.isShowRightShareItemFlag = true
vc.shareH5Title = tModel.ShareH5Title
vc.shareH5Describe = tModel.ShareH5Describe
vc.shareUrlFromOutside = tModel.ShareH5Url
}
}
}
self.parentViewController?.navigationController?.pushViewController(vc)
case 2: //跳转APP内Tab
goAppTab(tabBarName:model.skip_url)
......
......@@ -170,6 +170,36 @@ extension YHServiceOrderProgressTableViewCell {
titleLabel.text = "续签文书管理"
messageLabel.text = "请确认您的续签文书内容并完成签字~"
}
if model.type == 33 {
titleLabel.text = "续签信息确认"
messageLabel.text = "请确认家庭续签信息是否有变更~"
}
if model.type == 34 {
titleLabel.text = "在港递交预约"
messageLabel.text = "请预约在港递交续签时间&确认在港时间~"
}
if model.type == 35 {
titleLabel.text = "查看续签结果"
messageLabel.text = "请查看递交凭证&续签结果~"
}
if model.type == 36 {
titleLabel.text = "续签补件"
messageLabel.text = "请尽快补件~"
}
if model.type == 37 {
titleLabel.text = "续签签证缴费"
messageLabel.text = "请根据指引缴费并领取新电子签证~"
}
if model.type == 38 {
titleLabel.text = "上传旅行证件"
messageLabel.text = "请上传&核对续签旅行证件~"
}
}
if model.status == 2 {
titleLabel.textColor = UIColor.mainTextColor
......@@ -386,6 +416,48 @@ extension YHServiceOrderProgressTableViewCell {
buttonLabel.text = "去确认"
messageLabel.textColor = UIColor.mainTextColor50
}
if model.type == 33 {
titleLabel.text = "续签信息确认"
messageLabel.text = "请确认家庭续签信息是否有变更~"
buttonLabel.text = "去查看"
messageLabel.textColor = UIColor.mainTextColor50
}
if model.type == 34 {
titleLabel.text = "在港递交预约"
messageLabel.text = "请预约在港递交续签时间&确认在港时间~"
buttonLabel.text = "去查看"
messageLabel.textColor = UIColor.mainTextColor50
}
if model.type == 35 {
titleLabel.text = "查看续签结果"
messageLabel.text = "请查看递交凭证&续签结果~"
buttonLabel.text = "去查看"
messageLabel.textColor = UIColor.mainTextColor50
}
if model.type == 36 {
titleLabel.text = "续签补件"
messageLabel.text = "请尽快补件~"
buttonLabel.text = "去查看"
messageLabel.textColor = UIColor.mainTextColor50
}
if model.type == 37 {
titleLabel.text = "续签签证缴费"
messageLabel.text = "请根据指引缴费并领取新电子签证~"
buttonLabel.text = "去查看"
messageLabel.textColor = UIColor.mainTextColor50
}
if model.type == 38 {
titleLabel.text = "上传旅行证件"
messageLabel.text = "请上传&核对续签旅行证件~"
buttonLabel.text = "去查看"
messageLabel.textColor = UIColor.mainTextColor50
}
}
if model.status == 3 {
titleLabel.textColor = UIColor.mainTextColor
......@@ -467,6 +539,43 @@ extension YHServiceOrderProgressTableViewCell {
messageLabel.text = "请确认您的续签文书内容并完成签字~"
buttonLabel.text = "已完成"
}
if model.type == 33 {
titleLabel.text = "续签信息确认"
messageLabel.text = "请确认家庭续签信息是否有变更~"
buttonLabel.text = "去查看"
}
if model.type == 34 {
titleLabel.text = "在港递交预约"
messageLabel.text = "请预约在港递交续签时间&确认在港时间~"
buttonLabel.text = "去查看"
}
if model.type == 35 {
titleLabel.text = "查看续签结果"
messageLabel.text = "请查看递交凭证&续签结果~"
buttonLabel.text = "去查看"
}
if model.type == 36 {
titleLabel.text = "续签补件"
messageLabel.text = "恭喜您,已完成补件~"
buttonLabel.text = "已完成"
}
if model.type == 37 {
titleLabel.text = "续签签证缴费"
messageLabel.text = "请根据指引缴费并领取新电子签证~"
buttonLabel.text = "去查看"
}
if model.type == 38 {
titleLabel.text = "上传旅行证件"
messageLabel.text = "请上传&核对续签旅行证件~"
buttonLabel.text = "去查看"
}
let b: ASAttributedString = .init(NSAttributedString(string: "\(model.percentage)"), .font(UIFont(name: "DINAlternate-Bold", size: 24)!),.foreground(UIColor.mainTextColor))
let bb: ASAttributedString = .init("%", .font(UIFont.PFSC_M(ofSize: 10)),.foreground(UIColor.mainTextColor.withAlphaComponent(0.3)))
progressLabel.attributed.text = b + bb
......
......@@ -251,7 +251,7 @@ private extension YHH5WebViewVC {
if !shareUrl.isEmpty &&
!self.shareH5Title.isEmpty &&
!self.shareH5Describe.isEmpty {
YHShareManager.shared.sendLinkContent(self.shareH5Title, self.shareH5Describe, UIImage(named: "AppIcon") ?? UIImage(), link: shareUrl)
YHShareManager.shared.sendLinkContent(self.shareH5Title, self.shareH5Describe, UIImage(named: "shareIcon") ?? UIImage(), link: shareUrl)
}
}
}
......
......@@ -93,7 +93,7 @@ class YHAllApiName {
//获取首页展示的资讯
static let consultApi = "infoflow/home/consult"
//获取首页展示的banner
static let banner = "infoflow/banner/list"
static let bannerApi = "infoflow/banner/list"
//获取栏目
static let classify = "infoflow/classify/list"
//获取资讯
......
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "shareIcon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "shareIcon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_upload_doc_head@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_upload_doc_head@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_upload_guideline@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_upload_guideline@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_upload_guideline_bkg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_upload_guideline_bkg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_upload_travel_foot_one@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_upload_travel_foot_one@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_upload_travel_foot_two@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_upload_travel_foot_two@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_upload_travel_head@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_upload_travel_head@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_visa_guide_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_visa_guide_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_visa_guide_error_content@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_visa_guide_error_content@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_visa_guide_error_title@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_visa_guide_error_title@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_visa_guide_tips@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_visa_guide_tips@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_visa_guide_title@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_visa_guide_title@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "resign_visa_guide_warn@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "resign_visa_guide_warn@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment