From 5098bcda0e5be2e31dee28983beeb6e8ac3ae719 Mon Sep 17 00:00:00 2001 From: linshujie Date: Tue, 11 Aug 2026 10:59:45 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BA=8C=E7=BA=A7=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QuickLocation.xcodeproj/project.pbxproj | 88 ++++ .../Bubble/clock.imageset/Contents.json | 22 + .../Bubble/clock.imageset/clock@2x.png | Bin 0 -> 78273 bytes .../Bubble/clock.imageset/clock@3x.png | Bin 0 -> 184227 bytes .../Bubble/pin.imageset/Contents.json | 22 + .../Bubble/pin.imageset/pin@2x.png | Bin 0 -> 367 bytes .../Bubble/pin.imageset/pin@3x.png | Bin 0 -> 780 bytes .../Mine/about_logo.imageset/Contents.json | 8 + .../Mine/about_logo.imageset/logo@2x.png | Bin 0 -> 9291 bytes .../Mine/about_logo.imageset/logo@3x.png | Bin 0 -> 18106 bytes .../Mine/cancel_check.imageset/Contents.json | 8 + .../Mine/cancel_check.imageset/icon@2x.png | Bin 0 -> 2462 bytes .../Mine/cancel_check.imageset/icon@3x.png | Bin 0 -> 4631 bytes .../cancel_warning.imageset/Contents.json | 8 + .../Mine/cancel_warning.imageset/icon@2x.png | Bin 0 -> 4168 bytes .../Mine/cancel_warning.imageset/icon@3x.png | Bin 0 -> 8176 bytes .../warning.imageset/Contents.json | 22 + .../warning.imageset/warning@2x.png | Bin 0 -> 293 bytes .../warning.imageset/warning@3x.png | Bin 0 -> 546 bytes QuickLocation/Common/Constant.swift | 2 + .../Core/Extension/UIDevice+Extension.swift | 101 ++++ .../Main/Tabbar/MainTabBarController.swift | 10 +- QuickLocation/Manager/App/ApiManager.swift | 8 +- QuickLocation/Manager/App/RouterManager.swift | 35 ++ .../Manager/Unlock/UnlockCountManager.swift | 13 +- .../Section/Explore/FeatureIntroVC.swift | 52 +++ .../Section/Explore/FeatureIntroView.swift | 193 ++++++++ .../Group/InviteJoin/InviteJoinVC.swift | 5 +- .../Group/MemberInfo/MemberInfoVC.swift | 159 +++++++ .../Group/MemberInfo/MemberInfoView.swift | 196 ++++++++ .../Section/Home/Bubble/BubbleHeroView.swift | 230 +++++++++ .../Home/Bubble/BubbleKnowledgeVC.swift | 25 + .../Home/Bubble/BubbleKnowledgeView.swift | 147 ++++++ .../Home/Bubble/CreateBubbleDoneView.swift | 163 ++----- .../Home/Bubble/CreateBubbleSetupView.swift | 289 ++++++++++++ .../Section/Home/Bubble/CreateBubbleVC.swift | 129 +++--- .../Home/Bubble/CreateBubbleView.swift | 117 ++--- .../Section/Home/GroupMemberView2.swift | 69 +-- .../PhoneReportDetailView.swift | 279 +++++++---- .../PhoneReportDetailViewModel.swift | 190 ++++++-- .../SearchLocationHeaderView.swift | 164 +++++++ .../SearchLocationResultVC.swift | 157 ++++--- .../SearchLocationResultView.swift | 437 ++++++++---------- .../SearchLocation/SearchLocationView.swift | 275 +++-------- .../Section/Mine/About/AboutVC.swift | 70 +++ .../Section/Mine/About/AboutView.swift | 124 +++++ .../Section/Mine/Account/AccountVC.swift | 4 +- .../Section/Mine/Account/AccountView.swift | 4 +- .../Mine/CancelAccount/CancelAccountVC.swift | 105 +++++ .../CancelAccount/CancelAccountView.swift | 165 +++++++ .../Section/Mine/MinePhotoWallView.swift | 7 +- .../Section/Mine/MineViewController.swift | 22 +- .../Section/Mine/MineViewModel.swift | 4 +- .../Section/VipRecharge/VipRechargeView.swift | 23 +- 54 files changed, 3154 insertions(+), 997 deletions(-) create mode 100644 QuickLocation/Assets.xcassets/Bubble/clock.imageset/Contents.json create mode 100644 QuickLocation/Assets.xcassets/Bubble/clock.imageset/clock@2x.png create mode 100644 QuickLocation/Assets.xcassets/Bubble/clock.imageset/clock@3x.png create mode 100644 QuickLocation/Assets.xcassets/Bubble/pin.imageset/Contents.json create mode 100644 QuickLocation/Assets.xcassets/Bubble/pin.imageset/pin@2x.png create mode 100644 QuickLocation/Assets.xcassets/Bubble/pin.imageset/pin@3x.png create mode 100644 QuickLocation/Assets.xcassets/Mine/about_logo.imageset/Contents.json create mode 100644 QuickLocation/Assets.xcassets/Mine/about_logo.imageset/logo@2x.png create mode 100644 QuickLocation/Assets.xcassets/Mine/about_logo.imageset/logo@3x.png create mode 100644 QuickLocation/Assets.xcassets/Mine/cancel_check.imageset/Contents.json create mode 100644 QuickLocation/Assets.xcassets/Mine/cancel_check.imageset/icon@2x.png create mode 100644 QuickLocation/Assets.xcassets/Mine/cancel_check.imageset/icon@3x.png create mode 100644 QuickLocation/Assets.xcassets/Mine/cancel_warning.imageset/Contents.json create mode 100644 QuickLocation/Assets.xcassets/Mine/cancel_warning.imageset/icon@2x.png create mode 100644 QuickLocation/Assets.xcassets/Mine/cancel_warning.imageset/icon@3x.png create mode 100644 QuickLocation/Assets.xcassets/SearchLocation/warning.imageset/Contents.json create mode 100644 QuickLocation/Assets.xcassets/SearchLocation/warning.imageset/warning@2x.png create mode 100644 QuickLocation/Assets.xcassets/SearchLocation/warning.imageset/warning@3x.png create mode 100644 QuickLocation/Core/Extension/UIDevice+Extension.swift create mode 100644 QuickLocation/Section/Explore/FeatureIntroVC.swift create mode 100644 QuickLocation/Section/Explore/FeatureIntroView.swift create mode 100644 QuickLocation/Section/Group/MemberInfo/MemberInfoVC.swift create mode 100644 QuickLocation/Section/Group/MemberInfo/MemberInfoView.swift create mode 100644 QuickLocation/Section/Home/Bubble/BubbleHeroView.swift create mode 100644 QuickLocation/Section/Home/Bubble/BubbleKnowledgeVC.swift create mode 100644 QuickLocation/Section/Home/Bubble/BubbleKnowledgeView.swift create mode 100644 QuickLocation/Section/Home/Bubble/CreateBubbleSetupView.swift create mode 100644 QuickLocation/Section/Home/SearchLocation/SearchLocationHeaderView.swift create mode 100644 QuickLocation/Section/Mine/About/AboutVC.swift create mode 100644 QuickLocation/Section/Mine/About/AboutView.swift create mode 100644 QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift create mode 100644 QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift diff --git a/QuickLocation.xcodeproj/project.pbxproj b/QuickLocation.xcodeproj/project.pbxproj index fd77b196..e5da6482 100644 --- a/QuickLocation.xcodeproj/project.pbxproj +++ b/QuickLocation.xcodeproj/project.pbxproj @@ -47,6 +47,7 @@ 305A76AD2FCA8C7000227D26 /* UIApplicationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305A74F62FCA8C7000227D26 /* UIApplicationExtension.swift */; }; 305A76AE2FCA8C7000227D26 /* UIButton+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305A74F72FCA8C7000227D26 /* UIButton+Extension.swift */; }; 305A76AF2FCA8C7000227D26 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305A74F82FCA8C7000227D26 /* UIColor+Extension.swift */; }; + 55B217A33022F0B100784706 /* UIDevice+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B217A33022F0B100784707 /* UIDevice+Extension.swift */; }; 305A76B02FCA8C7000227D26 /* UIFont+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305A74F92FCA8C7000227D26 /* UIFont+Extension.swift */; }; 305A76B12FCA8C7000227D26 /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305A74FA2FCA8C7000227D26 /* UIImage+Extension.swift */; }; 305A76B22FCA8C7000227D26 /* UIImage+Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305A74FB2FCA8C7000227D26 /* UIImage+Resource.swift */; }; @@ -186,6 +187,11 @@ 30A87A642FEE75520095E7C6 /* CreateBubbleTipsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A632FEE75520095E7C6 /* CreateBubbleTipsView.swift */; }; 30A87A662FEE843E0095E7C6 /* CreateBubbleDoneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A652FEE843E0095E7C6 /* CreateBubbleDoneView.swift */; }; 30A87A682FEE86560095E7C6 /* CreateBubblePopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A672FEE86560095E7C6 /* CreateBubblePopView.swift */; }; + 55B219C13024C00100784722 /* BubbleHeroView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219C13024C00100784721 /* BubbleHeroView.swift */; }; + 55B219C13024C00100784724 /* CreateBubbleSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219C13024C00100784723 /* CreateBubbleSetupView.swift */; }; + 55B219C13024C00100784726 /* BubbleKnowledgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219C13024C00100784725 /* BubbleKnowledgeView.swift */; }; + 55B219C13024C00100784728 /* BubbleKnowledgeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B219C13024C00100784727 /* BubbleKnowledgeVC.swift */; }; + 55C219C13024C00100784731 /* SearchLocationHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55C219C13024C00100784730 /* SearchLocationHeaderView.swift */; }; 30A87A6B2FEF5B950095E7C6 /* SearchLocationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A6A2FEF5B950095E7C6 /* SearchLocationView.swift */; }; 30A87A6D2FEF5BA10095E7C6 /* SearchLocationVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A6C2FEF5BA10095E7C6 /* SearchLocationVC.swift */; }; 30A87A6F2FEF7BE40095E7C6 /* SearchLocationResultVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30A87A6E2FEF7BE40095E7C6 /* SearchLocationResultVC.swift */; }; @@ -233,6 +239,8 @@ 30D74AAB2FE8C7700050EB2C /* GPSSignalHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D74AAA2FE8C7700050EB2C /* GPSSignalHelper.swift */; }; 30D74AAE2FEA13E00050EB2C /* ScheduleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D74AAD2FEA13E00050EB2C /* ScheduleView.swift */; }; 30D74AB02FEA13ED0050EB2C /* ScheduleVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D74AAF2FEA13ED0050EB2C /* ScheduleVC.swift */; }; + 55B218B13024B00100784722 /* FeatureIntroVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218B13024B00100784721 /* FeatureIntroVC.swift */; }; + 55B218B13024B00100784724 /* FeatureIntroView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218B13024B00100784723 /* FeatureIntroView.swift */; }; 30D74AB22FEA1D5D0050EB2C /* ScheduleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D74AB12FEA1D5D0050EB2C /* ScheduleViewModel.swift */; }; 30D74AB42FEA25B90050EB2C /* ViewedModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D74AB32FEA25B90050EB2C /* ViewedModel.swift */; }; 30D74AB62FEA34FF0050EB2C /* ItineraryAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D74AB52FEA34FF0050EB2C /* ItineraryAPI.swift */; }; @@ -308,6 +316,12 @@ 55B217D83023010000784737 /* PhoneReportDetailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B217D73023010000784736 /* PhoneReportDetailVC.swift */; }; 55B217DA3023010000784739 /* PhoneReportDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B217D93023010000784738 /* PhoneReportDetailView.swift */; }; 55B217DC302301000078473B /* PhoneReportDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B217DB302301000078473A /* PhoneReportDetailViewModel.swift */; }; + 55B218A13024A00100784702 /* AboutVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218A13024A00100784701 /* AboutVC.swift */; }; + 55B218A13024A00100784704 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218A13024A00100784703 /* AboutView.swift */; }; + 55B218A13024A00100784706 /* CancelAccountVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218A13024A00100784705 /* CancelAccountVC.swift */; }; + 55B218A13024A00100784708 /* CancelAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218A13024A00100784707 /* CancelAccountView.swift */; }; + 55B218A13024A0010078470A /* MemberInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218A13024A00100784709 /* MemberInfoVC.swift */; }; + 55B218A13024A0010078470C /* MemberInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55B218A13024A0010078470B /* MemberInfoView.swift */; }; 55B21D6E3023117900784774 /* 优设标题黑_猫啃网.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 55B21D6D3023117900784774 /* 优设标题黑_猫啃网.ttf */; }; 55BF752D2FFE53F70055DA57 /* LocationPermissionPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BF752C2FFE53F70055DA57 /* LocationPermissionPopView.swift */; }; 55BF75352FFF91690055DA57 /* InteractionEmojiCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BF75342FFF91690055DA57 /* InteractionEmojiCell.swift */; }; @@ -358,6 +372,7 @@ 305A74F62FCA8C7000227D26 /* UIApplicationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIApplicationExtension.swift; sourceTree = ""; }; 305A74F72FCA8C7000227D26 /* UIButton+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIButton+Extension.swift"; sourceTree = ""; }; 305A74F82FCA8C7000227D26 /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; + 55B217A33022F0B100784707 /* UIDevice+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Extension.swift"; sourceTree = ""; }; 305A74F92FCA8C7000227D26 /* UIFont+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Extension.swift"; sourceTree = ""; }; 305A74FA2FCA8C7000227D26 /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; 305A74FB2FCA8C7000227D26 /* UIImage+Resource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Resource.swift"; sourceTree = ""; }; @@ -503,6 +518,11 @@ 30A87A632FEE75520095E7C6 /* CreateBubbleTipsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateBubbleTipsView.swift; sourceTree = ""; }; 30A87A652FEE843E0095E7C6 /* CreateBubbleDoneView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateBubbleDoneView.swift; sourceTree = ""; }; 30A87A672FEE86560095E7C6 /* CreateBubblePopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateBubblePopView.swift; sourceTree = ""; }; + 55B219C13024C00100784721 /* BubbleHeroView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubbleHeroView.swift; sourceTree = ""; }; + 55B219C13024C00100784723 /* CreateBubbleSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateBubbleSetupView.swift; sourceTree = ""; }; + 55B219C13024C00100784725 /* BubbleKnowledgeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubbleKnowledgeView.swift; sourceTree = ""; }; + 55B219C13024C00100784727 /* BubbleKnowledgeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubbleKnowledgeVC.swift; sourceTree = ""; }; + 55C219C13024C00100784730 /* SearchLocationHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchLocationHeaderView.swift; sourceTree = ""; }; 30A87A6A2FEF5B950095E7C6 /* SearchLocationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchLocationView.swift; sourceTree = ""; }; 30A87A6C2FEF5BA10095E7C6 /* SearchLocationVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchLocationVC.swift; sourceTree = ""; }; 30A87A6E2FEF7BE40095E7C6 /* SearchLocationResultVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchLocationResultVC.swift; sourceTree = ""; }; @@ -551,6 +571,8 @@ 30D74AAA2FE8C7700050EB2C /* GPSSignalHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GPSSignalHelper.swift; sourceTree = ""; }; 30D74AAD2FEA13E00050EB2C /* ScheduleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleView.swift; sourceTree = ""; }; 30D74AAF2FEA13ED0050EB2C /* ScheduleVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleVC.swift; sourceTree = ""; }; + 55B218B13024B00100784721 /* FeatureIntroVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIntroVC.swift; sourceTree = ""; }; + 55B218B13024B00100784723 /* FeatureIntroView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeatureIntroView.swift; sourceTree = ""; }; 30D74AB12FEA1D5D0050EB2C /* ScheduleViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScheduleViewModel.swift; sourceTree = ""; }; 30D74AB32FEA25B90050EB2C /* ViewedModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewedModel.swift; sourceTree = ""; }; 30D74AB52FEA34FF0050EB2C /* ItineraryAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItineraryAPI.swift; sourceTree = ""; }; @@ -630,6 +652,12 @@ 55B217D73023010000784736 /* PhoneReportDetailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneReportDetailVC.swift; sourceTree = ""; }; 55B217D93023010000784738 /* PhoneReportDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneReportDetailView.swift; sourceTree = ""; }; 55B217DB302301000078473A /* PhoneReportDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneReportDetailViewModel.swift; sourceTree = ""; }; + 55B218A13024A00100784701 /* AboutVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutVC.swift; sourceTree = ""; }; + 55B218A13024A00100784703 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; + 55B218A13024A00100784705 /* CancelAccountVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancelAccountVC.swift; sourceTree = ""; }; + 55B218A13024A00100784707 /* CancelAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CancelAccountView.swift; sourceTree = ""; }; + 55B218A13024A00100784709 /* MemberInfoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberInfoVC.swift; sourceTree = ""; }; + 55B218A13024A0010078470B /* MemberInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberInfoView.swift; sourceTree = ""; }; 55B21D6D3023117900784774 /* 优设标题黑_猫啃网.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "优设标题黑_猫啃网.ttf"; sourceTree = ""; }; 55BF752C2FFE53F70055DA57 /* LocationPermissionPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPermissionPopView.swift; sourceTree = ""; }; 55BF75342FFF91690055DA57 /* InteractionEmojiCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InteractionEmojiCell.swift; sourceTree = ""; }; @@ -792,6 +820,7 @@ 305A74F62FCA8C7000227D26 /* UIApplicationExtension.swift */, 305A74F72FCA8C7000227D26 /* UIButton+Extension.swift */, 305A74F82FCA8C7000227D26 /* UIColor+Extension.swift */, + 55B217A33022F0B100784707 /* UIDevice+Extension.swift */, 305A74F92FCA8C7000227D26 /* UIFont+Extension.swift */, 305A74FA2FCA8C7000227D26 /* UIImage+Extension.swift */, 305A74FB2FCA8C7000227D26 /* UIImage+Resource.swift */, @@ -1023,6 +1052,7 @@ 30C4C01E2FDC0EA6009215C1 /* GroupInfo */, 307073E42FD18A20004C37CC /* GroupChat */, 30B74B3F2FF2435200F6744D /* GroupMemberList */, + 55B218A13024A00100784712 /* MemberInfo */, 30EFF3A22FD7C58400EB35D4 /* GroupSetting */, 30EFF3B12FD8F19E00EB35D4 /* ReviewMemberList */, 30C4C0172FDBF066009215C1 /* RemoveMember */, @@ -1099,6 +1129,8 @@ 55B217C03022F0A000784720 /* MinePhotoWallView.swift */, 30EFF3CB2FDA667A00EB35D4 /* MyProfile */, 30EFF3BC2FD9585200EB35D4 /* Account */, + 55B218A13024A00100784710 /* About */, + 55B218A13024A00100784711 /* CancelAccount */, 30EFF3D42FDA8EF200EB35D4 /* EmergencyContact */, 30EFF3E32FDAA92200EB35D4 /* PrivacyPolicy */, 30C4C0122FDB9178009215C1 /* CheckPermission */, @@ -1113,6 +1145,7 @@ 305A76352FCA8C7000227D26 /* Map */, 305A76262FCA8C7000227D26 /* Group */, 30D74AAC2FEA13BD0050EB2C /* Schedule */, + 55B218B13024B00100784720 /* Explore */, 305A76392FCA8C7000227D26 /* Mine */, 305A798E2FCAC5F600227D26 /* InviteMember */, 3062E8C52FCFD01000CEF511 /* VipRecharge */, @@ -1380,6 +1413,10 @@ children = ( 30A87A5F2FEE71B80095E7C6 /* CreateBubbleVC.swift */, 30A87A5D2FEE71A50095E7C6 /* CreateBubbleView.swift */, + 55B219C13024C00100784721 /* BubbleHeroView.swift */, + 55B219C13024C00100784723 /* CreateBubbleSetupView.swift */, + 55B219C13024C00100784725 /* BubbleKnowledgeView.swift */, + 55B219C13024C00100784727 /* BubbleKnowledgeVC.swift */, 30A87A612FEE724D0095E7C6 /* CreateBubbleTiemView.swift */, 30A87A632FEE75520095E7C6 /* CreateBubbleTipsView.swift */, 30A87A652FEE843E0095E7C6 /* CreateBubbleDoneView.swift */, @@ -1393,6 +1430,7 @@ children = ( 30A87A6C2FEF5BA10095E7C6 /* SearchLocationVC.swift */, 30A87A6A2FEF5B950095E7C6 /* SearchLocationView.swift */, + 55C219C13024C00100784730 /* SearchLocationHeaderView.swift */, 30A87A6E2FEF7BE40095E7C6 /* SearchLocationResultVC.swift */, 30A87A702FEF7BED0095E7C6 /* SearchLocationResultView.swift */, 30EBF71F2FEFD6F2009A8A87 /* GroupChooseView.swift */, @@ -1526,6 +1564,15 @@ path = SOS; sourceTree = ""; }; + 55B218B13024B00100784720 /* Explore */ = { + isa = PBXGroup; + children = ( + 55B218B13024B00100784721 /* FeatureIntroVC.swift */, + 55B218B13024B00100784723 /* FeatureIntroView.swift */, + ); + path = Explore; + sourceTree = ""; + }; 30D74AAC2FEA13BD0050EB2C /* Schedule */ = { isa = PBXGroup; children = ( @@ -1727,6 +1774,33 @@ path = TodayTrackDetail; sourceTree = ""; }; + 55B218A13024A00100784710 /* About */ = { + isa = PBXGroup; + children = ( + 55B218A13024A00100784701 /* AboutVC.swift */, + 55B218A13024A00100784703 /* AboutView.swift */, + ); + path = About; + sourceTree = ""; + }; + 55B218A13024A00100784711 /* CancelAccount */ = { + isa = PBXGroup; + children = ( + 55B218A13024A00100784705 /* CancelAccountVC.swift */, + 55B218A13024A00100784707 /* CancelAccountView.swift */, + ); + path = CancelAccount; + sourceTree = ""; + }; + 55B218A13024A00100784712 /* MemberInfo */ = { + isa = PBXGroup; + children = ( + 55B218A13024A00100784709 /* MemberInfoVC.swift */, + 55B218A13024A0010078470B /* MemberInfoView.swift */, + ); + path = MemberInfo; + sourceTree = ""; + }; 55B217DE302301000078473D /* PhoneReportDetail */ = { isa = PBXGroup; children = ( @@ -1922,6 +1996,10 @@ 30ACD54E2FF7942E00174861 /* PromotionalActivitiesVC.swift in Sources */, 30EFF3D82FDA8F1000EB35D4 /* EmergencyContactVC.swift in Sources */, 30A87A682FEE86560095E7C6 /* CreateBubblePopView.swift in Sources */, + 55B219C13024C00100784722 /* BubbleHeroView.swift in Sources */, + 55B219C13024C00100784724 /* CreateBubbleSetupView.swift in Sources */, + 55B219C13024C00100784726 /* BubbleKnowledgeView.swift in Sources */, + 55B219C13024C00100784728 /* BubbleKnowledgeVC.swift in Sources */, 30A87A4B2FEE1DAB0095E7C6 /* ItineraryDetailVC.swift in Sources */, 30DC185E2FD1211D0041DCD1 /* VipRightsVC.swift in Sources */, 305A76942FCA8C7000227D26 /* UploadImageCell.swift in Sources */, @@ -1982,6 +2060,7 @@ 305A76AD2FCA8C7000227D26 /* UIApplicationExtension.swift in Sources */, 305A76AE2FCA8C7000227D26 /* UIButton+Extension.swift in Sources */, 305A76AF2FCA8C7000227D26 /* UIColor+Extension.swift in Sources */, + 55B217A33022F0B100784706 /* UIDevice+Extension.swift in Sources */, 305A76B02FCA8C7000227D26 /* UIFont+Extension.swift in Sources */, 55B217A13022F0A000784702 /* FontManager.swift in Sources */, 305A76B12FCA8C7000227D26 /* UIImage+Extension.swift in Sources */, @@ -2023,6 +2102,12 @@ 55B217D83023010000784737 /* PhoneReportDetailVC.swift in Sources */, 55B217DA3023010000784739 /* PhoneReportDetailView.swift in Sources */, 55B217DC302301000078473B /* PhoneReportDetailViewModel.swift in Sources */, + 55B218A13024A00100784702 /* AboutVC.swift in Sources */, + 55B218A13024A00100784704 /* AboutView.swift in Sources */, + 55B218A13024A00100784706 /* CancelAccountVC.swift in Sources */, + 55B218A13024A00100784708 /* CancelAccountView.swift in Sources */, + 55B218A13024A0010078470A /* MemberInfoVC.swift in Sources */, + 55B218A13024A0010078470C /* MemberInfoView.swift in Sources */, 30A87A622FEE724D0095E7C6 /* CreateBubbleTiemView.swift in Sources */, 30DC185A2FD11E7A0041DCD1 /* WebOperations.swift in Sources */, 30A87A642FEE75520095E7C6 /* CreateBubbleTipsView.swift in Sources */, @@ -2047,6 +2132,8 @@ 305A76CC2FCA8C7000227D26 /* FileTools.swift in Sources */, 305A76CD2FCA8C7000227D26 /* Permission.swift in Sources */, 30D74AB02FEA13ED0050EB2C /* ScheduleVC.swift in Sources */, + 55B218B13024B00100784722 /* FeatureIntroVC.swift in Sources */, + 55B218B13024B00100784724 /* FeatureIntroView.swift in Sources */, 305A76CE2FCA8C7000227D26 /* RouterManager.swift in Sources */, 3062E8C72FCFD02F00CEF511 /* VipRechargeView.swift in Sources */, 305A76CF2FCA8C7000227D26 /* CountDownService.swift in Sources */, @@ -2079,6 +2166,7 @@ 305A76DF2FCA8C7000227D26 /* Single+ObjectMapper.swift in Sources */, 30DC18602FD12A020041DCD1 /* VipWaivePopView.swift in Sources */, 30D74AAB2FE8C7700050EB2C /* GPSSignalHelper.swift in Sources */, + 55C219C13024C00100784731 /* SearchLocationHeaderView.swift in Sources */, 30A87A6B2FEF5B950095E7C6 /* SearchLocationView.swift in Sources */, 305A76E02FCA8C7000227D26 /* GroupView.swift in Sources */, 55B217B13022F0A000784711 /* GroupItineraryView.swift in Sources */, diff --git a/QuickLocation/Assets.xcassets/Bubble/clock.imageset/Contents.json b/QuickLocation/Assets.xcassets/Bubble/clock.imageset/Contents.json new file mode 100644 index 00000000..4231c99e --- /dev/null +++ b/QuickLocation/Assets.xcassets/Bubble/clock.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "clock@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "clock@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/QuickLocation/Assets.xcassets/Bubble/clock.imageset/clock@2x.png b/QuickLocation/Assets.xcassets/Bubble/clock.imageset/clock@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b2d831c94031f614161973337282deb0348ae3ef GIT binary patch literal 78273 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

uwmhu`cfT&|C&K= z88z2)5oHP2-;eg1j0FAFq1vGfFc%TbscHkF41g%8m3 z`5o)o2|l?)%PwMMO}WT8ARXmk*9J|br&0#r5wWd%N0P1 zd97a(=ieXGKQrwqTrs!w!2-(LhO%7%LA54;*P0+V&Aa>LLm8Vi`uX!BT%B(7ick?t zQGl(n%LM>Fw+%`uaAEU~9}x#@ts55IKQ<6puimUlVH*#)74xF^AR;vTSXg8Gwyh#> zcGolQJAl9yueCI+h)UY6FDsNS;*|niSR+8mH37`po8h@bkOIJkNo#5pWj^4f_Mr`= z0;;RduhC!$dY9B%d%xlMdjs{GHNgsNP$Kj3X8@>MQsuC!G1s|Mt6+3Wjdd!sA^>R9 zmizdO+8RA2UAi!UdZld(Q1 zH44lCsS|CM?S$sMVY~!Tl~uJWQq(Q9+Jp??tJOA;>AHK7@*eEX;GSdtt_9z$T0qAj z2OE&@KKpjjTgTLN|0mPcvvwBT{LbqD%!dxMQ|$zC(H!LT_a!Mv&U^qOu((SOSyQMA zz@RSG7hfxDsP6Om&sbclpmi$l0fpb7tXnJ7=*ODD$`OEH5%jdb&#HUuN8u@E5aj>W z84&s31po@8);6x)k#gr${8iQeK7RS1e*ypWT@TG`X5C*71WvNC4=QvX%^JKbV{kfi z@Z@^pWBmPr%)}GNd6*G@(52{U*8PF?JeoN;o$`2h*5F3`63qTr^f&m*%z^bc_{5Jd z3Orz9^&fJWc_6?VY5^LXdd15dQwbFS>3WngSlel4+05mRC1wT0$QG0n3$G2luX+0H z8-H2sQ^;=SPPpy83+YV!R+Br<$Phx)+Rv=K{k`lzTf)U>A)WDw)$J!NjWI1F1D-Mn zJTdY^#$dNDfRNm@dV`7w>~{k2yUarwI|=h_^$AJJ1Gtxq@XpC)X0`XsFas2Cp_787 zVDx9D&zy;yerDu^01-A2%P5mJE0Y@k@NkMovctt!uo;MPx?5(teyA5G-F?Ob%r&ubHJd(cJ1L zVN}6wOn2p_hccc=2y=iWd0GJHN5(%QDaS}|dJpf3OafA=g2ZbUUMj#J{p=63RHpuS zv7A47BX9=*xc+2%^dI0G`~(0${NPmE5AO;NLht_V7{I-N_qNYF<3D+v9vqw;KMwO! z&B22k@z5H+J%^i5*Brd4rTR9eb9XWIcNWvYdeZ_sME=*12~$R{-D>1V?=CC@llQlDfLq8yfzo8CWz1DmMUe zXS=x(&l!j`wz~xmZ2P;DTI9X$@|&IAJO?`}I|+^*pLf7^4n}51dj~|FF&{eOR>Z-h zz5U>Gm5M9N#9StAk8)oKnnR2a11t3}`;06Y9Vu6dLd;X=Z)0_scsJT1l_3TJ6A zLCPxnMNw*Yfx+m!I(hnc(9LQ4Yg^xt)rn)V0bt-`27O=eK(`)F>v0w`f;e`Y!xS_O z=a5O&GXmqak!I7_ck8bDcgx@UN11W|Z{wGL@pJg6Z^YHG;ny&A86Ryw0lsa*%iv(j z9K5;a_9i3yMVW&k5cvLD2I2Y$qx?e6!MmCEx3J>>AF4U{%FMwBOj`F7`*{mct_G-A z)9Y{WiSL~I5CC3r=aN&ep9#Fb7LZhMZ~8;u_{$=oxZ>PM>SpHP;%xbe#$7S?o)^EQ zIgfLtZR>$Y*|YQc(**#&UpFk5a)VJDKU-t`#=OUMwe?9}iqB&WZ1?N2zeFHH8}6Dm z1-`G}H_X~|TVGwf>Tua<@5!55)yX4%(8dQaW`NBlFN5RC48Cw=yv6nO5f-#;Ls@`y zo*C~vR)ICJTrvAAaJgdm87j(wx4*5OlO$$fn>#zX1A)wIW;IysCjQ{jIjFzRJ3vmb z){tjy`2kjTdCt@jYxmx@7Je>>Z2-14dLj#4dDf!ylC{3&kV6XqpF%gd&g-0ZDE@x? zef?NlI*z#^nQvm90-}tgk686xP{&<|E|4T#3}5um&I38{h6ST8E6N@Kh(}kM3IKnU zfO|=Hmrw!p0tZ^;XF%hRU=;fgYh?W_0bhroe**aFhd$uDxBeR_{{;9G0Q~UNW1l^v zm8B2R>k%;3#{-4=?d1d1K-Yet`aK*CUf7?e*T0W2zv**=ulo0cs;fB-7jPYhFpeTHMdHuk;+l1Tca`;ygUToEr9 zt$Ib#+f&5idi2YDiS~IATomDo&4$v-$?R1>KYVdt=8%l|%02<$QdmJ11n~f97e${# zo6~kh*Z@9D0fNovQW|~-xLPlS4R-)>LxtiOOPSWh0H)6`>b~@)#{&gGHq$MKZaqBd z$+gV6FxNWCT!Bi_QQE>re60b?FKfdD}n>_$eq*Vf2eH0H917&7#aB zzPf+CiIuQ`>HoJ*yQ?3AVU!WI4v?I>b=HxNR0cIxx%9?S6`J3AW*vu)tx!N2fRvO| z#-gofGvKA5AS~Fs`dR?AIr0{`rW#NNbl}wFH|Yk5?tvcu=vw`IRt1^a_ReOO=Gj4f z_g+t3OrhKPNdt)qBQk*McsH*84I*O2CZ$o|C)62$c9s_v+Go+d@6`*1so7*QOY>nz zHgE9O6Ck8ii{rFs1a*J^(27glkO-83dy}cg+H?E5F?2os(5PyGw2Qy50syL5-8p&E zN_zldO|M|^h==L-!IgzjNulpEpaKbOqS%OhzTcg7_4^S(MN%a|gsPq~K&@3jxjgHxG!Y{VYYqrlB_2q^KscT+55R~ zSPs`!59VnuGg)$TYs~DNv+wFUz9F>#vtGQqv(y2bhyIwAO>EQ9HeTZ!oF5}zK~qsPa` z6b%Mt0im~Fpf3CIF-TU0X&i&5q1J#m*U}vhR{BvUH`fpz0LK~22{&1^>Y>ZCXuYOx$3(uFr$;O29L$JGV4@xukTtdB7ddN=jKWwv1VxBFM@Dhl7Ep+r zk2_*lkyTQmxWggIYbj1Oa**lL9C0B$88>slJJZ|9F?HlQiV$TP!YDF8ym1E1EP(>< z(wKytnuJk-_(Ez^HCQqu_cCGC_G6?xr(Bb&@WxN#d0a!b4%USO)Oiyq^?BXQ+sIW^ zP$3f0ah|9OG8_=8;iufLzt56%plVn`6@&xz!mSCT&C-sszi}P{IYfaw9nylpQVU;k z4pceNvGVy;Kt~RJe!!bgh3b9@)3!ud<5+RJ0;=@HrfXNaud-tS-9Zp~`XEp>I~F*# zLVT-C3aqSYKk1E4M&r7lCSkU%6w9&rodOj>A7zTr@Ec&ic=jk?StcBlB9(!Fb>4qq z)$G((2SEk)!tV8{5qS3YC!&vhrmoaAFU!AhEIM5M^;N-r-25|Rn4Zqo6tUJPR={-e zbBq=kaFQzr>u?0D5OBs<4ve2cPq01hD+h`ra1uEOD^x35c;#Th^W-ULu&55bK2O~L z^vM#Dcg^u|>E&HXmq8SlmF7L}_AeNz+BNM}5@?Zj=-qA2)3Qv3_sG0Y{&yh3-RgJ6 zd|nf%Bc3?R>fGBtBU_Gb!8P$lqq{VD zQLqHtyt%%j`8*0oK7g}w3=7j&D-ZhLSg19;3f!<60F)M_KxGIV=Vo-jsgtjMPKA)n z=&-7?YM|VcE!wU-9o#txU|(5Krw-Wfj=PbRnRpo}9bEMTc;r5?I0QU7_ZUq-B&k=g zBr=vNKgy5N{`nb+r0Pf6Jkxj+GibVgJrNaE(ymqSu5)?8e?GJt8y&-F&}2)VwH{V= zUn*NAI0f+W(W{@45-ge)<)4@P{>mf#%eG^-08GWdt=2Lyoy};~h`a6}=<|=)HNV4A zSjIV61jIAiY(t$4Ak5dFbD)B$Tshbbz-RM>HdUplat>Om@T{RYPu{1>&x(#h-qXok zrbUB2NkTgDs<1$Y{y`t_4 z6sM#|xMRc!qOt^HtplwI?>Pf}LxE#7CX-30jfy^J@ZJ`A&$a7lDj`K|#UN+!-ss`= z6%4h5Zv*i=&&JrpA9OoAKj8SzatYN;cP9w_U6prJiW1#y< zGI=%B>PJd2u1hY4_G=pC1(_=r=dJi`F4^QH? zHOS&FO(7dhX=C{Nh1S(nhe0aH(%IJHJk&CzrbXkDPmcTKN3n-3(4&c0c%pxIwUU5c0wy=P@ey)!XSyh>7 zQT~j4@pHR&aBl_m1x!ZXdpiOPo@eFA{^6|*k^V>kd>*lgbz79Z zW3`}4lnw2m9Rfw7c5H1T-Fk#R6po8}9eN%9s^e?OfCz@_S&XJ=cjb6So3{+ru zRl*4skagg3;OKl?sPZKV(1GQ{=6dfyx$a~0=dSIOpOYDUHnk;sxz51$z7g#os2ck~ zIfDY3x+KO`-tw49jIv{vb5Pj2u@1zpW3tlopkdtOYe zA{C0&X`||Ex?UyFE>l*$De{cMdPmea7y^1Dhqp1X$baf;mLV{m&j(GUTrG21OKRla zu(>=#<6Z-;D#-zW<48@|RXVC_L}&wez3CGVrppL=mBgvbb|l1`PN=hNrs8CTYICbF zG_E&rMDc^r@xFA9Wam}@gu<#(mXeZCBT%E}zJvU@_WfAV{0C}uH_$u;SmZdNOsZ9- zG)?XJMrU2#I6VP4`FuuM(XvOeapEagEHY?!5dL0BEZRue{Ix9mMvi`mt;_CcIFv z4#UpqJDc}wM<4wR1}F&xnil1slb`F)J;YCKBGSHW)Ou?Rm2*Zhs?B#+63RfX zjMA=GTz5y_3tNIL^MvxOYEWejW@SWn2(L0yBS^_jCT5P5sJ*77 zF{1iF1k$SE@B?g+u1DFc+VhzOv;oQ^f(7s+Jy;z<0efYy&6%j@BC>XnRU87ct`;=W zY@5_2P^#2aQFgPPY!#)qTWB}~+KKDq14GhbO9a(-l0|=Pm$n2A$OiU^uhO6@a74(_ zB@$eH*Xv_$mz`vDsHhEnULf=hDwL76qNHn4n# z72Mi5x%&AA{qjc#8r}=&4+cTmH~{9=6fm6z4&hmGTssNH00^ow^N#3~i}KYW1IuvP zNfj&#{~DLd%*(Qd^`Ae&PbJd{0o(na9@~pOY_Tstxzao+^=&gX>DsMTXxb={%@-_2AhYVM<2 zIatdDD^5W|!(m5Gz_1^b(qTbW2&rs{(C%psY{TXH6bdXnmJu`2mFQmUfveb*S` z`hILH1@^{al~$iey<_Lhk&v0_lAM%{YVL55W>h!FYN@Z^RFl!+Jyr(j&8c_*J{LN9 zDRZ%{9W>QyGF5dS0ePO0s}EF>i>Q7^X5?PTZX(BxaXoy*X*CL2Y0RdCW8WzIF$$}b z5^}I-*{0QXgg_|DZd#(H{m0-*>LyHCg3+-C9D0!ebI9xK*B-0w7FO&KV zf}m99a+JAL1Jq5KORL00)3+E7hh*l$9o?6uAdid8xQ`~1Tu>l;8x-1V2}{Q1k!R^( zarEUKUu~grx$e^0%9exlv6|Ss9xIe8F}%BMA^RH)1|@Y=o%wjo!M!MJUHi{YtB89t zslaXp#c{Dz5Tc+wZFH@tGN%!*<0H;6aV9^x= zXT*A4HnLy;CUOq)HQoaU>>LRVg4CQb(jqRKZy# zB_K~y%E_*EAI3nE>cw`3DwGeMcyE3_aeMjASVr_kgu9O$k!L9l(66FHJwM#?8e6B> zI_fSV-qm?FYGUmLYwE<$G)DvBe0MIi?xthFE9z)~9krc{SFq2OGMbS_x`uQHbp=c{ zc{fxc{#etQyDGrAlWiRlbiIzb*m2Av`+zM{twQ3l1Ma!wQTZ7`bN#L;z80Zxuq?EX z(V$pKuC+#^E62)}h-%BNRGb%{K&wG`1MrSWw05sS=#HG%&@OmZb)Z74gd~8Y;tiWy zg?P0feASGLMdrcFx;N>nSslf15w1f@w=9bEppgMdy*OV{>09Wrk`)DYIJ~V$WL+5t zO)_lJ0`MrR`ue;!{D3u`YCHZDqmO->N8JBKd1t?Hh<^nD<`Y@x*s%z^gOx3r98uRq z+uOioQvJKQbFjIUg9@yxm4kIlW!3_wTm4SA`J4j~TGaXrRV!Lz{-pq3lNg;k~ zkAQ4X<{WG);@&?OV9~1xM1O{So-{cP3wa*>kT??>cOx?II6QHjDNpV2-rgTzxNtIW zY>A5JNGR@ItteKa_I*A%8QBLCD1FgVVTY^$ zudXySQkhVh+?q(rt}e7C$0{}E3rBfKYhg}P+a6lrUI96x<~mr^zXp1HC7kMdjqQRxZs7CB8(6pa)oXk3fJNIX?_*w!)JnG*Lv;`((m=haxMi1{&b zf)6xj!;F|Wm&En@%9#Rtl@`;vsK!X7&x(w!B_#t*TrMN+K~=S;zIMqAMM`lHm->Aa zauvq03c#cP%IZO2ayf#6?d(cn)pIh`PKJ2^f^0$`BXBk#k$k@uksvxn$gax+F#&50+hN)%5~Rg`Q1J#|FRn=1KJ0rz#1 zs|BtHwlbQmgiMj;6uFX*wdnpJBh?XzA`xZJtP%Je_VSQ`S-U?(q;!NWTB_a{B{F5% zNLcEzGeRwp6Xh+d9}EJOV{m^nkB@tF}Hq>Z)sLk(+men&uHktq%1y?xU6P|57}t?{_LpSD-}6k3%vbg7BQ=H} zoAu`*9EDWO)Rz2ON8n?CjGFTe*$=WN0an(e)MYYqGiME+xD90a$q1l~jQZ_L*-AYb zmn|WXqx)=;7Ziq}J$laouer{`h@cPh!YY-L9L(#-R}hbuh`0&hibmfSu}48gL8^?$ z66{nYAfYJ3sa&55?nX!0I-;*ZvZdg>?LI;cvcsS`T~Vlwqm%|tfeL>?TR<1~)rz8y zSj%~A&QSFM1feL?D4aTLnS5(k+yE#F$OcwzjffN-eh`#Ro&bwnvl^Y&hDm`L>6X#* zD(O{UO$e;#$X!v=B&s0=lq~qO7+M_;8(;@=RH0(5uY2 z_vg7tf(=>q8{S2hO+YB@9cpU`hEbQDSnc-^Y7`s>q2?%R-G6BP*z&AURu&YwOk}Bd zpOXRRg~gFEE6#*$yzB%UYMORfX}>P_SO7tw>fUvIcL*TKi9*MGbwu9^{Gnwjp&2KW zin*RX)Gppu!KVW6u$2q>{6OfA`WMF(1W_5(4wW7j=kl9DT$VDjo{D>jMRdR5&Q0M4dV8gI&G}%-wY*`Jy3J-1iKazR07al2 zS7>-&-M9OhCX>hqvpI~;dPq=WQ*Vn(`eOy@Jkuf_w zpqkt_0Pyp}Ly{=IiIs!-Q8WLl5&hG;a!`Z$l8!>PYOsK(vEX@9G5=CI2fdwx6(ajR zat=1Va?q#$z-i1m7z0RA^=Am?pgHCkEd;nduB9$BD*6M|YXB?xH_H6!d`>wf)U^C{ z1Mbq)jw&BuI07=vscodW!co1-(xf#RxJnonur5{(IvZHYhmmw#hF$QU(NILXQz3P+ zMeTWveUOr~o_^iQwoaavkQ-Y;bKpu|<&k`$p|@$|W$DTsWLA@5Vfz7@5%JvCWU9s& zB3mTA=^{%i{A=ZE$PqYP2llw}F^;Lq!<0JmxYm&u7Kf%;iK&uG16$y~@s5?w zyT_?a=2ff7WVKEnb+W1*(fJMVvN-^XKq<}20ldL^Q*~3Ik_q)uxfdzR83;s`nZVS$ z0|j1-KgOgoMR`NM_*(<~G#&xC)J#0t+h7;Tivr&F?dMp=5wJQ3w3&OTR}K!v{3o$; zu%MKv_cx5jo?IPhpN|FC-zz*`ie$fyC*7+sbI;VaQqC8*=OhM@CuWv3ri$DusB-BmYfVJ z?Fn+XV`O~J1(DRDOKFU)L2Co&=KnRX2#O%yM)3{hYsYB;521bkXec%AB`7J&H{^hu zyZBcD0GHJRCy&+xzLx;iFA#4`XtOQmanbD@tjkfD9fAxk&^qD$5L8QfHZi|#<=~`p z4%Xx#Y&z$lH@q(>F{;1orl3t$DXJiNiO7D>&d8N>u;R*u;{@q!Mq69$D+jK!q0XrL z*nXa7$85Dq^G30Th&z4&Kf2rbeegu7Py}!MapPU3q9C?kP|Bv{#z6 zUay>Bpo2B9^25MXh4pGhA+Q2`v!N%LN{A-`t*%Hqhjn#7%ZimiZE@J@uC0X$`fYXR z4TnaaM{x{Hr;b;NDGGOUFPCJ=be=>dp*(0-4DwdLLxX(woe&Pn*tfvTm#{Lbv5m$t6pWI`BuuJ=l$IQA)Aqog|)t#Z0p4+SB6qdUFVaq;V zp3-Fn$m*0-O_6lxKm$-E_AoQxe9*W3&iylUg zm`kT+5Cr8h)W%!3Y0`pf=@FM9@onYjUNlXn`dF1SfKr|{M}bhA^tI7zpFXa^y)6Hv zY`OZ2z|Y_TfM?B#58r*4DwJQNvFRqeyQGu-WdOVFyx;98unE?+a^P|tHobB%BM|oY zu}IFrLh~Pj6qMgk&Ou$RXag%0>&Q81a~S4r{Rh^RoZPu`u%g3|EGn7V^vb~k4nsPd zQiv%n?qO^h5&hPcgF5oQLezc1oCB%l9}58Q=?7Q_jFHZp>(?Xu{oR<60{%LI2MJMv zxsp^ns^NX!`*&=}4$kK(VKfx*PBau%Y-|m%FjQ;s8}kl<$ze*dUd1PFU|d$o8OA{7 zYAz)XuOjRA@VqUFwyC*iN;#H<1iPXf+Kjc_YXo?wITjH0MHah{sZsp{(?ccmDz zG=V~$Xj^GkqNs`N+Z+K2y-L?vSw%;2x*Ca)D(O)@l&}S)`8o8@C9*`ft0q#BCL_rO zh(`)k>nE~R*a?{6fTHolsPC0LW}29MWdU! zj5+?w2~vh9RiE3>KM4BL>tdJ=vX;e))BBxFuN-xMQgOjTCJ!D zs4u#5U`UGAymFvB28tuFgv4iQ=U~Z|gJe3Plr;g`Y6EA*gXj>H>gOO>2~BCm-Jpes&qHnT|Z=F;%iP`d%vM0%uKfqq!D`woz| zEHnrwf@Ga~#WCRg&YMfs+ag(aFcdNw3`(2ahS#arYrYo+@U=YRo)zVvkl_B8fj@8i zj9vurB>?05D?;OQ9pL_8x%n4y6jpW)bVoslcP1-ZdBwouC`=wbBC8f?O^(83Z;up` z-+=X%Kt^e9IWgd^y`egtfP?7gj~tCTdi;OKUp~I z5AO^51)6hU&J)gN?p%SbejML``&c01F4+;^$^PO5UPlJoc=D5rFv!7|c7O z?<4D`Nan3%G(!c|?Q`Vw)M(VzR16Yz>XSy2GX!vyq%@RptChdEMd0%!Bi@15dPT7S z_+bmYgO|q~TI2X~e~SbkgES{wC)--S(o#XEu5%x`9F?3>RE?#YDI&*t@|NV}sI}P? zY9}DlfZldfVtk&HYpzNzqYBK6yr2jnGH7+$jj2tDM-PavBliYecXh-q$jbSl+K8%= z*4Rt;ge?w%ey%`7&`HzJQ&CVZin51LYuxilG?%z54W=CU+ccF5L3v6}Qno~-_2y4) zJbzpeRT-(FDC^0__izMcRDB>mpX0os0jfy~Bj);6>Z~%Qy$m^&i@I%QqNdjJa8EvwvxQW&Wx@y_x|~ zuOJ9WPI3)DZ>>-xAzC?1tXA+wR)wYZx=nf!X+)W8KpeTQFN#piq&EfLjr6DSN91kX4*hqM$|RAjV)QX6k|Ugee~1K?_5#-6D&Ek8{F^S zCE%sjF)snQ3pVPd#Xg{goCDoaxYzA4oaU7SMQY^G9<6oNz~LxNEY86?a}L(Ia$xue zC%JOa!xLD`%E1PtKh?^?AvTqBP&o${krwy?zx+j7Etjp&VO>N%W*g~T1?#amOkX)r zBkvOUNA>YW0`G{Aw@7q`m8529+0jJm)xEXEA>iS!>!yAuv}!H#F|c8r81LPij?cLi^Q(9S|Q{ zL07Bx4VEB&4sQT?qgQMOazam}U< z|6mJS0QP1x8gEH(@2>JQmj9ap>9}9ws#;&aIR~%8GqUJxMgR_wkSnmCB~_Cto>H5( zbmqz7e|v$~F@oTQ+BBTCQD z6E_Y)#2{O_P^1uncx}JQt4h>7j({{%F18R|XSsu5VRI#NZEb+X0iF%0<|ZrfTgzrf zYC|jIIt1+HN(4L0waXfV!7N2Wq}R zX+Z@`5^f~_imS?(CHkk z=qTvUfz4KN6qa5!XmJ#{!?3h-uz;hm=*mIg6@#@p2Q7|*zG|@UDn;vX4s^f3%sJR_ zj{_{0bFkF>8_qe12=w6Skk0kv@Y>Gx+_P%`fj&9R?(WD(!1fM8nyd!zx}LsN(oI?{hrHmS|mAj3GYM4q*+?YVU)6$OxmAu9e!*& z6oWJ;N%py-*>5V^P}Y+4Dgbnl@g_$?Z+(ueP&(QcnI?sansYWKH;Yb*4u|cgdQ7NE zy6w?-vUGywjzj2#{IHr{ybi*kl=7bD9&#tt*FPUy?fBxDY>5CtkGkzHhX(9*!txJt zM*BgCvdBR}7?cPKQRcBpj;*!}<`@W_4Q%%mR8E+f{Uafh$`ob!$K{KE7x+tkZs;0- zx9?aUG_S1hVQh5{+DN~9_u|gMmDTRSwsK%N0(WsLRt}u!Sj0Ja4#0h^ZRMbY`!~OG z&{3u6834b&3%b0nU;0hw95|8?HobDt)){#vV@nT@4i5**OmWWfUM0im0D`E z*A4&xj8*hc9VIENK>1kUbye;&ql5-^RNn#b(kXzH>o}YODX$rgjM*|}<-iW`wIpZA zE8;MKw^$}L@VO-sHr9b(Zx}Ufq&Jx(k#;EH9}KD+Mri-W6fxVcg{Uk2RuQkQzyRr^-SdwOYp?%BsJ45a67`(b#qR#(X{Mz@TM75+)l;t0l zJN`M~Uju+o0{CU|Z<~GYw&Q_+Z9NaOdzy1_6~LR~-*q?&>smQ*4O?i{U`a<|^D77U zsB;NmK}Uf*4FBN%eR^&Y(swxwOF9Q_W?ey8w{zg~2sl_fl9AV2t!UFL2b;|~cyx4k zfb;!A`nr_A&r!3(Lu&dPoZHAf$b?~Y<)CsS=5$1>_zte9ezK!$p0``!-I`>JDOHl3 zmNG$GZg{W2e@6Bi`{UXXNM>`=4_4qEV~km++O)Htyhz%eKO$g^fc9C$ygiFHMM5LD zv|rV~i(zS!k}mJb=1F@5ex%P=y=jfoCn?$Bdnkccgxqsmx7U~_y%NQaY+645Fy??B zTcLVjljNAg>Qb62pvUI$NG8nMkSJ4E4s?l8niJw!)5$wx@EYvPB9jq^a#prei9)mY zjfPtKHB&*6!-0ruNsdT*RUkPu@Qz2YZSbe-&Rqd$sdeXSR7y_|z9tKCEA%E1y2f$AJ=Hs@ezNl{OKqOW6cnsW{&8(ukB#WCnpt!T2h zM>C?O&vBv0&e?%&{_|_g9d=8Wn$+Amm?WsD$?>xZwdMlM!R0vZLVnv6bDB~zr4H@9 zIXmB;&l>s7wq?YlDF|CYAYgqs9+lXdA(`=n*)4|T{o%cG0*J<#iA37Dh^&vD9M5aq zyE@*c^L^qvo-83#f6pK}rPQv^*Xq&_>$iuRvoK=U=a%JU!?f4m%OD+)-bL2R;qv+f z$Pe|7R1!M0TK8?|G@|zGz}S{d3l7v)1{eDqy?z`6vs85iq83NP+Lae-ZF`sA-<4z= zDN+~#Yf;XyEmV##P$hY~>e_P%Ri!K%X-W+{NtsVGs&K4u)SMZq<5X_VYp+mYoIrMvbYF&Xu2guo{(N`N6s+}hh>hOeI90rKSU1ssY{toZmsOjLEgM(xvl-; z^x=8)(+&aTIX)JDywSLqW%(2G#SP$JU*v)C27vFo33^?=@%s9sP_=U)9fVu!brhVd z25WQ_;0l0uu=bUMbtES*m2=RuO3{m0L%udR2SRcy9i(pm|7i!3s{?70A_a&sBPt7P7Sy(6ZfAVvHJQucFLb0 zNr2y32;3$7hf|`y4ZU2u5?1*{2l)An8g2b_ra1~z!)vG_^FYJjm))mODQslj`Js#MYc2nw8P)HQ}*Ucq~0DOFjY$6eb#(vxg0XHc4NMcq|nsI?(hgea`IS|+YiP85V?86i}YaP5aT z`g_8Uqh>Jo8O|Fx5nF9WWC4>%5B$VnV`rE3J{b$ahFS1Bxp8`}FfvDpN@HvwvM2v%7!P@IEn z0B*0(A>h*~IR~$-|1;Wj&OxhlaAo!D=Z-hd5BEk-L0NQP*WygFnB~_xcjYLE|Cjb(fl8W7Sc;|rKuIArrs_-zeep~dO z^Srv>Ot($M{wx_NWigEiJ8N^xOK9>+IJP9$8gyA@iqQy2=P5yNoofN^x=~d}zuJMk zekB36O5RNbKaY^ zS*F%+H=F`XbE-TYsMTs>HeS4`%!8bGM7jx3i!z?sjJQsx0sqJf(P0Y&>zf6uch3hH zm34%A#tHIVpC3g)mQ_wlrS3PK8xS>ZZW-L$rj6_sYm|t-X0qB&n=Hr%+BUGy(NvD% z|&F=ps$O+wvx&mSK$7K>t9f!g~1&FP?o*EpoOj;<)Y5P4e>C0 zV{`C+=OkASq+RcK>}gmzxMxX5KCL+iE3X_Z=`i%kHvmp|wW3Yu92`D)Knsz6o8zGO zH^93z+1;aMWB8YQ?wCAMA7+)5=hEt32`)+Jp#5h&qkUz6SIl28A3E(RDVmXt=61UX zdh~yObVS&xkbK@z5of0Z;8h6^u#Fwer&E$BpKMPT`kRoBzdSFcg(tOil^u;No&kVtu1aV|7-0@zz$)Y@fSL>lm}7{MA+xcK*Zl@y z*Z{u`fD@vjUfEuDi%l}p-;=0bCDNv_VQ`jaG^~?b2V_>xhfyu3e#;>BxT>b(AoxK# zpcE-&6&qQ3N1sE9vS(%|RDMjRbfRsNZLOCel6>{r_Y%nC$Xq#)e42~MbtB1Xuapx( za~cdrk1EF`1Lk7xPy#(4C;&48kZJYnjjLcKGs7?_o4f$&&{S>-iLSE-SPKUvh(v@t zGi5V5gL(tnW#n8q24NH`^T|0~^Y=2b5)hO@i6~^-06%wMtL{hCsnM?MW5aJ~H11_t z{-X@s|4p1$vp5IKIs#VbU;|No?q}S*3EG51V08|zukHx+at_vwesMD(Ri_xtAq=m77;`18%a>7hA)6UA@0kR~+V*;c;RXGfE| z>Q3bk>|lPRo?|Ye?~9b#58;CTZOm!bT5U&0*IgsbYB?2wZwU}jX6Ek^kJxkAPms7f z-g4X?i|9JcuC^naMj!45QzLEe8v5A|evV;FL_gDN;b%!kFttDmn^zK^xB+_Y`V^ua za?sadw>m8cD(A$`(7j8mAG135c{U(K0_fQZVhicoI?fVXL2%h1BTAL% zeQZLyRs<(jyW-TMzn}5#%B6?8kDc{2tGEv_C13EmB+^=QCXJ%2m|+j3s18x zuyU}pb70c~t;w$51lpQ5Sfhi$R}MCjbI@zmV96>)y_|zJI0{`W2dA|& z^7#IJy8m3o_lFM#OIH%=mn>`p-)9zf6kO7u!`<%BXhM&yV=i^RVVC^0iG8LA2ULaZ zTjKj7w144(JjOgn;{>?vTn+k@y2_3sMZk=1AjX9KJ($q2(?4e!vworR=zt^Tlsc(XL4c&JKR6!eWD)zG? ztA<__gsiDSZ=X35z&|6I?V9IAVJPk~pF4EqIiiqjSmdT~04!xCgK$(fs5H6$T29)b3iL&Md+6Bqmdv);jO2qv~8My!3@OI+PLAl21H=T2^ z>6L>wZ-F*hrAToOHc+MLHma2aWyhLx4xG-x8mbiaat^Mnehly?eGfvTUS27aIkCdJbc-@Y1q-D#jEg4xXi{u`tt3lC8|H|0q`M- z2z^Ty?)-2-YQ=r&Ah_Y(RR@1(2bdjAm3sa2$)H!I9eXk@n}o5^qNHr2h$6K)d z7|R&5y^s36@9Q7`JkOnb&-t9s`P_T%b1!yU@zk1OCcMwtRYb8a0MeT5_1MbPjcC}{mQwym;5^JYa7+qaZukZRWj@v z3E}Q8*n|grC4#Ql2B+mmzh6dujI4hKdu6}Z%ivW?!m%V3n*$d(HYI5Wsn?y_2>S=2 zy>ZpfO=bbR4!1iV;!AMoLgqx{l*Oq|dQj_RflChue!pKUvbQvg zu7UH?k3H82GufqJd*Q#e3f|sFQJRlNwDPIOF)1T)g2sCz&VuRiuZ?W-svBzBh~)&#O5_q%R6+-(nPz#i+c*(0zL&i839qFb~tTZgKwM zpLwrAfa{lFn4KCXv7|2}g7bJD&{(MFDlez-p{q?CS?+WEN{+-O6e{=em9Hk(&#w#x zecou85<6>qM9J(x;-w${KeS79l!^)}?N7#mHZ(=jG-Zdt11~@2<%Byu2UZPrnKOI0 zvK6v^-9GRl%s5{i_WZ+@7H|9o1U)>)3wolRRu1G4BWMGu_6b?_I86@%%tvK(HJwm~cyqq6Lr8}l!Lp;G!{0tQWu|5$pv|N!kSncht<**_Q0|i7@!V~}2NdGnEs>@`pOve^E~L z78Blj6`dl|s)!WbjAgN=cX=KDn0m43Mq69Y$VX4{qUQk*o}oyoPb~uftZx&(6M{e; zV&&Txb9!aXU&q>eDlLO&truPna*VOQ$|`I3>4tlwl*23(c{Xo3<)mE;&)E-@a4eja zrUmXMft$`mjB1sH30a@S6zZ2h&I3=0S)#J)B~Z;F=`H)ifh+<4(#Tc|Kd}*AV?|GOPb2K>);lf46hA3b$BvEQlGk7SMezXzDFQ-p-iDC8J-PCa9xgch9Tf$ z8u)n2{cN|5lczkPUim}X_iKkQ0XgEx?H9z7vxJX{I1!a6?|CmtjkxzZ!{M>TKN3Yh z#C9BdvOl&_fcjV=Z8}C*6UHyIz7W%YAw2g>5bU<{35(aM%etYpNtEGNyrve==NUm= zws{=GT{GTONZDsMyWJ*%L7aH4f`{z<~(*RKOlyj$WR>JSBZ+_N? zEI4Wm#<;p%JL*knG3kC4eb+lJ`F`A)^P^yN5JT!P>U^Lz$^C-IRL0dtKtLGTX0YKv0cbmp>iEM-u1B zJk!@gw9)Nn*V|MMCA9PrJ4{l9WMmcr(%*_{u9n!enpqN?er+7=W@N4(68Nq->lS~I zV$Q;5b}H*lpy472VF0yxrS+K?#XG91F6rxC__R=UcPlO3`yuC}E!o+W>gww8VtOC% zOZW4YPj!W2%bN4YtKG939nZBUc&|)0(8$&)@IOcXwY(p8*fg#C?V{%5nWeO}#;;{;vx%A=( z@`stJbR~htVI$xwva-8Ve(NCaVo4_ELSk1~{@RD&4{pOU^12`7(Jg*IAN*z|)TnqA zeKP`eTqFol9TE*=&l%ePa69~_^ja}_FjPdb{6F2V!-{&R#qf&yJ}GkQklSC!(8R(! z*N8?uzu&P}T;H8vk*aAIxN%N!>zqi6^&Q(kIqGim0Bk?bMh<$KHlaj7k|Ms z`9ig{^sZ`f!pAS??q9Kny|6i)mKVkpiW2B0^tvjpC@SPTUihMBor_7fUma3C<*$G2 zPgp`qSkRM8WyLw64)_ypdVNzKus0z?xDQK5&&B|YBxhr$VsovIQ8>{6c|V1mM3TBP zktIVwGW`hig}bh0KSTaX_rc|Uas)Mm|Dte*NAyDZZ-yLyqekS{+~V?jzedclm@i?Q zjnBn@9$F0(Y-|oc`(f=%e3xHWD?0wO2e+xN0!UG~e z`5$KM9&S6Z+a`B=Kh=zRlG=4TAEMGEakN?|6(+vhV-~~+2(GU;Op?B;26}@!nY!44!&BJTzyB$fk{LHgBxMzmr z(H}_{G|S*N(^93qqy0bha*y(mC;LAPd;`NDCA2CDQ3Gxw; zPVf1ncNL!NYp{C{+SZP2WyMQ4xU=slE|Q6vJ>Ht7gG2!YttYhcqv`Qtm*vj|ypBA1 z=B4S8Gq^fb(mtKn(HzOn<7lSXh%)2~1rxu0o&^V8qXqD1zRQnQpn~YTLWjhbUlgDd z8ESFB#yJ{261e8d!T4;&iXNz&cdKkGeHd>zn0M}Jt7?li8I{bC5WBff5?o0>TO-do$hVP?RTK1{Y^F~0k5E|9w$7Y5}tuw-k( z2XI6_{?M@Z*S<+Zk3Lyoa<46TWEv zZh6PZ+u)w&@ZUV_sh3QZ@ya0|rDD6X%2-yNNJG{cS zh71P=II9t2uN#yFPEg5jR2z|JFc*t1MJy8o(jR=r02k@hNvHm&;wFv{O)yN1r6&N0M`b2Q<8k{3O~*m@wdhfJlSfaJXDW;Jc-HQp zRmB38Kj~qmw-WWwVjSX^rHL-8k(iM&*cp5@{6^Jx32ar|M4o~#_RO#0WR+t%m5TVJ z>b)MVft%;Vws|!@PSy2Yx|M_`&3i z&iT8y&~RQlaeA%^fU(s_*Prd;)g~Zn{tsPcC=himwiC9l90^By#q zX08z=h~(!#k-uhO1nG+YF8E0C=e6gGW}*N~?*(DnoH(3&R_ut8y)4h}n55aLvvlT( zQLoc_FMs}bR-e2*cjNggv>ObLA6bxaac8SMNQDV*X_;yvA1{T#p0S1$3#atk0uIl2<+QOG7s|;jQKg>Dlg!_-HGhPjv^K z+sb?QzR~tEdVNZ&iub2v>E%gqE5?qo%qp;Pm?vi@+}MOW7`w>U644d}}-3pP^rl%E@z&{Y;DC z8R8|0QmI`;{#$m%?Q)+Tn%Y3sTxrCFcxNG~6c6XJ(!KD13UNsNe9bXdmN0;|m+_J~Z zr+%8pbszHu$eZp%KEI{EKSg$6#;eX4H9Vyg@nB|qWt_r+9H{1g#9Rqqo9@gS{o!wY zPjvt-ib{LL1SIoGn>RX0qoV)7?8&DCteRn*!knOE^C{Nv?5eqWWxHZq)cR9nMCgKW zec-m7+i(b3DlMKWx2vAuLy#M2e-X-IheOR%+0D#Sz1UoZW#i4l+sw^B8ITp(6yR*> z#T(RyB0u(B*K??epD7E2OIPC;b@DWoQ;5FcK{B569Ki2hUs8sf@=4uSd%LocSQ3~O z;rj61Ks9+zAoOHecP=CIcYf;l<%49b8P!`JaeujJsixVaU+DD4Z?-nJVg0l$ct|*U+pCeRfsbk)dBl^!*1N2K_i6 zm;VH=2Y1EF_7IgCxre^Tg!=}6M}e;f!wKAieli^Yvtcy&*ZB?l`E|}AP)NISP*xEvwQhUxg;32WMwMD+Wa`&W^!?cf5_@oTc=)&#titf*o;J2QrOpC zi9Yg}3tY+0veUkHVo|;>aY*rvx70JTkAB~YpyjF&c{uLu6j2NZA7L#QQB{tQH9U9X^C1C>t4^>$WiQ>qnh$&uF;<)t{N0y$$W3z|{dWHu!fVYLxb3x|1obGX)dJ zTn}0CDQc^{=d7EjN7wDcm}Bef6W%8*!n+S((oLzui?<9Nlt!1w8tuJ3kX5GmZY)`V zrdfcg*15ewwaxBw!(5Wot|t1vu^EFvuH~I~&l2`^yXbc?4k!D8?n0?gm~~j+dNmiF zt0&X+F&dsVt0%R;6}i@0UsLye?f7uzk&&+a2sEkfw8n>-Gg!twSbBiy&%WEP{Oftn z2)P#jAk*@Xds4&PEz4~82F)B7HS@EzL*@L2DTt(OFgXXBKGnxGlZrkxsZ1IS5p>(AprgoHsi6OvKBp{nS2dR0tpUQhndi zU*HdiGZ8WNm)AJ;8mn=}Elfyg??h%_9A`Ni_1kNFrC!;eC+9xy_}4>oWis~-`-up< z+8V`1W6wtC-uBOJ)MRZ@lya+F$3-5D?*Z$+f%#WF3!f$(!nMhK9Krbh?j#k#K7+=t zUrBFfpY4gT%y1n%jh$0`cL{?`8-GxU#hbf_?k4^oOn&}UuVl$gq5fCX=;rq`Uf3y3 z**-bpgCQ^4U^V1S-UA(4smO%ET}2#{%@Ih!VdlfFSI}}WDpO>;uf3|{(86q$*=%el zMRlg}4*nicz!w?8kl?BHVQbUg*Qn^zAoQM4gi<4r!o;ZYXCvh564f?dT8T1=i57wT zy`M2p*mF%lIEXsh> z+=d^11zhbD@VjCSHqu=x*`qKfA6P}aYt8m{kv?!axYNsRL$hWY9nT)V7-qA#*jtJK z`DzDJ7pQc9Rmo5BO6d|t+}Oj)cs?0+9cQ+xA)&4+Q)Yer{obybdzNL-pRxIl-!}e` zySDU#fkRoP;k*J}} zh$6+|aoCVNS4Mz&8^4QiiA!HGI!w4aw}D&H^-mvon~p_-Q4CuBhMyUqVYHD&C*y<- znY7`_{q;`uO z|9-n|(8mqsLqxKZp6c%%_B!6xeX*gMi%Rzlo3iEgWi*uv#D2Cw~^eXSgCaJey@IfI8wiAU5diNHq=vYJ+Ma2)xn?> zzXv003O4jwY+04$wkEa~0HY>&(hiK4-i@&XqgWGBbRh~pI49gX6mE{iIJ6=^Rmv`q znEVkL#?=&$qYSRh;wHA28@@lrOfOh zr2-%q?aVW8^#CT4q*!ZO)F-tMl9&z{OQ{tf!=;7AmH>q+I%a-G>z zV+_>whJoDATn4k+LbAkmS$Q|6EoBL|XgN3j%{~<|JjO|R;EQRZ&EJcR<4}CB=nh=; z_ub_&lwBD2c}4wg`ni0wCnvh~Y?^RNf9A72J$60XMBV&xuOYFgP9Ci;+E$4aet(4w z0~gE@#$O#iR5d>OA?7_F{Y@x>hp6m{ytuXBL;l26G<1gd&aG=qxl;wpZ$mcs1~uFd}l|J8dy>|TPB>iIiIzDc{p?-nVTuqUo^A?G>u{YF{5VbZ;TGO#~Sc85rmRPwJu z=`$DdhlQ(O>+-->p)NlHX4T)H^BNfT{Cr{Uu$KS{e@l_Roe?h$S3 zK+O^RySI6;DZeGgQ!T>3KGKh0(n&gFFsatQp4j78%J=@ILf)Pa-eITj<0-&}6Z`nV zwqMzGz}&*)fBlyo84#pq#nM$TBSc8);4RyV6;$&4(=QlsdU#-zch$F|o@x`cUILsc zk3Yx0&lA?8N+~(_w0UV({*Y`Zyc^UY8?6VPxz%<#uKP> z()<~XirXI=!b^Cv=v2xGie%NgX*=aIXUDzeF{##}L8`X) z6DFMXXqH~WkNBh-k=Iq{yStT{6M5+Lqp`=0FrUmx*K-*LKf=2eREY`ybrnzP1m}Mm z&n4pZ6-IF#r-MH>u|GsvOHD{KVYTqrQ?MG5m((EEvx>b~oBh z&@tgV%Nd+20?XV-7{0&L!B~2^$O_7Y6ST>_3r5$=lf~8+;u`DDpw~KcYHxGQ!3;9? zRxCh#klr|!c@&GOaRTf@G>gfO1}-&E6Jtm|#1h0dK7}Mn)aI1mCiOPFVhe$oZgt6*Mn+&>KTIk4(ssyxO_*JkA#6z%YL zi3Y+;=l+1BcT#$1GxI%&lX%VdBEZp~8j2 zSpq0kn%nySMkmFL@pnGRNt`6f8){IAw~&N_@NpP2O`a@B6a9jROr}2y zbNS`}UwVeK?2Q5h-(BImBfBg!(5&SSVL7R zZ|&x61<4mQv8%Lvxk&az|4v+XooK|J3?)WNuYW(@(9ke?3jx>Kjd;WKbh0;Ug+Gz! z7Fk@Fi5#u4{d~VX-eN=&62bYCNMqi#Vxg_8&eXpTkmzK!Z#}W<->Iq~foUh1(eiNz zdfB!qYTc6_{+TDbs}FHJXS$ax!OJ+uX2$kemOoW>PXmJp34_v93lQ&a0msR8PN<#K zHj^Ag7?vWz`?sJP`2iO%^??UtRg!Okb;-^o=kLkf{#TLADotPR3fr~sU*}uXJvIY$ zEi1@&ks;C@cpln-B#fxiiYR{&mI9C-S9)=y_Kd9Z7a(Mk`C1Y7canHJ<_Oq3Vq1=> z0ed{UH$M*`qUE?JT_|Wkv7h7~_~#7~+EhjZS6b!|y#*o6nZE?b*`7h~i9-lb@F%Iu z`X;0ppz8|)VY^c7ni@)N-=J%ro_@dNdO=cMHE+=!(dwgG%vc!|V4a3g{QiVV;^t*$l$=R&8lR!*5v8>^NRc7rk+e0AVP}Ox6@D>#Lcd zp;`~CHG2_0qva2x3oSF254=KHpIAe)W_1F5xy1m6Al#ShI}y@zVMUaXE)1Il1a>p? zgFFV+7O=t3K*uecaN59O1|4|uNpMxiw2?H!qCTPB-tv{vW%K@mmg6z#`?P}?(QDi4 z==Ch!YOVx8SGkz84|j6?96y~C>TK*McTTz$E-Tn6UHv3WI&4;rht>{aZNJm@ke(a> zubpV+UGNkN$~1AV3W{X6ovlyWvK(qZ`h_U$VBX=hRE=oB$K>qb@8tfbf7MO-%t`JG0#)vtk&7{7sj$3q+1b)F-MO*0EvVH z@wbNZ<2YTOm3okVv==T+F;VKpYn{bMvrQ8$#271JDmCU1M#|1*f4CH8OIoiQqXiIE z8(ik^+~YxW-NTEF^BBea!h@Z)Q(E4@*V&A;$01M}+oU0qv4Lg1RR z{U;`CWWw2gIgHB>RS!vh?HwOfE$o<%ab#N?$kFaS(ONGOYnL)4-VkFSi{QsKz+{EnRrOn|L=9zDg|PUt?V7XmLB0Fyr}$;^|JyU|h6%mIKh$Sm=H zLj^vb6KlsgrU0xFSgT(SNb{oelmYOH?4%Bq2Aj4LZq?c3ag@hkObZZ_gBFQwc>#VyWhg0wyjKVu^V}9MqP>Z|0Pyb$=gI62|H_hZ5-D)Y z%&og7=wC0{?@#m?%BGN200{c_S0`{6eysvBBnnGecdLrP}AhPx@8i2)$a zq5w#3Se@H})Eb4O9m$$2f)aIG@!}+-R-gg7)~X@lP;58e(t>!f7bg}jFq}sSu3?K* zwhJ?$&ce+l|54D1kxXx{_TR`-k{;2CANCNRv))A!r zUcQZUcIIt`$F5D4xu}_NEQF&`;i)R=6CZgP9!;d^?uHxX4{yDY^Pq4rTlv5O@J?>V z*x%-Sk7_H*mzuQeBZjBIZ>5AZv1(0n%qFM$B`XF{O&q;fYC)}tZ?&(T`5BxO+cWcC z#xht8c|5clwii_Wv>Tle&GZ5|AO~}BCtR}tWiCZQe!Lnst&JsE*!1wziacWQ5h=#awwGnwp){990SRJY-GCv%~<^#Ffe72B@J9VOwtz6U7SBUAm`qpOovx6SNc-F08&{!f`Wk){$AXx)#_VJRdowP0y-SyFYMZ$(HriOt+f2^X}%q zcf<85^${JC9PKFP1P?=iH0+1EW?n2iiHk@Xc*D61QX8{jh=tdyrXZ>+IiH7%ww^!% zJ_I%~5?63hJAR*T8jWVQH8IVjfMWSV;hq%}^qM^K3u}mnq1wv*ehSP<6QbeAm7K>Y zoZA57C1ZsCGF}fa6~LZxsNEqnJKG-Tmd&~a0n|QHY!Wj{d#KS`HMi)rNfYOxm94*b zv;|?)sS0*_)kI)pOcG{$M-62`LZB+58i9c5(Hme#g2&bKbjo>wXF+FhhPWL;T>mc+V2vv!fhR18i0#1ZX zIt5GC1x^Wq7{*xWgND>Aa=>e>J|My$0};M}i}*_xfsq6Vy&STdF9o0-j*>?-O-<2O zO;84{M65;LNItTC!f|-J`ZR@mCmD6RrLpp45EtajkH^GCGwpylhj7eib|TP9t~ETA zE)O`Z4H71{mcvm(Z89oSNhqC&ZTJ?oc?&oHoETK&wiv%-UrjZCD*H?2BflL1@1lu(67(?6ob5 zfHlC2Fe+Q}GtaWzB!y!uG6J80%kDra{GkacEm61B< zo+G*|plVuRBohKeKTz$OVW+k4&@ushrsj^v4d`;RL&wdWdUUicY$Rj6L0w!{J}K&l`+&cVBT>YSS+L^^G;fcO-mOL zFN3JYhKL(@;$)#LS zOcSH&enBI=A!&fVrE*zPWTs!L7LSC+N=$l0d7cg%YWWy(1j&u#99E zxqGXjqmdoY@#^~56Xz5<1#JVEPu$lENG%ZBQXFxS7O4B`WsI}9M2rP%N2QvRMt$~p|Vq5HKRtrOEUdwnv5HCA9AV@=g zxtw4WzWIF1mG~r@i3BjpWvHqDb=|ZH2{1dO2TWUtVe|;ls?xFBopbY6TGiZNl0dMx zHnJ@^!v7E!mO|fooMj%#D$^nfP){#EOQ>qE-tJSHrElyfTxn~;=V#bYNBWhZ{3FD=6T_@|d-lM&Qv8n?pMl z2@PNPI)?ghIK%FZqs;)AHn4`LACJgRT7CD?`?T@mF7p(NswcK=ATpB7lB@oU)3xBT zfBm{Iz{oOs!WBPf?TRBDGE2M~kY9Da!$uSYmNU3P{}`N<%YdZg5(-<3IRfcfOuE|rPaP$TurJvrT0k3=chEuP9L@0*J%)s|19`~ my?_^P>*_R6tdi7Q;X+*lcq+5I#JM2g&)oFN`A=tEqW%xst_L#! literal 0 HcmV?d00001 diff --git a/QuickLocation/Assets.xcassets/Bubble/clock.imageset/clock@3x.png b/QuickLocation/Assets.xcassets/Bubble/clock.imageset/clock@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9bdc11b6273497a7ac22aa304019a30e7a7e7e GIT binary patch literal 184227 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%0D7;utIN{Q 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/<1*j+;!+a=Kzale*hvsrSaQ_+M2jV~lIpR*XI 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 literal 0 HcmV?d00001 diff --git a/QuickLocation/Assets.xcassets/Bubble/pin.imageset/Contents.json b/QuickLocation/Assets.xcassets/Bubble/pin.imageset/Contents.json new file mode 100644 index 00000000..658022b7 --- /dev/null +++ b/QuickLocation/Assets.xcassets/Bubble/pin.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "pin@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "pin@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/QuickLocation/Assets.xcassets/Bubble/pin.imageset/pin@2x.png b/QuickLocation/Assets.xcassets/Bubble/pin.imageset/pin@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4d54ee34d93723cb57c5573a5386473f918cff81 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6MFBn`u0Wch;XlKCAbJlXSAAjF z3?zRrZ2Zr#?mxqZ{|sxv3?Lhb)_@U21V{q8K*6$e|1e*XUB=kGs%=g>T;4b;%? z>Eak7A=!HHrdX2#1Iq=+6=yVh#k{>H&-wrVXiT4bWBa?KN}(N`-pd6oC$15!+`L@y zf=mcUMBld$DRXRC#CAPeW5_i*`K)RA-9_n=zvLRGY!sRxtIX!`ZPEF=ENr)mE{X|l zzB_rc|GWg%Ov_UbwJkDOYA$U|7uYqqglnO%dz`@OQ^ig8b+e{R8%;}zTL%g`Pgg&e IbxsLQ0DZBWs{jB1 literal 0 HcmV?d00001 diff --git a/QuickLocation/Assets.xcassets/Bubble/pin.imageset/pin@3x.png b/QuickLocation/Assets.xcassets/Bubble/pin.imageset/pin@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..adb4c608a91112c67f6d965d3edefffaded628de GIT binary patch literal 780 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 cL_t&o0J4n2j~|__#2v zz!A{p&_&R?P~+{=M$Fl^z5Nn0Tmw0@yd1w#XQPcY0KkhwCsVlqAC52Jcthm`Sl+II z*HfT6hOMB0wF3>a0{m`Ty9@dRv>a6B@%%6O9*6!6{S^8p^l@k#=ylLa&@#{h2^ltS zJ+60vJ_(%*S@vOk>#|OQrB2>fCWmd^0RLM+4mCv8=V}8Q<`#fn4QsyXzl!geh&QhL zBRMXGd}-~5zX`O_lqpkoflh<2fbN8*LytmFCuG>Td%3;@ItEfp*@*I6K-P5>{>9LA zsETt~`z{&JMV1X9Zz`AlyV`(;mG?mQLbV6q`dpT}Uy}NMXfx=8(1`$bCG;TlZ?1cC zmW6%=T}cHFU3=lb8M3XL@yBy&B+Bx2GO9M>_3!!unmg`9V;THoVZ|5S8u(>(K1%wH z&=vr(HgrBDu(R;z5MQgK&bg3v+lFmzOau0I0slMUm{W$Aka#7soeC`t^`(PbA@%j_ zUQ9{v{9*WIZYGK9vOD2#iSXCqPl!v}c9P_i=MyMzWxO0fqC=sw670?O3^aFG9r!|; z-4rSt%N!zhCC`2cc|DX43&c%`gNK>WwKTprv?Fvc6m!oa!6D?rL}o6#cU=QbW4`p> zL{m<6*T)ZmJeT+x(9sCw5aHPSB-cab;Oz;>r|S(crq<$cBJW)0oH8owwaDMoOR{UA zX2UEiS}0T9 zzD&9x--rOUzu>655eKhNQStX7b#i4O7<9^hUV=q1LnyKm&{V2+u__g)S$J0ocDR2K z^BL#>m{!LPJ%S_;uY+&3l)u8EmcY;A$A&wf=8M2(Rj86SQVD1pd_H8uufh*GLDtlH zEX?{ChVqO|95N`6lO3&!hC{rIg_E;N)Ap)BA4*H=pS~0b=A4Y|L(JJQ_yqo>aEUB- zE@e~3qFiF3#?TE#+DR32vW_#%Q+t{Co31jm}6WnanvsonViD=w8p?b z5}Y*u3Vc-LQlKfNhH*N6%zcprd-9|M8M#_60o%!zD?qKdz(4IYuL#7aQBk0|OIome zDfkjh3uFSmnbngg&2W*CEf)lAWjuyRWyb4pPS^JXv#5Py}Q3}qLCtdL^lv|a;QHa-oTA-!k^xHG;lnJj^X8;z4)6XS%5d@lqLm+LlcpdI@#9YT6F5Xq5C$~#vz6mKm4~3kQ z8DE?oX&pdwM_k@vsQWW3Goy%cjnWp7{CRTu5UC3o3UUwD$+}wiqi~|7| zFusFdbYizTkphl4&lQ2T%R6+;OP&8;^Wg>bX4Rbeu_F}XX?60o6TZ8f`sN%goUCd4 z3B4G_QB!i-P6{*(s9_wOrsMC5 z<{MK(3Be9`5_d2(9(80K(ufzpm)d~6xi+A|#MPoxs5|7=<_5dDqZWk zl`{X|%~a?r#Qc~M3L)EbU{~XikFs+5Q?b~L$o76iUo2zT+uZODv z*Mg7>)1;P1*98f-oXb|NK#l)Si`1n-PHa=4H6E#P6!W|B_GtX9Z3>i}9myy(Ua*6nidy)@_K)#kg#G zFJUpdJ5W$e*P^{C-t|SupoMPg7=es)-FT=0PIf=WE z%ESyWb>iz2w5S15w@0U`NkD)fV6Y!4n+71ORcMcityBy2Tgd0cA`!Je4~$%dR?QQ$ zVrA~$T3n#DJFD6iGdMYUs2DlS*MR3L&`03$T~N#^vnEYr4${efla?W9F74Pmkx#;;9_wY!lkk5}9 z;t;*ro}<2O$Em{U{*-xVm5f#LBv}16l6N(MZs~b}41Wp44P_L7Eem58K&wDiofDZe zDeDcYT4ua_Di5JN>j<=uQ7G{@p~zv21E@ve$w`Tu;0bo+9H)<_j?mEARYghW2NS>O zwT2EGD<*gydkjn)CUR&0o-ovl7NG?$q?S=#PtILVp@K`>qn*8k5<}*{P`(L?qZhhO z%^jX@L$gZg$?MsfQ1S`_9eYF14wV?9I42|8VY&rb+q#EI zw*%lG)+|p9vxNj&1wPcCtKFga36G;U%k$AN;;aj=vQzzX3x)epV!f|&Wr2(_%$5@9 zK>p^U0LfFdOX7Pdep&n_ps8bH)!HPlWATT`?WChB{|*h`qRg7~;yWO(xg4C6(db>M zn+-tHMCpzn&%Joi^V_s>9^_XERwG>l7nfm2x-&mFi@Q5NoT)QbtC|~M_6OjYtevHL zi}6Vdm3&N~qvJ}bL@#jwv?BBk%3cP!T;>eU)d%enuDZJ^Mc~IX_IQjbo79bDeGS0v)^4f)Xm!ZJfi!@)ZlYw&xjvh4Bp#o~9BV&fiFw4A#;wRKFi?c5{Gp#^SboF>o) z)HPdNXa2dwe7Z5rwSgdcPEWQUSax@xICS$oAa>YV5$H`iSk3oxn` zbY>gqkfqKyy&rn&P_+V;bsYsTPeJO|yHHqt7q7B&LE=l~-kCaF7$rDyj$y;j;JT}r z6&dl}F-xFj^mn8dUr^4%Tz%=*XhT)i9YDFI!Eb4F1GXyQ;gt2fdG*HPIr~i!V3h|k z%hn~PuDd=t6=r?p+|m?USk##ASe-3gdl(+P>kcFOW%a8~_(ht1DC3Yhxmo(gs5)=JF$bC$LvchC)y znds(%FzNU0F2(mVZ7IXewb)(FVBzFM8%*v{P*RJ-Uk=A2&@NnRWeeGF-Ou*cq@riM zu`$iRE?^X~5Ia|n9P-k%9MJS0GpRxec$z5*I3A6}HrGauf|UGA%DQHjLNEuDMo~*Y{S4Ma{Gh9l5j)pp#TrDAG4( z64&Wq7&?dcs*1c9bkJH2(4L%&$a7o%xTJBw+P{aTq- zJ4378zOWAkJ5|yS9D+b6x%_~ji>fN#NmR@8uDSwpJa^c!suele{~@b}qvMfN*~Nfh z>cq(36mZy0BeQ`h(A*h&vnwLM&lbppHQu`uQ#B_OJ^6xwtc)%WD|1LdEp+bTiynH7 z0-e<6T-_!9r*tj=cf!mbo(dbLYW?vL>0sP(K^ zi;t6OekE(tft`TtSw+_^Lz6Ylwtm0lDzPeplf5nlI+M|9u**g>R{P?&sC`*WxeYXUQ zP92&Y8B|I$xZ3VgDp`Pq-yU2S{9%WS4&5-{V z$m?RB((A5)Zr4U*4kLb$+n+&F&1okUeT^@Ed&r;6^Xpk5i&wGCSd$R|yD;RJa-EQA zKy%A*tVuytq zOzc5>@`e|6t~&W+5Xu_OG+shqKy!!HM*RA@hL){p%;~!Geu6>gaNDLhlZF zq{4G7p+`1YN!3W|b~mbZ+lFm9M5z1v(o?&LRizB>-cqwT3OQ#$eJu+21$2Q+hY;_) zs|#AP3dtRp0`86@e|*NzBOd}Vj+ZaP?|C8EvXH=fX=Ef|m0005NNklv_K1vQ9g1!FS)9r+8N;-a|v)FtrwSau2h6WWv36 z3NINp?#JZ!hs12lUT9el-&>b;l3eQK&E+Rg;I0q=tJ%YFw`eA&3x6q9^9zpOVt7D?Za)mc*6J*`Cq290F{CfCU4{{Op z5qyV^Cfd!_IS`<;Eh5-#$R6e96DJMovc9yOvfJD1czm@sT9?{`Rz=&;EZ~pvxb-c| z(m=uk2f8g4V5@_BB*Jw`hZfDS9*Flut>4O5H~093YNPwN-IXbT_E5>NaRO={KfmS{ zGRwNT#k#a7A4gl4L$=kIF5Kq57yo|%009601C}Pk00006NklxI&NzGzf5Q8lyQezCOW{v&kofwwqvY!u|vMKkNYPFvby#;3%GmY}-52{r-wCHr5+xAlf(zOZ#Obglunn+($;gohB$Ihp9Op#@ z^C3~{CTwTH&V`);I~g_xHUeczo5%>fXCBK~hjnM6jBOv%eX&pU%`spci(^hF2DD8~ z%Ea9h%nMA^Uu|{FI)UJnbS941f5Vx=>maQI z7D;O2pdIv;KGXLmj@!^s)(8aTOa)1=;*_)>$Lkplp-)mJrDo7~azHL@aV>Iz;5a-U z(`*mO`3Hn?kuAhThC``~$OSneH<96R2aZ%AAmKV3hj#%>H>?eorUC=xqMO`kjtY5^ zyhb7rOrfX3@mJt+A8Z0FO~W%lZu-a-IUBx8xVcRi2ps(l4kiDDTb-~pHO4?EIn&%V zR^M2yrU}Hk^2*WpB&^5r_0Mp2tT7K-r6Z-rk~=J7d&y<9+-{0MAdJ&x+_<;l6t8Ds zlP2E`C^e5RK(#W>IZJ8DmXrO6BfQ^=|2)=Ym@dkIw_aNuT) z{8D;I0Sl%R4>=+)xg4ABz0_Z50s-**G0GD#K3joJnnGZJ+&t;7*o=5g25S(wX!bs`8 z6_5~SU1>(!4> z`6F&j>mtt7t-%V}>;u@~V}{qbrjt(=x&3yLRHxG^6x_OJqxZ1$ERHRG5OmN??bMLo<_Vm?G5?l16N zU9Z1blz;zycrXth46pBKdcN9?eZ}ZQ1S0wTZ&713EdJ@xA(1cwN#XtYWBmE4^kB3b z`-?;J~banBZkPFlraAQ{V#TVuQhao!iDE;&} z&DB7uZG}K^-2?Z(OJ&K}3FFfqhUjczTd4{SR0>2SF*h1Ye1{Rty&Ugh&5Uw>_`KO1{0)4~yf zi11r-Ho^^tX>d@4A_>;Zk=7Ik`#h49#J!Rhv_SN4N;nQ~dnVCW_+;`hlkCF_$U=e^ zv?j2t1tRV3({KjEe}sdq1SXRU)#_qP4sraaNYn&8DhNa*{dy? z;>0qvkrBuFS)4HY#%kizZ$f0g9f+VIv_XNK7I5fzG&d34R+~W_=d=tKs1xH6;eaSj z1lPnY6wr;PHdkt51_Pc1OMc@07~W{}>nYpvK8)Y?@oaYz1u{OK*gc}=4K|9zW3y6q zii3TWGFoD1JOvWqEAKHQDac`_)ebL(&>lyDj4AB5z-y3&Y7lY7m)bED$T9K7?-6;B zSs;kGJi@f7`Y}AsP5xEXBI7}V>|+Kg4jbF8kvPps*WH| zB?l>x{c%DZ7^|Pzz>lZ`1GS=q{S?SvE1)zBgr8uy?hLY*0{OgIv9V$tKf(4h>saAz zU=W}4I*9S#G6)PS%no=zhBw|C9fNgwAEwdzNvh{KpJs5H`*D(ds_P4HxKSi^E4mdZ z4z_XMw$w(ck13FkTFPlU`^hJKZOlGytm;`{M{Q(OU*8YnID3-oXBE%Zt`+&H z#?h5!Jv}0=y8eJBsEv$EU+c}I-+n8?|0vbhC&G2c4?lnc;N++M;{eo9haaM z+-OY{1>)hLoFJ+=JG}Ll$chyrOO}Y-d~-oG{r!UJ)x4we>QQT=D3CYfg*`>v1O~Jw z3If@)X9w0H2bwTwIz${8aGV1|O#rJFhqx=5ha1>cOrjrx9O&J8K}@e zr9d2KV<^1X+A05Q)a=#%P1T1hJz68oV7$!7lquMfeJnRw`!J6CY7FLnQv5@B7osarYr6%I)u_7#o{5r}&F z>3yj2JS>@M=FHkN$I)JMCSjYS^ON`fc{lbIo(&O*F3snk(Ay-wOr7f8D?e?#j}mQ* zDls2cAZpz@E>v+#Gg{1{jDF&Y-n;eF#``Eyw&-_bJ_N(C0@1aUdO&Z}mk=4Sr0W{7 zt|}1K)6*}Gqi^|I;)WR*e!e*6r;Qo3;rD_V>sVJAsj5J9eaBg+C{_-W&P zlxSMiiE&MVsI_aiVitKV8ss63x^=4vA1`dQd)8%}M(f9^p5wfxV_XAsO@Zikj&mEf zIao5%{{12wHVA}Y-yg>*)McCcwc}PJ2M!q9nz-u<1PbGvyuM~HaVzBaV%DvzJ(F(+tn}3brUGK)WX6?EH(XI3OyRiKVmYl@EFIy(EWs3;EoSnlYN#j2ASjIZZ@wnWR zucQ#u^1Na98xjc4k@*u5b*H0YN3c1QhmK8~MDD#;WYMC6ai4iCvl)9ZY`3{Ft=mgO z0%0#|_3CG^#m5b=fm7N+gbZwPW7!adh6SQ~8yM)u!sZ*jpT5M80mu191_!&m0QV#i z)!X|C1agy?0n)k_G2l2iVPX1TFNiz|gdJmm=dkUCr72zv^t!S0gxa$}bnpB2VMQl9 z^?v#i2L^UZA!eSj`VxqG@kKsRGz*8DbUosk@+LRnxjWSfds-)0pLk&SHRL_7XvHY z*aSiqSRfo7K>mR9>$TiZ%>o9LTBBoP0E!WTXdL_Z{|?*M`r;KFwlHm!y?bvoh0B;g zuu9I$?%i_%EENezh$wAj40J3E0Wc;I;?ch;v2WkC>EVWKG}&-i!L^QSbqov+ZB!t{ zMfKu}9k2JN3s(}-99yA!db-KI>EVnEqzKSmB;A7d1F$rO!vMLx#pODb5keCP(E>P6 zfiG*|iYu$9=7oX671GOGj=i+>R5w(C5D6T36<70qh5hv24M;GQc9K)gt)UL9brZTk zI4~Uf5DTbtu%F%q1_=REFS*p52JEPj=1ma@fnWi32u{t%8O}B7A%~23G#*k02d^QA z*XULzOegxq*-Zn}Qt0x3F#DfB(HX3fPQrvpMs-meN2 z9j&%?oHyw^IUpC+sx>>`8i5oY2RU0o(ywuze5!S6jWZRv<;fa2(zN66Z@cdkXTF!1(i6 z*u*js`x5#>pXi(IURW=XB7yt`K9Kr2>};%2rXc@57=QQ|8>iT{j84|^8&Z`94f!b&+khU0K7j(H9-01xl7K2B_54cx4LtrdtL z0{Ao)KB?PaD`9hCzrYN0EKVQK!kNOA=<`kl^eJpN!`_1Jf_(-%2pd3|qfLa*Sul@f zti!sSQO34+>b?dC&tl&k1IDp9<~CwLUx`US0RRC1|3~`m7XSbN21!IgR09ByeF>;m SzNV7^0000#qC9`<}J-iFM9i`#fjw=ZVqLRwH>t_XrCMi$p_RS@)qG{PzLzAO3P|FOIRW zKv){e3i@xc_sj`DP)%mtc|2Qm{mQ2a=;ENGSodC2^;aXeVOQ;z`01GPTESIbd?*xK zICR+Dx#8K;^6$Iq@`K~$`{0ZFou$^s2JjU%H%?Wwm%}gHO{ZjeGbc1`5s3_o=}f9*WIOJT{|y`A@_oLrE7X%qRcWqA>kg>dx>g3 z0FN!+Y6)%OX%sW{`s1y+tEGuqhv1ycA#TT6dKC}~_-t+1^S%(oHLh2O=$6Ev-d1b2KIR1=cPNiD|8LB83@d%`Y{);vIQM{HG-1k;|{bQZqu3&NP zpWmKKemaeSvDn)u;>R2_dGYI`Nvi5IVSY%IA6;jwsScFamT+y#m>$aOhC+QJQ6Jag z#L>(o4{b^1BneH8M;l+^&J2Z1vvwl(lMo2zB8+sO8tWnA8<8*#IoAs(BDW&9hGf)G z{li>WB3pwJw@)($Gu4Ga96*D*H;faSJxQA2%UMP0o>WrOEe{0`jkWjqlWpiFVJCei zK!v#(e{h;tMWwl++&tX&Gfwdl&=5g1yinFyQs@os!P47x+ZXlXfzk-4$?uLoMEi{T zSk%AbqvG9i)16Lix`Tmp7ppX=C@f@c3`W>SeTIp8h$BzW24snyDPZEBl zC%|8tlM)|{lt5T zp^km3R`Bkg%$L!@Ntt9)Kx$gh8_U82V1!doi)Uyf#@-_1MhZo(_|~9XRf!A`JsR1O zkV*DmMTU(QlSzjx`%^Sp#zuE_2YuRM;D zC-WMq2!kTgr*XJ4( z`!i-x5C0Ll!!b77Lgs+B3%z;N2Z}~`f>=<7MwMYL-LkoX^RRuQg}+~mx26Hmg%}EY2qR5g*|fP4-JNWow-djg zF5CQCYsOrgqjPH~WxEe-V?l~6~J<|m5G2R69j_X(4ml6c8?_{~y_xGonY zx>|PssCwket&#c2H_Bu}RxzZLgc(~Q7=Kmw_n$A2+WoNoM!FfUUWY48slXKymNC&& zClpi9IL*VQsn$DPY}u~nb$(^FMyJz`AJTVDdo^?p#qm;SfI=!Q!(7ss*N}c9M@)}L zllTCL`8F5ltHS*O+gX7aR^lObaP6@-f$E1toOM0cZ()dd1c0rhO)3r6FKf5VSxi#P zMQmtTBQ2p#M?bwbC`y191Eq#n&lwYAPcuf}<#x8&G1phe*(EBONWfzjEQn|0gjo-vlup-4iSpybk4vq)%m79o72Yq6B;oA6dc=A4Yx^(^+G-&((#KMV5WC(S4srN zJTTRh0QnyT5ZIU zDFbOlm_8f3z*viTz8g@`qmS&<=f}L`k9?G?u4P48o}+#|AsJ;`356Vf5**>e(2p8e zHb2kTHa05Er@WYRAsATt-n6n7Eb&uJNt7E$xnTB6`TaHZ*F;FkPhCHBbCrwjioEQc zFtbA%xB?kvz$^wZyHI~I{CixjvRZ$(t(?543h^SxUk;KowxnutR;G`e3G3R`|4*A@=(9{*&9}3x&=OSbC;2|3f7k(lGspc z0EX9aJfM>F-BU8pyq|=6B?^uhb;yTc=Ddc}i`u-hnxg zA48a=-%``v^kcaiQk@|~h4Lx?rks@ly`qtjEUE`5&&w&$vC>h7X@Uw!M>C$-2UU=p z=MAVT()@>zb(>qP*$D*xE}U`H0r04Xw)x5!3?HCm4QgA*9w~AmziUZ(uJC0FQxz$Y z0dd2egsnPUcU_>4hs7c~=+m+HZ=1fuaH@>ASQQWJu>d56ED&`DhpLfj#n&N5PLA-^ z)RKeKZDw3!gB`}3&d^;8b>QcGppi!Yr^85nt>|iQkL6&d=sG&YZaoxBL5UqGYWlw} zb8axwd}sIIPK+ib7L(5g;=rkTAKP(JNs7?%Sb>KXnjQQ{qF1YB<*{;AsQ2I&Vr;JU z_f2*|wMI*I0!Ii+?Sq7Cu5dVz#I)YBd^x16SK`kf zyi(38&zzh8r@sRUL_*Hzb$b@@2mT7-x;{k18?_aq7sKxLZL~>G!^l*xF7BxxBADer z{dhJIF-{Nip#zDsN>B6h^26I(T@11~vN4Qc1JMI8srACLCbh4r5+O7P+HfkO8n`rQ zURvSP6^j+Jk4!B(*E77YRE~dajLrLcpN)t*md`S8DR`ZpO>B`}*gdz;tGD>1-i+Cf z?ln1fFjUW0p~q0mUNF6o4L#!!aCOm6OO;DJx`G#$3|8q$q|S=%?s|8kT=h+Ny%e8w*Y+l=6wS!%^*0PUWMJ^S7I&Gfyrb~be1!J-4y zHVXh_IIkJi0fiy(lfBlJ-Fq%K>jspUt}T*-Zy(tYYhsq=KHeV>sMrsJE{~#Az6kQB zGJTLQ7`@_wp_F^9`?YJkter9`9xFzjd@Hu0(N+vwjO4F^YAIyki0B#^b7 z&ov0_6bDmP1BpwAO_tA0*tqfq(K9&;JqtMI%;ApQ2&___X-h$2f7e>G&0;TGN#>?+ zUox%+c+C%6$WoL%&v6j zH5AY@67^M(dMH(__$F^}`jAiGpQ<6v@=4?l+eotDH^_{WkCA#HhDHV@Iz$BpWZk#PXz;g3_;~#7ll%Fi9L_!VzQCbjc&{S z(>TaMgHuK*Uq-sAhWX}i%_)iB(Zuvm-0Gu<$)MjQpPeN9w`<`Hn|n`qnAp=S;=sgF zHsNN65y)<|r`T?G$mgdy<`|PBKN}QL@hxkSo>?8AYLZDmmPPyeCqz*Mb$nX7`sF{S z!3I{6)u^-++3YYnwXYP_UK{RD2mz*lpZ-bV=h2|K=%F8uOdnu{M$U~6 z5FLn1hg-Uhan`E|4*v~&y&Ff~^HH*q?BqWQm1mA?P{3dPKdazHEjpZ@!CG0%u7e`D zLW_t(W};1n0@)WB09ja_Z(Lc3M`$D0nF@bjCDc&J^}1 zTWFM1EH&V7wFu_=-HGI-_2N@KamJiX!I$frEJr=`9K!Hiv;8Y2cMJ9%^MImF`MjUU z`_fi!GPcXlvC)-ZK7LGai}V56ap6j~#B9=stzrMs9kF()OZ;ty@Cq&q)c;vbuQ6QAu; zJESLK*5_<$iEchH+8BAog$=L_XIQbxV%&Nq-gUH@1ov5S9Ej`ic2Nn z20SwLujz`gII1fYENrpHxux)-a6w%Qu zvQVQT15XAgvK!;i7~Pf;V@nD!HVgA_rfmT`-_#vzIvtDwiTgY|x1?WWA`q1=*)J!V zLx2rUaSe@^yt_@5%iXi>%N|brhQwhO3pH>rQ`44BpkAdB!&r(Vlv zLT=BD&^lmMk{*&5-t0;=)0<)BoPA51dIJhOyu~iNQ@RqOi*h&-UUCQqGJ=awB&Q6d zw7^jiCC;~_Qb2KaCX>a{?)#f=P`POQf_R>pm+ko;cJplrgXl4uIp;GRFhe`pz_){k z0LU}f#3XD2o7ejCWNJ||{Ju!W#6qgSmsmx`V@cptiI2^Q>oBMp_OZj;zgQS1 z1gZ!CzF1eMFkl;sPn`DR{SvAb6OX}HefB2SnO)188DLkx%M{^c9HRD^X#?+9birwP zo&~U>F$NA>9sck78|LuM*8@a&2hh7a8G#VeSq5sjM^|hHtbDzX zwLB_+R2F%y#OihL?3V7-FttzLJJ7a}dTEweRzIfq4<6;fqzUh=hbzvYD(*Ug&F)R$ z9$%(}(eFB-0-sb-1)krx)H@`)r8_(cSj}rJYK%bwWM3=&f!PpA#tPNM11{)X#cQ9% zN!n9~jPNPL0LHb7AN%Yt((YJ42}Y!va$_#8{UR&r+K$8srXg3S7L+4C%D^2?@EP3C zgXV$soBYhJ$6B87Rb9_Zj_dRSrk&lKA|WW7)u4fPKMHOfwKK%h z@sv^xF$h(m*WUjCp;Ew9c=9y<3%Flxk6a3mK`S4S@Ul}s>-66f3DsN~4q;nWl-Qn; z`NnI&@i%1x{D;_KEUNek`s~Q49Z{_Upsz-Nm}+M5?YV-Rxy9d4i=znCb27;wjz({u zbCiIq0Z!p?ofN>#tILmc#bPi=HqEit8?^FED|oIkSGeV!abBSJ`kA;H0QoM}%*(T9 zKI**?**(Fy=lm1XeY3^D{l=ez>+M^g@_sfrZhMod7o(DS6ByoY$a>|9{p7E{gs~m< zf!P>1ZYUjEm~Z=DY4Gbk#o73GZ;Mo}g(hyOu5>{pP;f_SI&)y3CI9k$8&HiVq`2`z z2tYR-yb^1pY=&7K6BfLyHO*k1Qx1+YjO_0F!Q2H z{0XtmUHHC5G=dwnG71pBo6pv+Twu0{cVX)N&Qx*@>~aBdAHX5>iWeBr=F zdcL(awhki0VAK=Xg_ zx?MvV`axT8inpWHyml%=M6AgH`}1?k;*+h{?#T~nto;yWmWZ0|wr+B19{H+FhBa6R zXkYeI7U-HPsx}4}`ug?TN=V(S=kYoKN^G_xTLjn%4Z&}^4Y6+$W!{UUF$6-R!!6r}l@S50C^w11V)+}WWm9@vpe*}+&T?=j~lM>Iuy%w92j>(mA$#lvB02V2t zT!Ef_|NJ4>avJoi{D2$hEWYEU8LFXuT9BkdQ*Teg+!aJu#`sX-$;&(}GrH+C5M#k@ zOV-mve?p9s`d6C;s#L zBpntSaUI)1n&bfiik35jNWjU{f?l9XCV3UzJWb?-8e zLt=vz2_IX@ZBix+2C?22Y!+w4=K7`pV}6LbzZ-lj8{Ho?INYE^tXnJr-0L_al1QR} zVgB6ZI@Sk1`|YvoU33QF1`Np<+Ww?WJ{i(V{hVo$5_OrGzZttZ*Ei)=V`>JH|NI%hT$cEY$bgKwCw!L=rKR ztI8c40>68&B}!^OlnVexHmX~%KvkIu!(=x8T!JvM?USjC6L#Tp7HB5$Qic)(zQ-zB z^E{s|7CicHfF6y!`nEM4v;^`rzq&e%vlGyyskc_42G-YP;=DYG?r2~A29yLyBT$tH{Eio8UN z*6)Xvw&`3XdWYHf*E!}fF%bJ-+0V@eDx;paT_naM>d0oE962mM0JeXGbBVkZZ2qb_ zit`;Ca&mm)RGhNi@#3sB2w)N1awFWW3HVxVWZsy&)hhT1Hg7{OL(#)$eEfLpUBKIk zidk>6x2t%`u$vM;_wYoUokCe=l}7c)I0-&cXZyJr#i%?&B|Q7f<6h78{nrN-8!S3I zM-NZ)-BHxf_O{{S0bSCwv~s=iIIz{=r>WAo-#<0^;~*&8fD1AC?0tXBkZ<6Q*Q>wf zsGVF+EI2KP9*}mYuq|kt?l%dx4T=ahYkH7pwn?$I@?&|`1VMyV#>C&cP7)?}tFiHZ znL^_dp71YNzD<5U=3#F?)mB=5D;rcld3QcL zMueRkD8&3wo?kXP#XNw!aZH&IOkAvZqgD`|>9^ZjyXHgMaQ~!;l^`r7ihN1-*3iHEmh$tN((4CK$q6ZNVZR}sX$x?@uSh@BV0PA!@)>7uu3Yg943uf=9Y>(P z+zAEvR$l=}xTqb18mwJ#Sdoou9bxxf2A0@ZKssx9=&n0jAK6A5{W^>czjM)l;fDoQ z#Zu_M-Gp|~8!5JRUfIh}0aR&Rh7T6oyV5^zcNsh|IWGa22qO0V)Ua7HZm6(Wgh59u z$3NtJMpi&t)%Vxd${(OfV-gw1Yhk+>R(K@Da2@m$#Ni^~7{R6(N@_56anSeIx?mDt zo5qAdX*nH%sJ1Se;r_@iw@Ns0ahl#uAi7%5}EiU zw2csUUhP$24P=CnU6aZ;%O=F*s}xuRFj}O*pn)r+?j23uXgEZ)lV;soir`odBp_q+ zNrCJr9t#%TCd##L+D4V82N6b(aQ`X4{j6Ho@){#;9>T+7wzh9kD zX?Jj}c>Y1w&`jD=6W=n%p?_c*9RPm?jqa#rebdf3hP%W2X(XVI&*|n8@GTQ>qgZmI zto8C0OwFI*oTf#sNTpViro9o(9DE=vU#dl13dsjkthB$YECRlj4{Z~cT9;y~Bgijy zhC}uCZhS6}`)7XF`4FHUo~|I^p2`MWCE_JYHX_0~vYZ?dkK$#xK8N8=ixQp2V6hdY zL}DGT#PM~&(yNUu`!$hw9WiY`+n&umJKfs)k0UJ`G2tJLuM!GuFwLit{>!urMwZoe zg+sbR1Dt;SOe2k5NA{|p+(%b58RCxElF$NlrwCSvP6@A6Iooz}Wo}I~l}IWD*Qn?N*jL^(XE_58sEXs@;G5 zcXN~UIa~t3(#~&}F4#^Ihn=sszzc#sCShS0tvR%STGqXqZPIX3vj+MAb%?U0>CzTV`8?56ICoHL$N z(2{FqDml)par*DCMd4N}F6jCa=ZE*W$HUphI%&?kbF-GA5;7~lG-Y{ELS70hzNlokH|0Zgq-2`7 zPFFg`#lQ-)UsJ=k<5{*QhgYw*B)eXAq-%YY`w_fm=rMw*!4L{Mt@V4E$-viDY4M#x4|Q#KiWz3vCr3()*$gCpk&EDGB+SVscBP+hmLA{IipH*G z;e0l0ogc4@-oSqBFd9MgE;zA%2WAA#iR8zJ`4H!p z(}Ak{h1!2eLnFR?p7P~}YMyc%%$#?Ip`a$mY^XR^>i#NoFa);FefpB}{@I3LQWMKf zu)(AGX26_cjw8L>=da5R|5x?&Dsh{inQEqCGL-rNkqzvrG@VW;`?>CkG8OWZuxxD= z=r9gs)Bgo;unyrUd7cQp#z|;WENYgwXEb&DST)dUShQr&_oC}%!}A0tnC$$ z{7Tq1{kafwZ|RkOhnM>Y+qiaZSJ-i+eJ%XbM103?Y{XNx&*!=OL42=2&srNkV?|9n z*>#ZbZ##y2syd=N(m#tcB@w&c`5u|V@$W29c4h%!;Y#$~bW(`3>cuQdz(%0{|4GTU zjcMS=vCcysU8Nz$?@EzvW6ZeWQK zD@*fuy*C*}t0) zg;HfSh3`zLlyaZvbwKfxs$*K2Sj?eA?UoOwajCkO9NO|c?DRCYny<{kUxc4C&wjZO P=q?6NS3j3^P6|k3?#4J%UA`ZdINkyT!Hj|I1(5Cuc!B4OY6U! z+QBS()NKeM%L*(U}DMo~`}#}JFtN3VDmH5&-91~4B}^GRzHXlZWgol)}t zaq49=-w9j3-Y>nrI3TcQuAhAO(>Bh9%;~;z7R&BbWSVnvZ(($;^ADTGBXr``5>1$+u0GizzI3JwNI7 z)CC)h8Chd`j|l|mUGY$9kdjqun86q55Yx`)(9BopAfo^N+;#nVk_+xmK7Ias*K@W2 zC6kkkt;$h$uYYy+i!c;fZ&`c(xm54k&sq*vt1ryj%l$C$>gy``sSc%YB*K@?NJ-KB zp1M-S{%6SF_1={(t+g3(ci!*&;-l=@%xj;0|Nr3|OXvMDGMKB7FCnkt>2&?qougmb YlV?;&*iH!O2Zk+!r>mdKI;Vst0Q1S?Q~&?~ literal 0 HcmV?d00001 diff --git a/QuickLocation/Common/Constant.swift b/QuickLocation/Common/Constant.swift index b93ac3f3..e79de600 100644 --- a/QuickLocation/Common/Constant.swift +++ b/QuickLocation/Common/Constant.swift @@ -29,6 +29,8 @@ extension DefaultsKeys { var unlockCountTotal: DefaultsKey { .init("unlockCountTotal", defaultValue: 0) } /// 解锁统计:日期 yyyy-MM-dd var unlockCountDate: DefaultsKey { .init("unlockCountDate", defaultValue: "") } + /// 解锁统计:按自然日累计次数,key = yyyy-MM-dd + var unlockCountByDay: DefaultsKey<[String: Int]> { .init("unlockCountByDay", defaultValue: [:]) } /// 上次锁屏态(杀进程补计) var unlockWasLocked: DefaultsKey { .init("unlockWasLocked", defaultValue: false) } var unlockLastCountedAt: DefaultsKey { .init("unlockLastCountedAt") } diff --git a/QuickLocation/Core/Extension/UIDevice+Extension.swift b/QuickLocation/Core/Extension/UIDevice+Extension.swift new file mode 100644 index 00000000..058ff1b7 --- /dev/null +++ b/QuickLocation/Core/Extension/UIDevice+Extension.swift @@ -0,0 +1,101 @@ +// +// UIDevice+Extension.swift +// QuickLocation +// + +import UIKit + +extension UIDevice { + + /// 硬件机型标识,如 `iPhone17,1` + static var machineIdentifier: String { + var systemInfo = utsname() + uname(&systemInfo) + return withUnsafePointer(to: &systemInfo.machine.0) { ptr in + String(cString: ptr) + } + } + + /// 可读机型名,如 `iPhone 16 Pro`;未知机型回退为 `iPhone` + static var modelName: String { + deviceModelMap[machineIdentifier] ?? "iPhone" + } + + /// 与系统状态栏一致的电量百分比(四舍五入);不可用时返回 `nil` + static var batteryPercent: Int? { + let device = UIDevice.current + if !device.isBatteryMonitoringEnabled { + device.isBatteryMonitoringEnabled = true + } + let level = device.batteryLevel + guard level >= 0 else { return nil } + return Int((level * 100).rounded()) + } + + /// 是否正在充电 / 已充满接电 + static var isBatteryCharging: Bool { + let device = UIDevice.current + if !device.isBatteryMonitoringEnabled { + device.isBatteryMonitoringEnabled = true + } + switch device.batteryState { + case .charging, .full: + return true + default: + return false + } + } + + private static let deviceModelMap: [String: String] = [ + "iPhone10,1": "iPhone 8", + "iPhone10,4": "iPhone 8", + "iPhone10,2": "iPhone 8 Plus", + "iPhone10,5": "iPhone 8 Plus", + // iPhone X系列 + "iPhone10,3": "iPhone X", + "iPhone10,6": "iPhone X", + "iPhone11,2": "iPhone XS", + "iPhone11,4": "iPhone XS Max", + "iPhone11,6": "iPhone XS Max", + "iPhone11,8": "iPhone XR", + // iPhone11 + "iPhone12,1": "iPhone 11", + "iPhone12,3": "iPhone 11 Pro", + "iPhone12,5": "iPhone 11 Pro Max", + // iPhone12 + "iPhone13,1": "iPhone 12 mini", + "iPhone13,2": "iPhone 12", + "iPhone13,3": "iPhone 12 Pro", + "iPhone13,4": "iPhone 12 Pro Max", + // iPhone13 + "iPhone14,4": "iPhone 13 mini", + "iPhone14,5": "iPhone 13", + "iPhone14,2": "iPhone 13 Pro", + "iPhone14,3": "iPhone 13 Pro Max", + // iPhone14 + "iPhone14,7": "iPhone 14", + "iPhone14,8": "iPhone 14 Plus", + "iPhone15,2": "iPhone 14 Pro", + "iPhone15,3": "iPhone 14 Pro Max", + // iPhone15 + "iPhone15,4": "iPhone 15", + "iPhone15,5": "iPhone 15 Plus", + "iPhone16,1": "iPhone 15 Pro", + "iPhone16,2": "iPhone 15 Pro Max", + // iPhone16 + "iPhone17,1": "iPhone 16 Pro", + "iPhone17,2": "iPhone 16 Pro Max", + "iPhone17,3": "iPhone 16", + "iPhone17,4": "iPhone 16 Plus", + "iPhone17,5": "iPhone 16e", + // iPhone17 2025机型 + "iPhone18,1": "iPhone 17 Pro", + "iPhone18,2": "iPhone 17 Pro Max", + "iPhone18,3": "iPhone 17", + "iPhone18,4": "iPhone Air", + // Simulator + "i386": "Simulator", + "x86_64": "Simulator", + "arm64": "Simulator" + ] +} diff --git a/QuickLocation/Main/Tabbar/MainTabBarController.swift b/QuickLocation/Main/Tabbar/MainTabBarController.swift index 07940d85..878b60f5 100644 --- a/QuickLocation/Main/Tabbar/MainTabBarController.swift +++ b/QuickLocation/Main/Tabbar/MainTabBarController.swift @@ -9,7 +9,7 @@ final class MainTabBarController: UITabBarController { // MARK: - View Controllers private lazy var locationNav = BaseNavigationController(rootViewController: HomeViewController()) - private lazy var exploreNav = BaseNavigationController(rootViewController: ScheduleVC()) + private lazy var exploreNav = BaseNavigationController(rootViewController: FeatureIntroVC()) private lazy var circlesNav = BaseNavigationController(rootViewController: GroupViewController()) private lazy var mineNav = BaseNavigationController(rootViewController: MineViewController()) @@ -93,6 +93,14 @@ final class MainTabBarController: UITabBarController { func setTabBarHidden(_ hidden: Bool) { customTabBar.isHidden = hidden } + + /// 切换自定义 Tab(需同步 customTabBar 选中态与 UITabBarController.selectedIndex) + func selectTab(at index: Int) { + guard index >= 0, index < navControllers.count else { return } + customTabBar.setSelectedIndex(index) + selectedIndex = index + updateTabBarVisibility() + } } // MARK: - QuickLocationTabBarDelegate diff --git a/QuickLocation/Manager/App/ApiManager.swift b/QuickLocation/Manager/App/ApiManager.swift index 6278af95..891f2a22 100644 --- a/QuickLocation/Manager/App/ApiManager.swift +++ b/QuickLocation/Manager/App/ApiManager.swift @@ -10,6 +10,7 @@ import Moya import SwiftyJSON import RxSwift import CommonCrypto +import UIKit #if !targetEnvironment(simulator) import GeYanSdk #endif @@ -56,12 +57,7 @@ extension ApiManager { headers["x-version"] = kAppShortVersion headers["x-device-id"] = ApiManager.getMD5ID() // 机型 - var systemInfo = utsname() - uname(&systemInfo) - let platform = withUnsafePointer(to: &systemInfo.machine.0) { ptr in - return String(cString: ptr) - } - headers["x-mobile-model"] = platform + headers["x-mobile-model"] = UIDevice.machineIdentifier if let loginToken = Defaults[\.loginToken] { headers["x-token"] = loginToken diff --git a/QuickLocation/Manager/App/RouterManager.swift b/QuickLocation/Manager/App/RouterManager.swift index 3bdbc83f..a2d6f3ea 100644 --- a/QuickLocation/Manager/App/RouterManager.swift +++ b/QuickLocation/Manager/App/RouterManager.swift @@ -79,6 +79,16 @@ enum Route: String { case todayTrackDetail = "todayTrackDetail" /// 手机报告详情 case phoneReportDetail = "phoneReportDetail" + /// 关于我们 + case about = "about" + /// 成员信息 + case memberInfo = "memberInfo" + /// 注销账号 + case cancelAccount = "cancelAccount" + /// 还在吗 / 打卡 + case signIn = "signIn" + /// SOS + case sos = "sos" /// 充值优惠弹窗 case promotionalActivities = "promotionalActivities" } @@ -362,6 +372,31 @@ extension AppRouter: AppRouterProtocol { AppRouter.register(Route.phoneReportDetail) { url, parameters in PhoneReportDetailVC(userInfo: parameters) } + + // MARK: - 关于我们 + AppRouter.register(Route.about) { _, _ in + AboutVC() + } + + // MARK: - 成员信息 + AppRouter.register(Route.memberInfo) { _, parameters in + MemberInfoVC(userInfo: parameters) + } + + // MARK: - 注销账号 + AppRouter.register(Route.cancelAccount) { _, _ in + CancelAccountVC() + } + + // MARK: - 还在吗 + AppRouter.register(Route.signIn) { _, _ in + SignInVC(lastLocation: nil) + } + + // MARK: - SOS + AppRouter.register(Route.sos) { _, _ in + SOSViewController() + } // MARK: - 充值优惠弹窗 AppRouter.register(Route.promotionalActivities) { url, parameters in diff --git a/QuickLocation/Manager/Unlock/UnlockCountManager.swift b/QuickLocation/Manager/Unlock/UnlockCountManager.swift index c6edee4c..3055f5df 100644 --- a/QuickLocation/Manager/Unlock/UnlockCountManager.swift +++ b/QuickLocation/Manager/Unlock/UnlockCountManager.swift @@ -187,10 +187,18 @@ final class UnlockCountManager: NSObject { private func rollDayIfNeeded() -> Bool { migrateScreenTimeStorageIfNeeded() let today = todayString() - guard Defaults[\.unlockCountDate] != today else { return false } + let previousDate = Defaults[\.unlockCountDate] + guard previousDate != today else { return false } flushScreenSession() + // 切日前落盘旧日解锁次数 + if !previousDate.isEmpty { + var byDay = Defaults[\.unlockCountByDay] + byDay[previousDate] = Defaults[\.unlockCountToday] + Defaults[\.unlockCountByDay] = byDay + } + Defaults[\.unlockCountDate] = today Defaults[\.unlockCountToday] = 0 Defaults[\.appUsageToday] = 0 @@ -308,6 +316,9 @@ final class UnlockCountManager: NSObject { rollDayIfNeeded() Defaults[\.unlockCountToday] = Defaults[\.unlockCountToday] + 1 Defaults[\.unlockCountTotal] = Defaults[\.unlockCountTotal] + 1 + var byDay = Defaults[\.unlockCountByDay] + byDay[todayString()] = Defaults[\.unlockCountToday] + Defaults[\.unlockCountByDay] = byDay Defaults[\.unlockLastCountedAt] = now Defaults[\.unlockWasLocked] = false isSessionLocked = false diff --git a/QuickLocation/Section/Explore/FeatureIntroVC.swift b/QuickLocation/Section/Explore/FeatureIntroVC.swift new file mode 100644 index 00000000..e162e255 --- /dev/null +++ b/QuickLocation/Section/Explore/FeatureIntroVC.swift @@ -0,0 +1,52 @@ +// +// FeatureIntroVC.swift +// QuickLocation +// + +import UIKit +import CoreLocation +import SwiftyUserDefaults + +final class FeatureIntroVC: BaseViewController { + + override var isNavigationBarHidden: Bool { true } + + private var rootView: FeatureIntroView! + + override func loadView() { + rootView = FeatureIntroView(frame: UIScreen.main.bounds) + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + rootView.onTapItem = { [weak self] action in + self?.handle(action) + } + } + + private func handle(_ action: FeatureIntroAction) { + switch action { + case .signIn: + let vc = SignInVC(lastLocation: savedLastLocation) + vc.isNeedLogin = true + AppRouter.push(vc) + case .createBubble: + AppRouter.push(Route.createBubble) + case .searchLocation: + AppRouter.push(Route.searchLocation) + case .sos: + let vc = SOSViewController() + vc.isNeedLogin = true + AppRouter.push(vc) + case .placeholder: + DLToast.show(text: "敬请期待") + } + } + + private var savedLastLocation: CLLocation? { + guard let lat = Defaults[\.currentLatitude], + let lon = Defaults[\.currentLongitude] else { return nil } + return CLLocation(latitude: lat, longitude: lon) + } +} diff --git a/QuickLocation/Section/Explore/FeatureIntroView.swift b/QuickLocation/Section/Explore/FeatureIntroView.swift new file mode 100644 index 00000000..8f1d75d5 --- /dev/null +++ b/QuickLocation/Section/Explore/FeatureIntroView.swift @@ -0,0 +1,193 @@ +// +// FeatureIntroView.swift +// QuickLocation +// + +import UIKit + +struct FeatureIntroItem { + let title: String + let subtitle: String + let background: UIColor + let titleColor: UIColor + let subtitleColor: UIColor + let arrowTint: UIColor + let action: FeatureIntroAction +} + +enum FeatureIntroAction { + case signIn + case createBubble + case searchLocation + case sos + case placeholder +} + +final class FeatureIntroView: UIView { + + var onTapItem: ((FeatureIntroAction) -> Void)? + + private let headerTitleLab = UILabel() + private let headerSubLab = UILabel() + private let sheet = UIView() + private let grid = UIStackView() + + private let items: [FeatureIntroItem] = [ + FeatureIntroItem( + title: "还在吗?", + subtitle: "每日打卡签到 记录美好生活", + background: UIColor(hexStr: "#EDE7FF"), + titleColor: UIColor(hexStr: "#5B4B8A"), + subtitleColor: UIColor(hexStr: "#8B7BB8"), + arrowTint: UIColor(hexStr: "#7B6AAE"), + action: .signIn + ), + FeatureIntroItem( + title: "隐身气泡", + subtitle: "只想做个淡人 默默隐身", + background: UIColor(hexStr: "#D9ECFF"), + titleColor: UIColor(hexStr: "#2F6FAE"), + subtitleColor: UIColor(hexStr: "#6A9BC4"), + arrowTint: UIColor(hexStr: "#3E8FD0"), + action: .createBubble + ), + FeatureIntroItem( + title: "一键锁机", + subtitle: "专注当下 拒绝手机干扰", + background: UIColor(hexStr: "#DDF5E8"), + titleColor: UIColor(hexStr: "#2F8A5B"), + subtitleColor: UIColor(hexStr: "#6AAD88"), + arrowTint: UIColor(hexStr: "#3EAE72"), + action: .placeholder + ), + FeatureIntroItem( + title: "飞鸽传书", + subtitle: "实时查看位置 守护安全出行", + background: UIColor(hexStr: "#FFF3D6"), + titleColor: UIColor(hexStr: "#A67C2D"), + subtitleColor: UIColor(hexStr: "#C4A46A"), + arrowTint: UIColor(hexStr: "#C9953A"), + action: .placeholder + ), + FeatureIntroItem( + title: "查位置", + subtitle: "实时查看位置 守护安全出行", + background: UIColor(hexStr: "#D6F4F2"), + titleColor: UIColor(hexStr: "#2A8A84"), + subtitleColor: UIColor(hexStr: "#66B0AB"), + arrowTint: UIColor(hexStr: "#35A8A0"), + action: .searchLocation + ), + FeatureIntroItem( + title: "SOS", + subtitle: "紧急求助 一键呼叫", + background: UIColor(hexStr: "#FFE4E8"), + titleColor: UIColor(hexStr: "#D6455D"), + subtitleColor: UIColor(hexStr: "#E28A98"), + arrowTint: UIColor(hexStr: "#E2556C"), + action: .sos + ) + ] + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = UIColor(hexStr: "#F0F1F3") + setupUI() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupUI() { + headerTitleLab.text = "功能介绍" + headerTitleLab.font = .systemFont(ofSize: 28, weight: .bold) + headerTitleLab.textColor = UIColor(hexStr: "#1F2A44") + addSubview(headerTitleLab) + headerTitleLab.layoutChain.top(kStatusBarHeight + 20).left(20) + + headerSubLab.text = "视频+图片" + headerSubLab.font = .systemFont(ofSize: 28, weight: .bold) + headerSubLab.textColor = UIColor(hexStr: "#1F2A44") + addSubview(headerSubLab) + headerSubLab.layoutChain.topToBottomOfView(headerTitleLab, offset: 2).left(20) + + sheet.backgroundColor = .white + sheet.layer.cornerRadius = 28 + sheet.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + sheet.clipsToBounds = true + addSubview(sheet) + sheet.layoutChain + .topToBottomOfView(headerSubLab, offset: 24) + .edgesHorzontal() + .bottom() + + grid.axis = .vertical + grid.spacing = 12 + grid.distribution = .fillEqually + sheet.addSubview(grid) + grid.layoutChain + .top(24) + .edgesHorzontal(16) + .bottom(24 + 70) // leave room for custom tab bar + + for row in 0..<3 { + let rowStack = UIStackView() + rowStack.axis = .horizontal + rowStack.spacing = 12 + rowStack.distribution = .fillEqually + for col in 0..<2 { + let item = items[row * 2 + col] + let card = FeatureIntroCardView(item: item) + card.addTarget(self, action: #selector(cardTapped(_:)), for: .touchUpInside) + card.tag = row * 2 + col + rowStack.addArrangedSubview(card) + } + grid.addArrangedSubview(rowStack) + } + } + + @objc private func cardTapped(_ sender: FeatureIntroCardView) { + let idx = sender.tag + guard items.indices.contains(idx) else { return } + onTapItem?(items[idx].action) + } +} + +final class FeatureIntroCardView: UIControl { + private let titleLab = UILabel() + private let subLab = UILabel() + private let arrowBtn = UIView() + + init(item: FeatureIntroItem) { + super.init(frame: .zero) + backgroundColor = item.background + layer.cornerRadius = 20 + clipsToBounds = true + + titleLab.text = item.title + titleLab.font = .systemFont(ofSize: 18, weight: .bold) + titleLab.textColor = item.titleColor + addSubview(titleLab) + titleLab.layoutChain.top(16).left(14).right(14) + + subLab.text = item.subtitle + subLab.font = .systemFont(ofSize: 11, weight: .medium) + subLab.textColor = item.subtitleColor + subLab.numberOfLines = 2 + addSubview(subLab) + subLab.layoutChain.topToBottomOfView(titleLab, offset: 6).left(14).right(14) + + arrowBtn.backgroundColor = .white + arrowBtn.isUserInteractionEnabled = false + arrowBtn.layer.cornerRadius = 14 + addSubview(arrowBtn) + arrowBtn.layoutChain.left(14).bottom(14).width(28).height(28) + + let arrow = UIImageView(image: UIImage(systemName: "chevron.right")) + arrow.tintColor = item.arrowTint + arrow.contentMode = .scaleAspectFit + arrowBtn.addSubview(arrow) + arrow.layoutChain.center().width(10).height(12) + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } +} diff --git a/QuickLocation/Section/Group/InviteJoin/InviteJoinVC.swift b/QuickLocation/Section/Group/InviteJoin/InviteJoinVC.swift index e7be01c7..565485c4 100644 --- a/QuickLocation/Section/Group/InviteJoin/InviteJoinVC.swift +++ b/QuickLocation/Section/Group/InviteJoin/InviteJoinVC.swift @@ -27,8 +27,9 @@ class InviteJoinVC: BaseViewController { super.viewDidLoad() // 分享邀请卡片到微信 - rootView.shareBtn.rx.tap.subscribe(onNext: { [weak self] in - self?.shareInviteCard() + rootView.shareBtn.rx.tap.subscribe(onNext: { _ in + SharePopView.show() +// self?.shareInviteCard() }).disposed(by: disposeBag) // 下载图片到相册 diff --git a/QuickLocation/Section/Group/MemberInfo/MemberInfoVC.swift b/QuickLocation/Section/Group/MemberInfo/MemberInfoVC.swift new file mode 100644 index 00000000..73198a88 --- /dev/null +++ b/QuickLocation/Section/Group/MemberInfo/MemberInfoVC.swift @@ -0,0 +1,159 @@ +// +// MemberInfoVC.swift +// QuickLocation +// + +import UIKit +import RxSwift +import RxCocoa +import ObjectMapper +import Kingfisher + +final class MemberInfoVC: BaseViewController { + + private var rootView: MemberInfoView! + private var members: [GroupMemberModel] + private var selectedUserId: String + private var groupModel: GroupModel? + + init(members: [GroupMemberModel], selectedUserId: String, groupModel: GroupModel?) { + self.members = members + self.selectedUserId = selectedUserId + self.groupModel = groupModel + super.init(nibName: nil, bundle: nil) + } + + convenience init(userInfo: [String: Any]) { + let rawMembers = userInfo["members"] + let membersJson: [[String: Any]] + if let arr = rawMembers as? [[String: Any]] { + membersJson = arr + } else if let arr = rawMembers as? [Any] { + membersJson = arr.compactMap { $0 as? [String: Any] } + } else { + membersJson = [] + } + let members = membersJson.compactMap { GroupMemberModel(JSON: $0) } + let selected = (userInfo["userId"] as? String) ?? members.first?.user_id ?? "" + let group = (userInfo["groupJson"] as? [String: Any]).flatMap { GroupModel(JSON: $0) } + self.init(members: members, selectedUserId: selected, groupModel: group) + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + override func loadView() { + rootView = MemberInfoView(frame: UIScreen.main.bounds) + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + rootView.memberCV.dataSource = self + rootView.memberCV.delegate = self + bind() + refreshDetail() + rootView.memberCV.reloadData() + } + + private func bind() { + rootView.navView.onBackTapped = { [weak self] in + self?.navigationController?.popViewController(animated: true) + } + rootView.switchGroupBtn.rx.tap + .subscribe(onNext: { [weak self] in + self?.switchGroup() + }) + .disposed(by: disposeBag) + } + + private func switchGroup() { + guard let groupModel else { return } + GroupListPopView.show(groupModel: groupModel) { [weak self] groupKey in + guard let self, let key = groupKey else { return } + GroupService.operate(opType: "setdefault", requestData: ["group_key": key]) + .subscribe(onNext: { [weak self] _ in + NotificationCenter.default.post(name: .RefreshGroupInfoNotification, object: nil) + self?.navigationController?.popViewController(animated: true) + }) + .disposed(by: self.disposeBag) + } + } + + private func refreshDetail() { + let member = members.first { $0.user_id == selectedUserId } + let isSelf = selectedUserId == AppContextManager.shared.userId + let joinText: String = { + guard let ts = member?.join_time, ts > 0 else { return "**" } + let date = Date(timeIntervalSince1970: TimeInterval(ts) / 1000) + let f = DateFormatter() + f.dateFormat = "yyyy-MM-dd" + return f.string(from: date) + }() + let circleName: String = { + guard let gm = groupModel else { return "共同圈子" } + let name = gm.groups.first(where: { $0.group_key == gm.default_group_key })?.name + ?? gm.groups.first?.name + return (name?.isEmpty == false) ? name! : "共同圈子" + }() + + if isSelf { + let sexText: String = { + switch AppContextManager.shared.sex { + case 1: return "男" + case 2: return "女" + default: return "未设置" + } + }() + rootView.renderRows([ + MemberInfoRow(title: "头像", value: "", kind: .avatar, avatarURL: member?.head_pic) { [weak self] in + AppRouter.push(Route.myProfile) + _ = self + }, + MemberInfoRow(title: "昵称", value: member?.nick_name ?? "", kind: .disclosure) { + AppRouter.push(Route.myProfile) + }, + MemberInfoRow(title: "性别", value: sexText, kind: .disclosure) { + AppRouter.push(Route.myProfile) + }, + MemberInfoRow(title: "添加时间", value: joinText, kind: .text), + MemberInfoRow(title: "共同圈子", value: circleName, kind: .tag) + ]) + } else { + rootView.renderRows([ + MemberInfoRow(title: "昵称", value: member?.nick_name ?? "", kind: .text), + MemberInfoRow(title: "备注", value: member?.nick_name ?? "", kind: .disclosure) { + DLToast.show(text: "敬请期待") + }, + MemberInfoRow(title: "关系", value: "未绑定", kind: .disclosure) { + DLToast.show(text: "敬请期待") + }, + MemberInfoRow(title: "性别", value: "保密", kind: .text), + MemberInfoRow(title: "添加时间", value: joinText, kind: .text), + MemberInfoRow(title: "共同圈子", value: circleName, kind: .tag) + ]) + } + } +} + +extension MemberInfoVC: UICollectionViewDataSource, UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + members.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell: GroupMemberListCell = collectionView.dequeueReusableCell(for: indexPath) + let model = members[indexPath.item] + cell.configure( + model: model, + isCurrentUser: model.user_id == AppContextManager.shared.userId, + isSelected: model.user_id == selectedUserId + ) + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + selectedUserId = members[indexPath.item].user_id + collectionView.reloadData() + refreshDetail() + } +} diff --git a/QuickLocation/Section/Group/MemberInfo/MemberInfoView.swift b/QuickLocation/Section/Group/MemberInfo/MemberInfoView.swift new file mode 100644 index 00000000..78c7ef37 --- /dev/null +++ b/QuickLocation/Section/Group/MemberInfo/MemberInfoView.swift @@ -0,0 +1,196 @@ +// +// MemberInfoView.swift +// QuickLocation +// + +import UIKit +import Kingfisher + +final class MemberInfoView: UIView { + + lazy var navView = BaseNavigationView(title: "成员信息") + + let switchGroupBtn: UIButton = { + let btn = UIButton(type: .custom) + btn.backgroundColor = .white.withAlphaComponent(0.8) + btn.setTitle(" 切换圈子 ", for: .normal) + btn.titleLabel?.font = .systemFont(ofSize: 12, weight: .medium) + btn.setTitleColor(UIColor(hexStr: "#293445"), for: .normal) + btn.cornerRadius = 8 + return btn + }() + + lazy var memberCV: UICollectionView = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.itemSize = CGSize(width: 61, height: 90) + layout.minimumLineSpacing = 12 + let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) + cv.backgroundColor = .white + cv.showsHorizontalScrollIndicator = false + cv.contentInset = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12) + cv.register(GroupMemberListCell.self) + cv.layer.cornerRadius = 20 + return cv + }() + + let scrollView = UIScrollView() + let contentView = UIView() + let detailCard = UIView() + private let rowsStack = UIStackView() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = UIColor(hexStr: "#F7F7F7") + setupUI() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupUI() { + addSubview(navView) + navView.layoutChain.top().edgesHorzontal().height(kNaviHeight) + navView.addRightButton(switchGroupBtn) + + addSubview(scrollView) + scrollView.layoutChain.topToBottomOfView(navView).edgesHorzontal().bottom() + scrollView.addSubview(contentView) + contentView.layoutChain.edges().widthToView(scrollView) + + contentView.addSubview(memberCV) + memberCV.layoutChain.top(8).edgesHorzontal(15).height(100) + + detailCard.backgroundColor = .white + detailCard.layer.cornerRadius = 16 + contentView.addSubview(detailCard) + detailCard.layoutChain + .topToBottomOfView(memberCV, offset: 12) + .edgesHorzontal(15) + .bottom(24) + + rowsStack.axis = .vertical + rowsStack.spacing = 0 + detailCard.addSubview(rowsStack) + rowsStack.layoutChain.edges(UIEdgeInsets(top: 4, left: 0, bottom: 4, right: 0)) + } + + func renderRows(_ rows: [MemberInfoRow]) { + rowsStack.arrangedSubviews.forEach { + rowsStack.removeArrangedSubview($0) + $0.removeFromSuperview() + } + for (i, row) in rows.enumerated() { + let view = MemberInfoRowView(row: row) + rowsStack.addArrangedSubview(view) + view.layoutChain.height(row.kind == .tag ? 56 : 52) + if i < rows.count - 1 { + let line = UIView() + line.backgroundColor = UIColor(hexStr: "#F2F2F2") + view.addSubview(line) + line.layoutChain.left(15).right(15).bottom(0).height(0.5) + } + } + } +} + +enum MemberInfoRowKind { + case text + case avatar + case tag + case disclosure +} + +struct MemberInfoRow { + let title: String + let value: String + let kind: MemberInfoRowKind + let action: (() -> Void)? + let avatarURL: String? + + init(title: String, value: String, kind: MemberInfoRowKind = .text, avatarURL: String? = nil, action: (() -> Void)? = nil) { + self.title = title + self.value = value + self.kind = kind + self.avatarURL = avatarURL + self.action = action + } +} + +final class MemberInfoRowView: UIControl { + private let titleLab = UILabel() + private let valueLab = UILabel() + private let arrow = UIImageView(image: UIImage(named: "Mine/arrow_right")) + private let avatar = UIImageView() + private let tagLab = UILabel() + private let actionHandler: (() -> Void)? + + init(row: MemberInfoRow) { + self.actionHandler = row.action + super.init(frame: .zero) + titleLab.text = row.title + titleLab.font = .systemFont(ofSize: 14, weight: .medium) + titleLab.textColor = UIColor(hexStr: "#293445") + addSubview(titleLab) + titleLab.layoutChain.left(15).centerY() + + valueLab.text = row.value + valueLab.font = .systemFont(ofSize: 14, weight: .medium) + valueLab.textColor = row.value == "未设置" || row.value == "未绑定" || row.value == "保密" + ? UIColor(hexStr: "#AAAAAA") + : UIColor(hexStr: "#293445") + valueLab.textAlignment = .right + + arrow.contentMode = .scaleAspectFit + avatar.contentMode = .scaleAspectFill + avatar.clipsToBounds = true + avatar.layer.cornerRadius = 14 + + tagLab.text = row.value + tagLab.font = .systemFont(ofSize: 12, weight: .medium) + tagLab.textColor = UIColor(hexStr: "#E8A045") + tagLab.backgroundColor = UIColor(hexStr: "#FFF3E0") + tagLab.textAlignment = .center + tagLab.layer.cornerRadius = 10 + tagLab.clipsToBounds = true + + switch row.kind { + case .text: + addSubview(valueLab) + valueLab.layoutChain.right(15).centerY().leftToRightOfView(titleLab, offset: 12) + case .disclosure: + addSubview(arrow) + arrow.layoutChain.right(15).centerY().width(12).height(12) + addSubview(valueLab) + valueLab.layoutChain.rightToLeftOfView(arrow, offset: 6).centerY().leftToRightOfView(titleLab, offset: 12) + case .avatar: + addSubview(arrow) + arrow.layoutChain.right(15).centerY().width(12).height(12) + addSubview(avatar) + avatar.layoutChain.rightToLeftOfView(arrow, offset: 8).centerY().width(28).height(28) + if let pic = row.avatarURL, !pic.isEmpty, let img = UIImage(named: "UserIcon/\(pic)") { + avatar.image = img + } else if let urlStr = row.avatarURL, let u = URL(string: urlStr), urlStr.hasPrefix("http") { + avatar.kf.setImage(with: u, placeholder: UIImage(named: "Common/default_avatar")) + } else { + avatar.image = UIImage(named: "Common/default_avatar") + } + case .tag: + addSubview(tagLab) + tagLab.layoutChain.right(15).centerY().height(20) + tagLab.setContentHuggingPriority(.required, for: .horizontal) + let pad = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) + tagLab.layoutMargins = pad + // approximate width from text + let w = (row.value as NSString).size(withAttributes: [.font: tagLab.font!]).width + 20 + tagLab.layoutChain.width(max(60, w)) + } + + if row.action != nil { + addTarget(self, action: #selector(tap), for: .touchUpInside) + } + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + @objc private func tap() { actionHandler?() } +} diff --git a/QuickLocation/Section/Home/Bubble/BubbleHeroView.swift b/QuickLocation/Section/Home/Bubble/BubbleHeroView.swift new file mode 100644 index 00000000..8d236d2f --- /dev/null +++ b/QuickLocation/Section/Home/Bubble/BubbleHeroView.swift @@ -0,0 +1,230 @@ +// +// BubbleHeroView.swift +// QuickLocation +// + +import UIKit + +/// 绘制气泡 + 当前用户头像在圆内持续碰撞回弹 +final class BubbleHeroView: UIView { + + private let bubbleContainer = UIView() + private let gradientLayer = CAGradientLayer() + private let bubbleMaskLayer = CAShapeLayer() + private let borderLayer = CAShapeLayer() + private let avatarView = UIImageView() + private let decoBubble1 = UIView() + private let decoBubble2 = UIView() + + private var displayLink: CADisplayLink? + private var avatarCenter = CGPoint.zero + private var velocity = CGPoint(x: 42, y: 36) + private var avatarAngle: CGFloat = 0 + private var lastTimestamp: CFTimeInterval = 0 + private var sameDirectionBounceCount = 0 + private var lastBounceNormal = CGPoint.zero + private var hasRandomizedMotion = false + + private let avatarSize: CGFloat = 64 + private let moveSpeed: CGFloat = 85 + + override init(frame: CGRect) { + super.init(frame: frame) + clipsToBounds = false + setupUI() + reloadAvatar() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + deinit { stopAnimation() } + + override func didMoveToWindow() { + super.didMoveToWindow() + if window != nil { + if UIAccessibility.isReduceMotionEnabled { + stopAnimation() + resetAvatarCenter(randomize: false) + } else { + startAnimation() + } + } else { + stopAnimation() + } + } + + override func layoutSubviews() { + super.layoutSubviews() + let diameter = bounds.width + guard diameter > 0 else { return } + + let bubbleFrame = CGRect(x: 0, y: 0, width: diameter, height: diameter) + bubbleContainer.frame = bubbleFrame + gradientLayer.frame = bubbleContainer.bounds + bubbleMaskLayer.path = UIBezierPath(ovalIn: bubbleContainer.bounds).cgPath + bubbleMaskLayer.frame = bubbleContainer.bounds + borderLayer.path = UIBezierPath(ovalIn: bubbleContainer.bounds).cgPath + borderLayer.frame = bubbleContainer.bounds + + decoBubble1.frame = CGRect(x: bubbleFrame.minX + diameter * 0.12, y: bubbleFrame.maxY + 8, width: 32, height: 32) + decoBubble2.frame = CGRect(x: bubbleFrame.maxX - diameter * 0.22, y: bubbleFrame.maxY + 18, width: 20, height: 20) + decoBubble1.layer.cornerRadius = 16 + decoBubble2.layer.cornerRadius = 10 + + if avatarCenter == .zero || !bubbleContainer.bounds.contains(avatarCenter) { + resetAvatarCenter(randomize: true) + } + layoutAvatar() + } + + func reloadAvatar() { + let icon = AppContextManager.shared.avaterIcon + avatarView.image = icon.size.width > 0 ? icon : UIImage(named: "Common/default_avatar") + } + + private func setupUI() { + bubbleContainer.clipsToBounds = true + addSubview(bubbleContainer) + + gradientLayer.type = .radial + gradientLayer.colors = [ + UIColor.white.cgColor, + UIColor.white.cgColor, + UIColor(hexStr: "#FFE8F2").cgColor, + UIColor(hexStr: "#FFC9EF").cgColor + ] + gradientLayer.locations = [0, 0.58, 0.82, 1] + gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.46) + gradientLayer.endPoint = CGPoint(x: 1, y: 1) + bubbleContainer.layer.addSublayer(gradientLayer) + + bubbleMaskLayer.fillColor = UIColor.white.cgColor + bubbleContainer.layer.mask = bubbleMaskLayer + + borderLayer.fillColor = UIColor.clear.cgColor + borderLayer.strokeColor = UIColor.white.withAlphaComponent(0.3).cgColor + borderLayer.lineWidth = 1 + bubbleContainer.layer.addSublayer(borderLayer) + + avatarView.contentMode = .scaleAspectFill + avatarView.clipsToBounds = true + avatarView.layer.cornerRadius = 16 + avatarView.layer.borderWidth = 3 + avatarView.layer.borderColor = UIColor.white.cgColor + bubbleContainer.addSubview(avatarView) + + decoBubble1.backgroundColor = UIColor(hexStr: "#FFD6E8").withAlphaComponent(0.85) + decoBubble2.backgroundColor = UIColor(hexStr: "#FFD6E8").withAlphaComponent(0.65) + addSubview(decoBubble1) + addSubview(decoBubble2) + } + + private func randomizeVelocity() { + let angle = CGFloat.random(in: 0...(2 * .pi)) + velocity = CGPoint(x: cos(angle) * moveSpeed, y: sin(angle) * moveSpeed) + hasRandomizedMotion = true + } + + private func normalizeVelocity() { + let speed = hypot(velocity.x, velocity.y) + guard speed > 0.001 else { + randomizeVelocity() + return + } + let scale = moveSpeed / speed + velocity.x *= scale + velocity.y *= scale + } + + private func resetAvatarCenter(randomize: Bool) { + let bounds = bubbleContainer.bounds + guard bounds.width > 0 else { return } + + let offsetRange = bounds.width * 0.08 + avatarCenter = CGPoint( + x: bounds.midX + CGFloat.random(in: -offsetRange...offsetRange), + y: bounds.midY + CGFloat.random(in: -offsetRange...offsetRange) + ) + if randomize { + avatarAngle = CGFloat.random(in: -0.21...0.21) + randomizeVelocity() + sameDirectionBounceCount = 0 + lastBounceNormal = .zero + } + layoutAvatar() + } + + private func layoutAvatar() { + avatarView.bounds = CGRect(x: 0, y: 0, width: avatarSize, height: avatarSize) + avatarView.center = avatarCenter + avatarView.transform = CGAffineTransform(rotationAngle: avatarAngle) + } + + private func startAnimation() { + guard displayLink == nil else { return } + if !hasRandomizedMotion { + randomizeVelocity() + } + lastTimestamp = 0 + let link = CADisplayLink(target: self, selector: #selector(tick(_:))) + link.add(to: .main, forMode: .common) + displayLink = link + } + + private func stopAnimation() { + displayLink?.invalidate() + displayLink = nil + lastTimestamp = 0 + } + + @objc private func tick(_ link: CADisplayLink) { + guard bubbleContainer.bounds.width > 0 else { return } + let dt = lastTimestamp > 0 ? CGFloat(link.timestamp - lastTimestamp) : CGFloat(1.0 / 60.0) + lastTimestamp = link.timestamp + guard dt > 0, dt < 0.05 else { return } + + let bubbleRadius = min(bubbleContainer.bounds.width, bubbleContainer.bounds.height) / 2 + let maxDist = max(8, bubbleRadius - avatarSize / 2 - 4) + let center = CGPoint(x: bubbleContainer.bounds.midX, y: bubbleContainer.bounds.midY) + + avatarCenter.x += velocity.x * dt + avatarCenter.y += velocity.y * dt + + let offset = CGPoint(x: avatarCenter.x - center.x, y: avatarCenter.y - center.y) + let dist = hypot(offset.x, offset.y) + if dist > maxDist { + let nx = offset.x / max(dist, 0.001) + let ny = offset.y / max(dist, 0.001) + avatarCenter.x = center.x + nx * maxDist + avatarCenter.y = center.y + ny * maxDist + + if abs(nx - lastBounceNormal.x) < 0.15 && abs(ny - lastBounceNormal.y) < 0.15 { + sameDirectionBounceCount += 1 + } else { + sameDirectionBounceCount = 0 + } + lastBounceNormal = CGPoint(x: nx, y: ny) + + let dot = velocity.x * nx + velocity.y * ny + velocity.x = velocity.x - 2 * dot * nx + velocity.y = velocity.y - 2 * dot * ny + + let tx = -ny + let ty = nx + let jitterSign: CGFloat = Bool.random() ? 1 : -1 + let jitter = CGFloat.random(in: 16...26) * jitterSign + velocity.x += tx * jitter + velocity.y += ty * jitter + normalizeVelocity() + avatarAngle += CGFloat.random(in: -0.05...0.05) + + if sameDirectionBounceCount >= 3 { + randomizeVelocity() + sameDirectionBounceCount = 0 + lastBounceNormal = .zero + } + } + + layoutAvatar() + } +} diff --git a/QuickLocation/Section/Home/Bubble/BubbleKnowledgeVC.swift b/QuickLocation/Section/Home/Bubble/BubbleKnowledgeVC.swift new file mode 100644 index 00000000..115a420b --- /dev/null +++ b/QuickLocation/Section/Home/Bubble/BubbleKnowledgeVC.swift @@ -0,0 +1,25 @@ +// +// BubbleKnowledgeVC.swift +// QuickLocation +// + +import UIKit + +final class BubbleKnowledgeVC: BaseViewController { + + override var isNavigationBarHidden: Bool { true } + + private var rootView: BubbleKnowledgeView! + + override func loadView() { + rootView = BubbleKnowledgeView(frame: UIScreen.main.bounds) + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + rootView.navView.onBackTapped = { [weak self] in + self?.navigationController?.popViewController(animated: true) + } + } +} diff --git a/QuickLocation/Section/Home/Bubble/BubbleKnowledgeView.swift b/QuickLocation/Section/Home/Bubble/BubbleKnowledgeView.swift new file mode 100644 index 00000000..1d8d9a92 --- /dev/null +++ b/QuickLocation/Section/Home/Bubble/BubbleKnowledgeView.swift @@ -0,0 +1,147 @@ +// +// BubbleKnowledgeView.swift +// QuickLocation +// + +import UIKit + +final class BubbleKnowledgeView: UIView { + + lazy var navView = BaseNavigationView(title: "气泡知识") + + private let scrollView = UIScrollView() + private let contentView = UIView() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = UIColor(hexStr: "#FAFAFA") + setupUI() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupUI() { + addSubview(navView) + navView.layoutChain.top().edgesHorzontal().height(kNaviHeight) + + addSubview(scrollView) + scrollView.layoutChain.topToBottomOfView(navView).edgesHorzontal().bottom() + scrollView.addSubview(contentView) + contentView.layoutChain.edges().widthToView(scrollView) + + let sections: [(String, String, Bool)] = [ + ("1", "气泡基础知识", true), + ("2", "气泡持续时间", false), + ("3", "签到", false), + ("4", "弹出您的气泡", false) + ] + + var previous: UIView? + for item in sections { + let block = makeSection(index: item.0, title: item.1, withFeatureList: item.2) + contentView.addSubview(block) + if let previous { + block.layoutChain.topToBottomOfView(previous, offset: 20).edgesHorzontal(16) + } else { + block.layoutChain.top(16).edgesHorzontal(16) + } + previous = block + } + previous?.layoutChain.bottom(24) + } + + private func makeSection(index: String, title: String, withFeatureList: Bool) -> UIView { + let card = UIView() + card.backgroundColor = .white + card.layer.cornerRadius = 16 + + let badge = UILabel() + badge.text = index + badge.font = .systemFont(ofSize: 14, weight: .bold) + badge.textColor = .white + badge.textAlignment = .center + badge.backgroundColor = UIColor(hexStr: "#16B3FF") + badge.layer.cornerRadius = 8 + badge.clipsToBounds = true + card.addSubview(badge) + badge.layoutChain.top(16).left(16).width(28).height(28) + + let titleLab = UILabel() + titleLab.text = title + titleLab.font = .systemFont(ofSize: 16, weight: .bold) + titleLab.textColor = UIColor(hexStr: "#293445") + card.addSubview(titleLab) + titleLab.layoutChain.leftToRightOfView(badge, offset: 10).centerY(badge) + + let body = UILabel() + body.numberOfLines = 0 + body.font = .systemFont(ofSize: 14, weight: .medium) + body.textColor = UIColor(hexStr: "#767676") + card.addSubview(body) + body.layoutChain.topToBottomOfView(badge, offset: 12).edgesHorzontal(16) + + switch index { + case "1": + body.text = "当您在气泡中时,圈子成员只能看到您创建气泡时的位置,而不是您的实时位置。安全功能仍然有效。" + case "2": + body.text = "气泡会在设定的时间到期,但您或圈子成员可以提前「弹出」气泡。" + case "3": + body.text = "虽然气泡有设定到期时间,但完成「签到」也会弹出气泡。" + case "4": + body.text = "点击「弹出气泡」可手动结束气泡,之后圈子将能看到您的精确位置。" + default: + break + } + + var bottomAnchor: UIView = body + if withFeatureList { + let list = makeFeatureList() + card.addSubview(list) + list.layoutChain.topToBottomOfView(body, offset: 12).edgesHorzontal(16).bottom(16) + bottomAnchor = list + } else { + body.layoutChain.bottom(16) + } + _ = bottomAnchor + return card + } + + private func makeFeatureList() -> UIView { + let stack = UIStackView() + stack.axis = .vertical + stack.spacing = 0 + + let rows: [(String, String)] = [ + ("碰撞提醒", "开启"), + ("SOS警报", "开启"), + ("位置共享", "开启"), + ("低电量通知", "关闭"), + ("安全驾驶通知", "关闭"), + ("位置通知", "关闭") + ] + + for (i, row) in rows.enumerated() { + let line = UIView() + let title = UILabel() + title.text = row.0 + title.font = .systemFont(ofSize: 14, weight: .medium) + title.textColor = UIColor(hexStr: "#293445") + let status = UILabel() + status.text = row.1 + status.font = .systemFont(ofSize: 14, weight: .medium) + status.textColor = UIColor(hexStr: "#9CA3AF") + line.addSubview(title) + line.addSubview(status) + title.layoutChain.left().centerY().top(12).bottom(12) + status.layoutChain.right().centerY() + stack.addArrangedSubview(line) + if i < rows.count - 1 { + let sep = UIView() + sep.backgroundColor = UIColor(hexStr: "#F2F2F2") + sep.layoutChain.height(0.5) + stack.addArrangedSubview(sep) + } + } + return stack + } +} diff --git a/QuickLocation/Section/Home/Bubble/CreateBubbleDoneView.swift b/QuickLocation/Section/Home/Bubble/CreateBubbleDoneView.swift index d3604513..5d21c96d 100644 --- a/QuickLocation/Section/Home/Bubble/CreateBubbleDoneView.swift +++ b/QuickLocation/Section/Home/Bubble/CreateBubbleDoneView.swift @@ -2,8 +2,6 @@ // CreateBubbleDoneView.swift // QuickLocation // -// Created by 八条 on 2026/6/26. -// import UIKit import RxSwift @@ -13,9 +11,15 @@ class CreateBubbleDoneView: UIView { var disposeBag = DisposeBag() + let heroView = BubbleHeroView() + let popupBtn = UIButton(type: .custom) + private var countdownTimer: Timer? private var endDate: Date = Date() + private let clockImage = UIImageView() + private let timeLab = UILabel() + func startCountdown(endDate: Date) { self.endDate = endDate countdownTimer?.invalidate() @@ -38,150 +42,51 @@ class CreateBubbleDoneView: UIView { let seconds = Int(remaining) % 60 timeLab.text = String(format: "%02d:%02d:%02d", hours, minutes, seconds) } - - private func setupRx() { - - } private func setupUI() { - addSubview(titleLab) - addSubview(timeIcon) - addSubview(timeLab) - addSubview(messageView) - addSubview(iconView) - addSubview(scrollView) + addSubview(heroView) + addSubview(clockImage) + clockImage.addSubview(timeLab) addSubview(popupBtn) - titleLab.layoutChain - .top(15) + heroView.layoutChain + .top(33) + .leading(30) + .trailing(30) + .heightToWidth(1) + + clockImage.image = UIImage(named: "Bubble/clock") + clockImage.contentMode = .scaleAspectFit + clockImage.layoutChain + .topToBottomOfView(heroView, offset: 8) .centerX() - - timeLab.layoutChain - .topToBottomOfView(titleLab, offset: 12) - .centerX() - - timeIcon.layoutChain - .rightToLeftOfView(timeLab, offset: -8) - .centerY(timeLab) - - messageView.layoutChain - .topToBottomOfView(timeLab, offset: 25) - .left(79) - .right(30) - - iconView.layoutChain - .rightToLeftOfView(messageView, offset: -9) - .bottomToView(messageView) - .height(40) - .width(40) - - popupBtn.layoutChain - .width(240) - .height(50) - .centerX() - .bottom(kSafeBottomMargin + 20) - - scrollView.layoutChain - .topToBottomOfView(messageView, offset: 20) - .edgesHorzontal() - .bottomToTopOfView(popupBtn, offset: -20) + .width(200) + .height(120) + + timeLab.font = .systemFont(ofSize: 28, weight: .heavy) + timeLab.textColor = .white + timeLab.textAlignment = .center + timeLab.layoutChain.centerX(clockImage).centerY(clockImage, offset: 4) + + popupBtn.setTitle("弹出气泡", for: .normal) + popupBtn.setTitleColor(.white, for: .normal) + popupBtn.titleLabel?.font = FontManager.boboBold(18) + popupBtn.backgroundColor = UIColor(hexStr: "#16B3FF") + popupBtn.layer.cornerRadius = 16 + popupBtn.layoutChain.left(20).right(20).bottom(34).height(56) } - lazy var titleLab: UILabel = { - let label = UILabel() - label.text = "您的泡将在以下时间弹出:" - label.font = .systemFont(ofSize: 16, weight: .medium) - label.textColor = ThemeManager.shared.color.titleAuxColor - label.numberOfLines = 0 - return label - }() - - lazy var popupBtn: UIButton = { - let btn = UIButton(type: .custom) - btn.setTitle("弹出气泡", for: .normal) - btn.setTitleColor(.white, for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) - btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) - btn.cornerRadius = 25 - return btn - }() - - lazy var timeIcon: UIImageView = { - let view = UIImageView() - view.image = UIImage(named: "Bubble/time") - return view - }() - - lazy var timeLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 20, weight: .bold) - label.textColor = ThemeManager.shared.color.titleAuxColor - return label - }() - - lazy var iconView: UIImageView = { - let view = UIImageView(image: UIImage(named: "UserIcon/7")) - view.cornerRadius = 20 - return view - }() - - lazy var messageView: UIView = { - let view = UIView() - view.backgroundColor = UIColor(hexStr: "#EBF6F9") - view.cornerRadius = 10 - - view.addSubview(messageLab) - messageLab.layoutChain - .edgesHorzontal(18) - .edgesVertical(15) - - return view - }() - - lazy var messageLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 16, weight: .medium) - label.textColor = ThemeManager.shared.color.titleAuxColor - label.numberOfLines = 0 - return label - }() - - lazy var scrollView: UIScrollView = { - let view = UIScrollView() - view.backgroundColor = .clear - view.showsVerticalScrollIndicator = false - view.bounces = false - - let contentView = UIView() - contentView.backgroundColor = .clear - view.addSubview(contentView) - contentView.layoutChain.edges().widthToView(view) - - let textImgView = UIImageView() - textImgView.image = UIImage(named: "Bubble/text") - contentView.addSubview(textImgView) - textImgView.layoutChain - .edgesVertical() - .edgesHorzontal(30) - .heightToWidth(1450/630) - - return view - }() - override init(frame: CGRect) { super.init(frame: .zero) - self.isHidden = true backgroundColor = .white setupUI() - setupRx() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + deinit { countdownTimer?.invalidate() } - } diff --git a/QuickLocation/Section/Home/Bubble/CreateBubbleSetupView.swift b/QuickLocation/Section/Home/Bubble/CreateBubbleSetupView.swift new file mode 100644 index 00000000..6278fa35 --- /dev/null +++ b/QuickLocation/Section/Home/Bubble/CreateBubbleSetupView.swift @@ -0,0 +1,289 @@ +// +// CreateBubbleSetupView.swift +// QuickLocation +// + +import UIKit +import RxSwift +import RxCocoa +import SwiftDate + +/// 设置页:时长 picker + 同页底部通知 sheet +final class CreateBubbleSetupView: UIView { + + var disposeBag = DisposeBag() + let selectedHour = BehaviorRelay(value: 1) + var messageText: String = "" + + var onConfirmCreate: (() -> Void)? + var onSheetVisibilityChanged: ((Bool) -> Void)? + + private let hours = Array(1...6) + + let heroView = BubbleHeroView() + let confirmBtn = UIButton(type: .custom) + let sheetConfirmBtn = UIButton(type: .custom) + + private let subtitleLab = UILabel() + private let titleLab = UILabel() + private let pickerView = UIPickerView() + private let hourLab = UILabel() + + private let sheetOverlay = UIView() + private let sheetPanel = UIView() + private let pinIcon = UIImageView() + private let sheetTitleLab = UILabel() + private let messageView = UIView() + private let messageLab = UILabel() + private let previewAvatar = UIImageView() + private let tipStack = UIStackView() + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = .white + setupUI() + setupPicker() + setupSheet() + pickerView.selectRow(0, inComponent: 0, animated: false) + selectedHour.accept(hours[0]) + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + func showNotifySheet(message: String) { + messageText = message + messageLab.text = message + sheetOverlay.isHidden = false + sheetOverlay.alpha = 0 + sheetPanel.transform = CGAffineTransform(translationX: 0, y: 40) + onSheetVisibilityChanged?(true) + UIView.animate(withDuration: 0.28, delay: 0, options: .curveEaseOut) { + self.sheetOverlay.alpha = 1 + self.sheetPanel.transform = .identity + } + } + + func dismissNotifySheet() { + onSheetVisibilityChanged?(false) + UIView.animate(withDuration: 0.22, delay: 0, options: .curveEaseIn) { + self.sheetOverlay.alpha = 0 + self.sheetPanel.transform = CGAffineTransform(translationX: 0, y: 40) + } completion: { _ in + self.sheetOverlay.isHidden = true + } + } + + var isSheetVisible: Bool { !sheetOverlay.isHidden && sheetOverlay.alpha > 0.01 } + + private func setupUI() { + addSubview(heroView) + addSubview(titleLab) + addSubview(subtitleLab) + addSubview(pickerView) + addSubview(hourLab) + addSubview(confirmBtn) + + heroView.layoutChain + .top(33) + .leading(30) + .trailing(30) + .heightToWidth(1) + + titleLab.text = "您会在气泡待多久?" + titleLab.font = FontManager.boboBold(30) + titleLab.textColor = UIColor(hexStr: "#293445") + titleLab.textAlignment = .center + titleLab.layoutChain.topToBottomOfView(heroView, offset: 25).centerX() + + subtitleLab.text = "设置气泡时间" + subtitleLab.font = .systemFont(ofSize: 18, weight: .bold) + subtitleLab.textColor = UIColor(hexStr: "#9CA3AF") + subtitleLab.layoutChain.topToBottomOfView(titleLab, offset: 4).centerX() + + pickerView.layoutChain + .topToBottomOfView(subtitleLab, offset: 12) + .edgesHorzontal(15) + .height(180) + + hourLab.text = "小时" + hourLab.font = .systemFont(ofSize: 16, weight: .medium) + hourLab.textColor = UIColor(hexStr: "#16B3FF") + hourLab.layoutChain.centerX(self, offset: 100).centerY(pickerView) + + confirmBtn.setTitle("确定", for: .normal) + confirmBtn.setTitleColor(.white, for: .normal) + confirmBtn.titleLabel?.font = FontManager.boboBold(18) + confirmBtn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) + confirmBtn.layer.cornerRadius = 16 + confirmBtn.layoutChain.left(20).right(20).bottom(34).height(56) + } + + private func setupPicker() { + pickerView.delegate = self + pickerView.dataSource = self + pickerView.backgroundColor = .clear + } + + override func layoutSubviews() { + super.layoutSubviews() + clearPickerSelectionBackground() + } + + private func clearPickerSelectionBackground() { + pickerView.subviews.forEach { sub in + sub.backgroundColor = .clear + if sub.frame.height <= 1 { + sub.isHidden = true + } + } + } + + private func setupSheet() { + sheetOverlay.backgroundColor = UIColor.black.withAlphaComponent(0.45) + sheetOverlay.isHidden = true + addSubview(sheetOverlay) + sheetOverlay.layoutChain.edges() + + sheetPanel.backgroundColor = .white + sheetPanel.layer.cornerRadius = 24 + sheetPanel.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + sheetOverlay.addSubview(sheetPanel) + sheetPanel.layoutChain.edgesHorzontal().bottom() + + pinIcon.image = UIImage(named: "Bubble/pin") + pinIcon.contentMode = .scaleAspectFit + sheetPanel.addSubview(pinIcon) + pinIcon.layoutChain.top(-22).centerX().width(44).height(44) + + sheetTitleLab.text = "通知您的圈子" + sheetTitleLab.font = .systemFont(ofSize: 18, weight: .bold) + sheetTitleLab.textColor = UIColor(hexStr: "#293445") + sheetTitleLab.textAlignment = .center + sheetPanel.addSubview(sheetTitleLab) + sheetTitleLab.layoutChain.top(28).centerX() + + messageView.backgroundColor = UIColor(hexStr: "#EBF6F9") + messageView.layer.cornerRadius = 12 + sheetPanel.addSubview(messageView) + messageView.addSubview(messageLab) + messageLab.font = .systemFont(ofSize: 15, weight: .medium) + messageLab.textColor = UIColor(hexStr: "#293445") + messageLab.numberOfLines = 0 + messageLab.layoutChain.edgesHorzontal(16).edgesVertical(14) + + previewAvatar.contentMode = .scaleAspectFill + previewAvatar.clipsToBounds = true + previewAvatar.layer.cornerRadius = 18 + previewAvatar.layer.borderWidth = 2 + previewAvatar.layer.borderColor = UIColor.white.cgColor + let avatar = AppContextManager.shared.avaterIcon + previewAvatar.image = avatar.size.width > 0 ? avatar : UIImage(named: "Common/default_avatar") + sheetPanel.addSubview(previewAvatar) + + messageView.layoutChain + .topToBottomOfView(sheetTitleLab, offset: 20) + .left(24) + .right(72) + previewAvatar.layoutChain + .right(24) + .bottomToView(messageView) + .width(40) + .height(40) + + tipStack.axis = .vertical + tipStack.spacing = 12 + sheetPanel.addSubview(tipStack) + tipStack.layoutChain + .topToBottomOfView(messageView, offset: 16) + .edgesHorzontal(24) + + [ + "您的圈子成员只会看到您在气泡中。", + "当您在气泡中,将不会共享您的确切位置。" + ].forEach { tipStack.addArrangedSubview(makeTipRow($0)) } + + sheetConfirmBtn.setTitle("确定", for: .normal) + sheetConfirmBtn.setTitleColor(.white, for: .normal) + sheetConfirmBtn.titleLabel?.font = FontManager.boboBold(18) + sheetConfirmBtn.backgroundColor = UIColor(hexStr: "#16B3FF") + sheetConfirmBtn.layer.cornerRadius = 16 + sheetPanel.addSubview(sheetConfirmBtn) + sheetConfirmBtn.layoutChain + .topToBottomOfView(tipStack, offset: 20) + .edgesHorzontal(20) + .height(56) + .bottom(24 + kSafeBottomMargin) + + let tap = UITapGestureRecognizer(target: self, action: #selector(tapMask)) + sheetOverlay.addGestureRecognizer(tap) + } + + private func makeTipRow(_ text: String) -> UIView { + let row = UIView() + let star = UIImageView(image: UIImage(systemName: "sparkle")) + star.tintColor = UIColor(hexStr: "#16B3FF") + star.contentMode = .scaleAspectFit + let lab = UILabel() + lab.text = text + lab.font = .systemFont(ofSize: 14, weight: .medium) + lab.textColor = UIColor(hexStr: "#767676") + lab.numberOfLines = 0 + row.addSubview(star) + row.addSubview(lab) + star.layoutChain.left().top(2).width(14).height(14) + lab.layoutChain.leftToRightOfView(star, offset: 8).right().top().bottom() + return row + } + + @objc private func tapMask(_ gesture: UITapGestureRecognizer) { + let point = gesture.location(in: sheetPanel) + if sheetPanel.bounds.contains(point) { return } + dismissNotifySheet() + } + + func buildMessage(for hours: Int) -> String { + let endDate = Calendar.current.date(byAdding: .hour, value: hours, to: Date()) ?? Date() + let timeStr = endDate.toFormat("HH:mm") + return "\(timeStr)之前,我会一直在这个区域。如果需要我帮忙,请给我发消息。" + } +} + +extension CreateBubbleSetupView: UIPickerViewDataSource, UIPickerViewDelegate { + func numberOfComponents(in pickerView: UIPickerView) -> Int { 1 } + + func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + hours.count + } + + func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { 44 } + + func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { + let container = view as? UIView ?? UIView() + container.subviews.forEach { $0.removeFromSuperview() } + + let label = UILabel() + label.textAlignment = .center + label.font = .systemFont(ofSize: 20, weight: .medium) + let selected = row == pickerView.selectedRow(inComponent: component) + label.textColor = selected ? UIColor(hexStr: "#16B3FF") : UIColor(hexStr: "#999999") + label.text = "\(hours[row])" + container.addSubview(label) + label.layoutChain.center().width(60).height(36) + + if selected { + let capsule = UIView() + capsule.backgroundColor = UIColor(hexStr: "#E3F6FF") + capsule.layer.cornerRadius = 14 + container.insertSubview(capsule, at: 0) + capsule.layoutChain.center().width(130).height(36) + } + + return container + } + + func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + selectedHour.accept(hours[row]) + pickerView.reloadAllComponents() + clearPickerSelectionBackground() + } +} diff --git a/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift b/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift index 9be9aee6..b3164e3a 100644 --- a/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift +++ b/QuickLocation/Section/Home/Bubble/CreateBubbleVC.swift @@ -2,8 +2,6 @@ // CreateBubbleVC.swift // QuickLocation // -// Created by 八条 on 2026/6/26. -// import UIKit import RxSwift @@ -18,58 +16,85 @@ class CreateBubbleVC: BaseViewController { rootView = CreateBubbleView(frame: UIScreen.main.bounds) view = rootView } - - private var doneBtn: UIButton { - rootView.createBubbleTipsView.doneBtn - } - - private var popupBtn: UIButton { - rootView.createBubbleDoneView.popupBtn - } override func viewDidLoad() { super.viewDidLoad() - - doneBtn.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else { return } - - guard let systemConfig = AppContextManager.shared.systemConfig, systemConfig.isIntercept == false else { - let hours = self.rootView.createBubbleTiemView.selectedHour.value - requestSetBubble(enable: true, keep_time: hours) - return - } - - if AppContextManager.shared.vip > 1 { - let hours = self.rootView.createBubbleTiemView.selectedHour.value - requestSetBubble(enable: true, keep_time: hours) - } - else { - CreateBubblePopView.show() - } - }).disposed(by: disposeBag) - - popupBtn.rx.tap.subscribe(onNext: { [weak self] in - guard let self = self else { return } - self.showConfirmPop(title: "温馨提醒", - message: "您确定要弹出这个气泡吗?", - confirmText: "爆裂", - confirmBlock: { - self.requestSetBubble(enable: false, keep_time: -1) - }, cancelText: "取消") - }).disposed(by: disposeBag) - - guard AppContextManager.shared.status == 2, let endDate = Defaults[\.bubbleKeepTimes] else { return } - self.rootView.navView.titleLabel.text = "活动气泡" - self.rootView.createBubbleDoneView.messageLab.text = self.rootView.createBubbleTipsView.messageText - self.rootView.createBubbleTipsView.isHidden = true - self.rootView.createBubbleDoneView.isHidden = false - self.rootView.createBubbleDoneView.startCountdown(endDate: endDate) + bind() + restoreActiveBubbleIfNeeded() } - + + private func bind() { + rootView.navView.onBackTapped = { [weak self] in + self?.navigationController?.popViewController(animated: true) + } + + rootView.moreBtn.rx.tap + .subscribe(onNext: { [weak self] in + self?.navigationController?.pushViewController(BubbleKnowledgeVC(), animated: true) + }) + .disposed(by: disposeBag) + + rootView.setupView.confirmBtn.rx.tap + .subscribe(onNext: { [weak self] in + guard let self else { return } + let hours = self.rootView.setupView.selectedHour.value + let message = self.rootView.setupView.buildMessage(for: hours) + self.rootView.setupView.showNotifySheet(message: message) + }) + .disposed(by: disposeBag) + + rootView.setupView.onSheetVisibilityChanged = { [weak self] visible in + self?.rootView.updateNavTitleForSheet(visible) + } + + rootView.setupView.sheetConfirmBtn.rx.tap + .subscribe(onNext: { [weak self] in + self?.submitCreate() + }) + .disposed(by: disposeBag) + + rootView.doneView.popupBtn.rx.tap + .subscribe(onNext: { [weak self] in + self?.showConfirmPop( + title: "温馨提醒", + message: "您确定要弹出这个气泡吗?", + confirmText: "爆裂", + confirmBlock: { [weak self] in + self?.requestSetBubble(enable: false, keep_time: -1) + }, + cancelText: "取消" + ) + }) + .disposed(by: disposeBag) + } + + private func submitCreate() { + guard let systemConfig = AppContextManager.shared.systemConfig, systemConfig.isIntercept == false else { + let hours = rootView.setupView.selectedHour.value + requestSetBubble(enable: true, keep_time: hours) + return + } + + if AppContextManager.shared.vip > 1 { + let hours = rootView.setupView.selectedHour.value + requestSetBubble(enable: true, keep_time: hours) + } else { + CreateBubblePopView.show() + } + } + + private func restoreActiveBubbleIfNeeded() { + guard AppContextManager.shared.status == 2, + let endDate = Defaults[\.bubbleKeepTimes] else { return } + rootView.showDone(animated: false) + rootView.doneView.startCountdown(endDate: endDate) + } + private func requestSetBubble(enable: Bool, keep_time: Int) { DLToast.showLoading() - UserService.setBubble(enable: enable, keep_time: keep_time).subscribe(onNext: { response in + UserService.setBubble(enable: enable, keep_time: keep_time).subscribe(onNext: { [weak self] _ in DLToast.dismiss() + guard let self else { return } guard enable else { DLToast.show(text: "气泡已弹出") { Defaults[\.bubbleKeepTimes] = nil @@ -79,13 +104,11 @@ class CreateBubbleVC: BaseViewController { return } AppContextManager.shared.updateAccountStatus(2) - self.rootView.navView.titleLabel.text = "活动气泡" - self.rootView.createBubbleDoneView.messageLab.text = self.rootView.createBubbleTipsView.messageText + self.rootView.setupView.dismissNotifySheet() let endDate = Calendar.current.date(byAdding: .hour, value: keep_time, to: Date()) ?? Date() Defaults[\.bubbleKeepTimes] = endDate - self.rootView.createBubbleDoneView.startCountdown(endDate: endDate) - self.rootView.createBubbleTipsView.isHidden = true - self.rootView.createBubbleDoneView.isHidden = false - }).disposed(by: disposeBag) + self.rootView.doneView.startCountdown(endDate: endDate) + self.rootView.showDone(animated: true) + }, onError: { _ in }).disposed(by: disposeBag) } } diff --git a/QuickLocation/Section/Home/Bubble/CreateBubbleView.swift b/QuickLocation/Section/Home/Bubble/CreateBubbleView.swift index 0ce0921a..35ca0d89 100644 --- a/QuickLocation/Section/Home/Bubble/CreateBubbleView.swift +++ b/QuickLocation/Section/Home/Bubble/CreateBubbleView.swift @@ -2,8 +2,6 @@ // CreateBubbleView.swift // QuickLocation // -// Created by 八条 on 2026/6/26. -// import UIKit import RxSwift @@ -13,80 +11,83 @@ import SwiftDate class CreateBubbleView: UIView { var disposeBag = DisposeBag() - - var createBubbleTiemView: CreateBubbleTiemView = CreateBubbleTiemView() - var createBubbleTipsView: CreateBubbleTipsView = CreateBubbleTipsView() - var createBubbleDoneView: CreateBubbleDoneView = CreateBubbleDoneView() - - private func setupRx() { - createBubbleTiemView.onNextTap = { [weak self] in - guard let self = self else { return } - self.navView.titleLabel.text = "通知您的圈子" - let hours = self.createBubbleTiemView.selectedHour.value - let endDate = Calendar.current.date(byAdding: .hour, value: hours, to: Date()) ?? Date() - let timeStr = endDate.toFormat("HH:mm") - let message = "\(timeStr)之前,我会一直在这个区域。如果需要我帮忙,请给我发消息。" - self.createBubbleTipsView.messageLab.text = message - self.createBubbleTipsView.messageText = message - self.createBubbleTiemView.isHidden = true - self.createBubbleTipsView.isHidden = false - } - } - - private func setupUI() { - addSubview(createBubbleTiemView) - addSubview(createBubbleTipsView) - addSubview(createBubbleDoneView) - - addSubview(navBgView) - addSubview(navView) - - navBgView.layoutChain - .edges(excludingEdge: .bottom) - .heightToWidth(160/375) - - navView.layoutChain - .edges(excludingEdge: .bottom) - .height(kNaviHeight) - createBubbleTiemView.layoutChain - .topToBottomOfView(navView) - .edges(excludingEdge: .top) - - createBubbleTipsView.layoutChain - .topToBottomOfView(navView) - .edges(excludingEdge: .top) + let setupView = CreateBubbleSetupView() + let doneView = CreateBubbleDoneView() - createBubbleDoneView.layoutChain - .topToBottomOfView(navView) - .edges(excludingEdge: .top) - } + let moreBtn: UIButton = { + let btn = UIButton(type: .custom) + btn.setImage(UIImage(systemName: "ellipsis"), for: .normal) + btn.tintColor = UIColor(hexStr: "#293445") + btn.backgroundColor = UIColor.white.withAlphaComponent(0.9) + btn.layer.cornerRadius = 8 + btn.layer.borderWidth = 1 + btn.layer.borderColor = UIColor(hexStr: "#E8E8E8").cgColor + return btn + }() lazy var navBgView: UIImageView = { let iv = UIImageView() iv.image = UIImage(named: "Common/navBar_bg_2") iv.contentMode = .scaleAspectFill + iv.isHidden = true return iv }() - + lazy var navView: BaseNavigationView = { - let nav = BaseNavigationView(title: "设置气泡时间") - return nav + BaseNavigationView(title: "设置气泡时间") }() - - + override init(frame: CGRect) { - super.init(frame: .zero) + super.init(frame: frame) backgroundColor = .white setupUI() - setupRx() - createBubbleTiemView.isHidden = false - createBubbleTipsView.isHidden = true - createBubbleDoneView.isHidden = true + showSetup(animated: false) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } + private func setupUI() { + addSubview(navBgView) + addSubview(navView) + addSubview(setupView) + addSubview(doneView) + + navBgView.layoutChain.edges(excludingEdge: .bottom).heightToWidth(160 / 375) + navView.layoutChain.edges(excludingEdge: .bottom).height(kNaviHeight) + navView.addRightButton(moreBtn) + moreBtn.layoutChain.width(36).height(36) + + setupView.layoutChain.topToBottomOfView(navView).edges(excludingEdge: .top) + doneView.layoutChain.topToBottomOfView(navView).edges(excludingEdge: .top) + } + + func showSetup(animated: Bool) { + doneView.isHidden = true + setupView.isHidden = false + moreBtn.isHidden = false + navView.titleLabel.text = setupView.isSheetVisible ? "通知您的圈子" : "设置气泡时间" + if animated { + setupView.alpha = 0 + UIView.animate(withDuration: 0.25) { self.setupView.alpha = 1 } + } + } + + func showDone(animated: Bool) { + setupView.isHidden = true + doneView.isHidden = false + moreBtn.isHidden = false + navView.titleLabel.text = "活动气泡" + doneView.heroView.reloadAvatar() + if animated { + doneView.alpha = 0 + UIView.animate(withDuration: 0.25) { self.doneView.alpha = 1 } + } + } + + func updateNavTitleForSheet(_ visible: Bool) { + navView.titleLabel.text = visible ? "通知您的圈子" : "设置气泡时间" + } } diff --git a/QuickLocation/Section/Home/GroupMemberView2.swift b/QuickLocation/Section/Home/GroupMemberView2.swift index d954d74f..6fb55ebe 100644 --- a/QuickLocation/Section/Home/GroupMemberView2.swift +++ b/QuickLocation/Section/Home/GroupMemberView2.swift @@ -77,7 +77,7 @@ class GroupMemberView2: UIView { private func setupCurrentUserDeviceInfo() { phoneModelIcon.image = UIImage(named: "Home/member_phone") - phoneModelLab.text = Self.localPhoneModelName() + phoneModelLab.text = UIDevice.modelName phoneModelLab.textColor = Self.batteryDefaultTextColor networkIcon.image = UIImage(named: "Home/member_wifi") @@ -131,20 +131,8 @@ class GroupMemberView2: UIView { // MARK: - Local device helpers - private static func localPhoneModelName() -> String { - var systemInfo = utsname() - uname(&systemInfo) - let identifier = withUnsafePointer(to: &systemInfo.machine.0) { ptr in - String(cString: ptr) - } - return deviceModelMap[identifier] ?? "iPhone" - } - private static func localBatteryPercent() -> Int? { - UIDevice.current.isBatteryMonitoringEnabled = true - let level = UIDevice.current.batteryLevel - guard level >= 0 else { return nil } - return Int((level * 100).rounded()) + UIDevice.batteryPercent } private static func localNetworkStatusText() -> String { @@ -161,59 +149,6 @@ class GroupMemberView2: UIView { return "无网络" } - private static let deviceModelMap: [String: String] = [ - "iPhone10,1": "iPhone 8", - "iPhone10,4": "iPhone 8", - "iPhone10,2": "iPhone 8 Plus", - "iPhone10,5": "iPhone 8 Plus", - // iPhone X系列 - "iPhone10,3": "iPhone X", - "iPhone10,6": "iPhone X", - "iPhone11,2": "iPhone XS", - "iPhone11,4": "iPhone XS Max", - "iPhone11,6": "iPhone XS Max", - "iPhone11,8": "iPhone XR", - // iPhone11 - "iPhone12,1": "iPhone 11", - "iPhone12,3": "iPhone 11 Pro", - "iPhone12,5": "iPhone 11 Pro Max", - // iPhone12 - "iPhone13,1": "iPhone 12 mini", - "iPhone13,2": "iPhone 12", - "iPhone13,3": "iPhone 12 Pro", - "iPhone13,4": "iPhone 12 Pro Max", - // iPhone13 - "iPhone14,4": "iPhone 13 mini", - "iPhone14,5": "iPhone 13", - "iPhone14,2": "iPhone 13 Pro", - "iPhone14,3": "iPhone 13 Pro Max", - // iPhone14 - "iPhone14,7": "iPhone 14", - "iPhone14,8": "iPhone 14 Plus", - "iPhone15,2": "iPhone 14 Pro", - "iPhone15,3": "iPhone 14 Pro Max", - // iPhone15 - "iPhone15,4": "iPhone 15", - "iPhone15,5": "iPhone 15 Plus", - "iPhone16,1": "iPhone 15 Pro", - "iPhone16,2": "iPhone 15 Pro Max", - // iPhone16 - "iPhone17,1": "iPhone 16 Pro", - "iPhone17,2": "iPhone 16 Pro Max", - "iPhone17,3": "iPhone 16", - "iPhone17,4": "iPhone 16 Plus", - "iPhone17,5": "iPhone 16e", - // iPhone17 2025机型 - "iPhone18,1": "iPhone 17 Pro", - "iPhone18,2": "iPhone 17 Pro Max", - "iPhone18,3": "iPhone 17", - "iPhone18,4": "iPhone Air", - // Simulator - "i386": "Simulator", - "x86_64": "Simulator", - "arm64": "Simulator" - ] - private func setupRx() { NotificationCenter.default.addObserver( self, diff --git a/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailView.swift b/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailView.swift index 96be3d7c..74e2c1e5 100644 --- a/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailView.swift +++ b/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailView.swift @@ -58,6 +58,7 @@ final class PhoneReportDetailView: UIView { let deviceCard = UIView() let deviceNameLab = UILabel() let storageLab = UILabel() + let storageBarTrack = UIView() let storageBar = UIProgressView(progressViewStyle: .default) let deviceImage = UIImageView(image: UIImage(named: "Home/phone_device")) @@ -65,14 +66,18 @@ final class PhoneReportDetailView: UIView { let screenSection = PhoneReportChartSectionView( title: "屏幕使用时间", summaryPrefix: "今日使用时长", - barColor: UIColor(hexStr: "#5EC8FF"), - highlightColor: UIColor(hexStr: "#2F9BFF") + summaryColor: UIColor(hexStr: "#00ADFE"), + barGradient: (UIColor(hexStr: "#C0EAFF"), UIColor(hexStr: "#ECF9FF")), + highlightGradient: (UIColor(hexStr: "#16B3FF"), UIColor(hexStr: "#9EDFFF")), + tipColor: UIColor(hexStr: "#20B6FF") ) let unlockSection = PhoneReportChartSectionView( title: "手机使用次数", summaryPrefix: "今日使用次数", - barColor: UIColor(hexStr: "#B7E86A"), - highlightColor: UIColor(hexStr: "#83DE00"), + summaryColor: UIColor(hexStr: "#68C025"), + barGradient: (UIColor(hexStr: "#DDFFA1"), UIColor(hexStr: "#F2FFDC")), + highlightGradient: (UIColor(hexStr: "#AAF52A"), UIColor(hexStr: "#E8FFC1")), + tipColor: UIColor(hexStr: "#86E73D"), valueSuffix: "次" ) @@ -95,26 +100,29 @@ final class PhoneReportDetailView: UIView { navView.layoutChain.top().edgesHorzontal().height(kNaviHeight) navView.addRightButton(switchGroupBtn) - addSubview(memberCV) - memberCV.layoutChain - .topToBottomOfView(navView, offset: 8) - .edgesHorzontal(15) - .height(100) - addSubview(scrollView) scrollView.showsVerticalScrollIndicator = false + scrollView.clipsToBounds = true + scrollView.delaysContentTouches = false + scrollView.canCancelContentTouches = true scrollView.layoutChain - .topToBottomOfView(memberCV, offset: 12) + .topToBottomOfView(navView) .edgesHorzontal() .bottom() scrollView.addSubview(contentView) contentView.layoutChain.edges().widthToView(scrollView) + contentView.addSubview(memberCV) + memberCV.layoutChain + .top(8) + .edgesHorzontal(15) + .height(100) + statusTitleLab.text = "手机状态" statusTitleLab.font = .systemFont(ofSize: 16, weight: .bold) statusTitleLab.textColor = UIColor(hexStr: "#293445") contentView.addSubview(statusTitleLab) - statusTitleLab.layoutChain.top().left(15) + statusTitleLab.layoutChain.topToBottomOfView(memberCV, offset: 12).left(15) statusCard.backgroundColor = .white statusCard.applyPhoneReportCardStyle(cornerRadius: 20) @@ -136,10 +144,10 @@ final class PhoneReportDetailView: UIView { batteryRing.layoutChain.top(23).centerX().width(100).height(100) estimateLab.font = .systemFont(ofSize: 12, weight: .medium) - estimateLab.textColor = UIColor(hexStr: "#6B7280") + estimateLab.textColor = UIColor(hexStr: "#293445") estimateLab.textAlignment = .center - estimateLab.backgroundColor = UIColor(hexStr: "#E8EEF5") - estimateLab.cornerRadius = 10 + estimateLab.backgroundColor = UIColor(hexStr: "#FAFAFA") + estimateLab.cornerRadius = 5 leftPanel.addSubview(estimateLab) estimateLab.layoutChain .topToBottomOfView(batteryRing, offset: 12) @@ -177,16 +185,24 @@ final class PhoneReportDetailView: UIView { deviceCard.addSubview(storageLab) storageLab.layoutChain.topToBottomOfView(deviceNameLab, offset: 4).left(10) - storageBar.progressTintColor = UIColor(hexStr: "#5EC8FF") - storageBar.trackTintColor = UIColor(hexStr: "#E5E7EB") - deviceCard.addSubview(storageBar) - storageBar.layoutChain + storageBarTrack.backgroundColor = UIColor(hexStr: "#E0E0E0") + storageBarTrack.layer.cornerRadius = 5 + storageBarTrack.clipsToBounds = true + deviceCard.addSubview(storageBarTrack) + storageBarTrack.layoutChain .topToBottomOfView(storageLab, offset: 6) .left(10) .right(60) - .height(4) + .height(10) .bottom(10) + storageBar.progressTintColor = UIColor(hexStr: "#16B3FF") + storageBar.trackTintColor = UIColor(hexStr: "#16B3FF", alpha: 0.3) + storageBarTrack.addSubview(storageBar) + storageBar.layoutChain + .edgesHorzontal(3) + .centerY() + deviceImage.contentMode = .scaleAspectFit deviceCard.addSubview(deviceImage) deviceImage.layoutChain.right(8).centerY().width(36).height(54) @@ -204,7 +220,7 @@ final class PhoneReportDetailView: UIView { } func apply(_ snap: PhoneReportDetailViewModel.StatusSnapshot) { - batteryRing.configure(percent: snap.batteryPercent, text: snap.batteryText) + batteryRing.configure(percent: snap.batteryPercent, text: snap.batteryText, isCharging: snap.isCharging) estimateLab.text = "预计使用\(snap.estimateText)" brightnessCard.setValue(snap.brightnessText) volumeCard.setValue(snap.volumeText) @@ -212,8 +228,8 @@ final class PhoneReportDetailView: UIView { deviceNameLab.text = snap.deviceText storageLab.text = snap.storageText storageBar.progress = Float(snap.storageRatio) - screenSection.setSummary("\(screenSection.summaryPrefix) \(snap.screenTodayText)") - unlockSection.setSummary("\(unlockSection.summaryPrefix) \(snap.unlockTodayText)次") + screenSection.setSummary(snap.screenTodayText) + unlockSection.setSummary("\(snap.unlockTodayText)次") screenSection.setBars(snap.screenBars) unlockSection.setBars(snap.unlockBars) } @@ -274,8 +290,9 @@ final class PhoneBatteryRingView: UIView { progress.path = path.cgPath } - func configure(percent: Int?, text: String) { + func configure(percent: Int?, text: String, isCharging: Bool = false) { valueLab.text = text + bolt.isHidden = !isCharging progress.strokeEnd = CGFloat(max(0, min(100, percent ?? 0))) / 100 } } @@ -298,12 +315,12 @@ final class PhoneStatusMiniCard: UIView { titleLab.textColor = UIColor(hexStr: "#AAAAAA") titleLab.textAlignment = .center addSubview(titleLab) - titleLab.layoutChain.leftToRightOfView(icon, offset: 4).right(5) + titleLab.layoutChain.leftToRightOfView(icon, offset: 4).right(5, relation: .greaterThanOrEqual).centerY(icon) valueLab.font = .systemFont(ofSize: 16, weight: .medium) valueLab.textColor = UIColor(hexStr: "#293445") valueLab.textAlignment = .center addSubview(valueLab) - valueLab.layoutChain.topToBottomOfView(icon, offset: 19).edgesHorzontal(2).bottom(16) + valueLab.layoutChain.topToBottomOfView(icon, offset: 10).edgesHorzontal(2) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -316,20 +333,33 @@ final class PhoneStatusMiniCard: UIView { final class PhoneReportChartSectionView: UIView { let summaryPrefix: String private let titleLab = UILabel() + private let summaryPrefixLab = UILabel() private let summaryLab = UILabel() private let dayBtn = UIButton(type: .system) private let weekBtn = UIButton(type: .system) private let chart = PhoneReportBarChartView() - private let barColor: UIColor - private let highlightColor: UIColor + private let summaryColor: UIColor + private let barGradient: (UIColor, UIColor) + private let highlightGradient: (UIColor, UIColor) + private let tipColor: UIColor private let valueSuffix: String var onModeChanged: ((PhoneReportDetailViewModel.ChartMode) -> Void)? - init(title: String, summaryPrefix: String, barColor: UIColor, highlightColor: UIColor, valueSuffix: String = "") { + init( + title: String, + summaryPrefix: String, + summaryColor: UIColor, + barGradient: (UIColor, UIColor), + highlightGradient: (UIColor, UIColor), + tipColor: UIColor, + valueSuffix: String = "" + ) { self.summaryPrefix = summaryPrefix - self.barColor = barColor - self.highlightColor = highlightColor + self.summaryColor = summaryColor + self.barGradient = barGradient + self.highlightGradient = highlightGradient + self.tipColor = tipColor self.valueSuffix = valueSuffix super.init(frame: .zero) titleLab.text = title @@ -344,26 +374,43 @@ final class PhoneReportChartSectionView: UIView { addSubview(card) card.layoutChain.topToBottomOfView(titleLab, offset: 10).edgesHorzontal().bottom().height(180) - summaryLab.font = .systemFont(ofSize: 13, weight: .medium) - summaryLab.textColor = UIColor(hexStr: "#293445") - card.addSubview(summaryLab) - summaryLab.layoutChain.top(14).left(14) + summaryPrefixLab.text = summaryPrefix + summaryPrefixLab.font = .systemFont(ofSize: 12, weight: .medium) + summaryPrefixLab.textColor = UIColor(hexStr: "#293445") + summaryPrefixLab.setContentCompressionResistancePriority(.required, for: .horizontal) + card.addSubview(summaryPrefixLab) + summaryPrefixLab.layoutChain.top(14).left(14) configureToggle(dayBtn, title: "天", selected: true) configureToggle(weekBtn, title: "周", selected: false) let toggle = UIStackView(arrangedSubviews: [weekBtn, dayBtn]) toggle.axis = .horizontal toggle.spacing = 0 - toggle.backgroundColor = UIColor(hexStr: "#F3F4F6") - toggle.cornerRadius = 12 - card.addSubview(toggle) - toggle.layoutChain.centerY(summaryLab).right(14).height(28) + + let toggleBg = UIView() + toggleBg.backgroundColor = UIColor(hexStr: "#EAEAEA") + toggleBg.layer.cornerRadius = 16 + toggleBg.clipsToBounds = true + toggleBg.addSubview(toggle) + toggle.layoutChain.edges(UIEdgeInsets(top: 3, left: 3, bottom: 3, right: 3)) + + card.addSubview(toggleBg) + toggleBg.layoutChain.centerY(summaryPrefixLab).right(14).height(32) + + summaryLab.font = .systemFont(ofSize: 12, weight: .bold) + summaryLab.textColor = summaryColor + summaryLab.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) + card.addSubview(summaryLab) + summaryLab.layoutChain + .centerY(summaryPrefixLab) + .leftToRightOfView(summaryPrefixLab, offset: 4) + .rightToLeftOfView(toggleBg, offset: 8, relation: .lessThanOrEqual) dayBtn.addTarget(self, action: #selector(tapDay), for: .touchUpInside) weekBtn.addTarget(self, action: #selector(tapWeek), for: .touchUpInside) card.addSubview(chart) - chart.layoutChain.topToBottomOfView(summaryLab, offset: 16).edgesHorzontal(14).bottom(14) + chart.layoutChain.topToBottomOfView(summaryPrefixLab, offset: 16).edgesHorzontal(25).bottom(14) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -398,100 +445,174 @@ final class PhoneReportChartSectionView: UIView { } func setBars(_ bars: [PhoneReportDetailViewModel.ChartBar]) { - chart.configure(bars: bars, color: barColor, highlight: highlightColor, suffix: valueSuffix) + chart.configure( + bars: bars, + barGradient: barGradient, + highlightGradient: highlightGradient, + tipColor: tipColor, + suffix: valueSuffix + ) } } final class PhoneReportBarChartView: UIView { private var bars: [PhoneReportDetailViewModel.ChartBar] = [] - private var color: UIColor = .systemBlue - private var highlight: UIColor = .systemBlue + private var barGradient: (UIColor, UIColor) = (.systemBlue, .systemBlue) + private var highlightGradient: (UIColor, UIColor) = (.systemBlue, .systemBlue) + private var tipColor: UIColor = .systemBlue private var suffix = "" private var barLayers: [CALayer] = [] private var labelViews: [UILabel] = [] - private var tipLab = UILabel() + private var barFrames: [CGRect] = [] + private var selectedIndex: Int? + private var barSpacing: CGFloat = 0 + private var baselineY: CGFloat = 0 + private let tipLab = UILabel() + private let baseline = UIView() override init(frame: CGRect) { super.init(frame: frame) + clipsToBounds = false + isUserInteractionEnabled = true + baseline.backgroundColor = UIColor(hexStr: "#F2F2F2") + addSubview(baseline) tipLab.font = .systemFont(ofSize: 11, weight: .bold) tipLab.textColor = .white - tipLab.backgroundColor = UIColor(hexStr: "#2F9BFF") tipLab.textAlignment = .center - tipLab.cornerRadius = 8 + tipLab.cornerRadius = 6 tipLab.clipsToBounds = true tipLab.isHidden = true + tipLab.isUserInteractionEnabled = false addSubview(tipLab) + + let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) + addGestureRecognizer(tap) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - func configure(bars: [PhoneReportDetailViewModel.ChartBar], color: UIColor, highlight: UIColor, suffix: String) { + func configure( + bars: [PhoneReportDetailViewModel.ChartBar], + barGradient: (UIColor, UIColor), + highlightGradient: (UIColor, UIColor), + tipColor: UIColor, + suffix: String + ) { + let previous = self.bars self.bars = bars - self.color = color - self.highlight = highlight + self.barGradient = barGradient + self.highlightGradient = highlightGradient + self.tipColor = tipColor self.suffix = suffix + let dataChanged = previous.count != bars.count + || zip(previous, bars).contains { $0.label != $1.label || $0.value != $1.value } + if dataChanged || selectedIndex == nil { + selectedIndex = bars.firstIndex(where: \.isToday) ?? (bars.isEmpty ? nil : bars.count - 1) + } setNeedsLayout() } + @objc private func handleTap(_ gesture: UITapGestureRecognizer) { + let point = gesture.location(in: self) + guard !barFrames.isEmpty else { return } + for (i, frame) in barFrames.enumerated() { + let hitX = frame.minX - barSpacing / 2 + let hitW = frame.width + barSpacing + let hit = CGRect(x: hitX, y: 0, width: hitW, height: max(baselineY, bounds.height)) + if hit.contains(point) { + guard selectedIndex != i else { return } + selectedIndex = i + setNeedsLayout() + return + } + } + } + override func layoutSubviews() { super.layoutSubviews() barLayers.forEach { $0.removeFromSuperlayer() } barLayers.removeAll() labelViews.forEach { $0.removeFromSuperview() } labelViews.removeAll() + barFrames.removeAll() tipLab.isHidden = true - guard !bars.isEmpty else { return } + guard !bars.isEmpty else { + baseline.isHidden = true + return + } + baseline.isHidden = false let maxVal = max(bars.map(\.value).max() ?? 1, 1) let count = bars.count let labelH: CGFloat = 16 let chartH = bounds.height - labelH - 24 - let spacing: CGFloat = 8 - let barW = max(8, (bounds.width - spacing * CGFloat(count - 1)) / CGFloat(count)) + let barW: CGFloat = 16 + barSpacing = count > 1 + ? max(0, (bounds.width - barW * CGFloat(count)) / CGFloat(count - 1)) + : 0 + baselineY = bounds.height - labelH + baseline.frame = CGRect(x: 0, y: baselineY - 0.5, width: bounds.width, height: 1) + + if selectedIndex == nil || selectedIndex! >= count { + selectedIndex = bars.firstIndex(where: \.isToday) ?? count - 1 + } for (i, bar) in bars.enumerated() { let ratio = CGFloat(bar.value) / CGFloat(maxVal) let h = max(4, chartH * max(0.05, ratio)) - let x = CGFloat(i) * (barW + spacing) - let y = bounds.height - labelH - h - let layer = CALayer() - layer.frame = CGRect(x: x, y: y, width: barW, height: h) - layer.backgroundColor = (bar.isToday ? highlight : color.withAlphaComponent(0.35)).cgColor - layer.cornerRadius = 4 - self.layer.addSublayer(layer) - barLayers.append(layer) + let x = CGFloat(i) * (barW + barSpacing) + let y = baselineY - h + let barFrame = CGRect(x: x, y: y, width: barW, height: h) + barFrames.append(barFrame) + + let isSelected = i == selectedIndex + let gradient = CAGradientLayer() + gradient.frame = barFrame + let colors = isSelected ? highlightGradient : barGradient + gradient.colors = [colors.0.cgColor, colors.1.cgColor] + gradient.startPoint = CGPoint(x: 0.5, y: 0) + gradient.endPoint = CGPoint(x: 0.5, y: 1) + gradient.cornerRadius = 4 + layer.insertSublayer(gradient, below: tipLab.layer) + barLayers.append(gradient) let lab = UILabel() lab.text = bar.label lab.font = .systemFont(ofSize: 10, weight: .medium) lab.textColor = UIColor(hexStr: "#9CA3AF") lab.textAlignment = .center - lab.frame = CGRect(x: x - 6, y: bounds.height - labelH, width: barW + 12, height: labelH) - addSubview(lab) + lab.frame = CGRect(x: x - 10, y: bounds.height - labelH, width: barW + 20, height: labelH) + insertSubview(lab, belowSubview: tipLab) labelViews.append(lab) - if bar.isToday, bar.value > 0 { - let hours = bar.value / 3600 - let mins = (bar.value % 3600) / 60 - let text: String - if suffix == "次" { - text = "\(bar.value)次" - } else if hours > 0 { - text = mins > 0 ? "\(hours)h \(mins)m" : "\(hours)h" - } else { - text = "\(mins)m" - } - tipLab.text = " \(text) " + if isSelected { + tipLab.text = tipText(for: bar) + tipLab.backgroundColor = tipColor tipLab.sizeToFit() + let tipW = tipLab.bounds.width + 5 + 5 + let tipH = tipLab.bounds.height + 4 + 4 + // 与柱子水平居中,允许超出 chart 左右边界 tipLab.frame = CGRect( - x: max(0, x + barW / 2 - tipLab.bounds.width / 2 - 6), - y: max(0, y - 22), - width: tipLab.bounds.width + 12, - height: 18 + x: x + barW / 2 - tipW / 2, + y: max(0, y - tipH - 4), + width: tipW, + height: tipH ) - tipLab.backgroundColor = highlight tipLab.isHidden = false } } + bringSubviewToFront(tipLab) + } + + private func tipText(for bar: PhoneReportDetailViewModel.ChartBar) -> String { + if suffix == "次" { + return "\(bar.value)次" + } + let hours = bar.value / 3600 + let mins = (bar.value % 3600) / 60 + if hours > 0 { + return mins > 0 ? "\(hours)h \(mins)m" : "\(hours)h" + } + return "\(mins)m" } } diff --git a/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailViewModel.swift b/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailViewModel.swift index 7c92f1d2..4e7fae57 100644 --- a/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailViewModel.swift +++ b/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailViewModel.swift @@ -26,9 +26,10 @@ final class PhoneReportDetailViewModel { let isToday: Bool } - struct StatusSnapshot { + struct StatusSnapshot { let batteryText: String let batteryPercent: Int? + let isCharging: Bool let estimateText: String let brightnessText: String let volumeText: String @@ -46,6 +47,7 @@ final class PhoneReportDetailViewModel { StatusSnapshot( batteryText: batteryText, batteryPercent: batteryPercent, + isCharging: isCharging, estimateText: estimateText, brightnessText: brightnessText, volumeText: volumeText ?? self.volumeText, @@ -73,6 +75,7 @@ final class PhoneReportDetailViewModel { private var volumeObservation: NSKeyValueObservation? init(members: [GroupMemberModel], selectedUserId: String) { + UIDevice.current.isBatteryMonitoringEnabled = true self.members = members self.selectedMemberId = BehaviorRelay(value: selectedUserId) self.snapshot = BehaviorRelay(value: Self.emptySnapshot()) @@ -114,6 +117,20 @@ final class PhoneReportDetailViewModel { }) .disposed(by: disposeBag) + // 与系统状态栏同步:电量 / 充电状态变化时刷新 + let batteryCenter = NotificationCenter.default + Observable.merge( + batteryCenter.rx.notification(UIDevice.batteryLevelDidChangeNotification), + batteryCenter.rx.notification(UIDevice.batteryStateDidChangeNotification) + ) + .observe(on: MainScheduler.instance) + .subscribe(onNext: { [weak self] _ in + guard let self else { return } + guard self.selectedMemberId.value == AppContextManager.shared.userId else { return } + self.refresh(userId: self.selectedMemberId.value) + }) + .disposed(by: disposeBag) + observeSystemVolume() } @@ -143,16 +160,13 @@ final class PhoneReportDetailViewModel { private func makeSelfSnapshot() -> StatusSnapshot { let mgr = UnlockCountManager.shared - UIDevice.current.isBatteryMonitoringEnabled = true - let batteryLevel = UIDevice.current.batteryLevel - let batteryValid = batteryLevel >= 0 - let battery = Int(batteryLevel * 100) + let batteryPercent = UIDevice.batteryPercent + let isCharging = UIDevice.isBatteryCharging let screenSec = mgr.todayScreenTimeSeconds let unlock = mgr.todayCount let usage = mgr.todayAppUsageCount - let batteryText = batteryValid ? "\(battery)%" : placeholder - let batteryPercent: Int? = batteryValid ? battery : nil + let batteryText = batteryPercent.map { "\($0)%" } ?? placeholder let brightnessText = Self.brightnessText() ?? placeholder let volumeText = Self.volumeText() ?? placeholder let wifiText = Self.wifiSSID() ?? placeholder @@ -174,11 +188,12 @@ final class PhoneReportDetailViewModel { return StatusSnapshot( batteryText: batteryText, batteryPercent: batteryPercent, + isCharging: isCharging, estimateText: placeholder, brightnessText: brightnessText, volumeText: volumeText, wifiText: wifiText, - deviceText: UIDevice.current.model, + deviceText: UIDevice.modelName, storageText: storageText, storageRatio: storageRatio, screenTodayText: screenTodayText, @@ -195,6 +210,7 @@ final class PhoneReportDetailViewModel { return StatusSnapshot( batteryText: hasBattery ? "\(battery)%" : placeholder, batteryPercent: hasBattery ? battery : nil, + isCharging: false, estimateText: placeholder, brightnessText: placeholder, volumeText: placeholder, @@ -214,6 +230,7 @@ final class PhoneReportDetailViewModel { StatusSnapshot( batteryText: "**", batteryPercent: nil, + isCharging: false, estimateText: "**", brightnessText: "**", volumeText: "**", @@ -295,68 +312,145 @@ final class PhoneReportDetailViewModel { } } - private static func storageText() -> String? { + /// 与「设置 → 通用 → iPhone 存储空间」一致:十进制 GB + ImportantUsage 可用容量 + private static func storageBytes() -> (used: Int64, total: Int64)? { + let url = URL(fileURLWithPath: NSHomeDirectory()) + let keys: Set = [ + .volumeTotalCapacityKey, + .volumeAvailableCapacityForImportantUsageKey + ] guard - let attrs = try? FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory()), - let total = attrs[.systemSize] as? NSNumber, - let free = attrs[.systemFreeSize] as? NSNumber + let values = try? url.resourceValues(forKeys: keys), + let total = values.volumeTotalCapacity, + let available = values.volumeAvailableCapacityForImportantUsage, + total > 0 else { return nil } - let used = total.doubleValue - free.doubleValue - let usedGB = used / 1_073_741_824 - let totalGB = total.doubleValue / 1_073_741_824 - return String(format: "%.1fGB/%.0fGB", usedGB, totalGB) + let used = max(0, Int64(total) - available) + return (used, Int64(total)) + } + + private static func formatStorageGB(_ bytes: Int64, fractionDigits: Int) -> String { + // Settings 使用十进制(1GB = 1e9),128G 机型会显示约 128GB 而非 119GB + let gb = Double(bytes) / 1_000_000_000 + return String(format: "%.\(fractionDigits)fGB", gb) + } + + private static func storageText() -> String? { + guard let info = storageBytes() else { return nil } + let usedText = formatStorageGB(info.used, fractionDigits: 1) + let totalText = formatStorageGB(info.total, fractionDigits: 0) + return "\(usedText)/\(totalText)" } private static func storageRatio() -> CGFloat? { - guard - let attrs = try? FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory()), - let total = attrs[.systemSize] as? NSNumber, - let free = attrs[.systemFreeSize] as? NSNumber, - total.doubleValue > 0 - else { return nil } - return CGFloat((total.doubleValue - free.doubleValue) / total.doubleValue) + guard let info = storageBytes(), info.total > 0 else { return nil } + return CGFloat(Double(info.used) / Double(info.total)) } private static func screenBars(from mgr: UnlockCountManager, mode: ChartMode) -> [ChartBar] { - let calendar = Calendar.current - let today = calendar.startOfDay(for: Date()) - let formatter = DateFormatter() - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.dateFormat = "yyyy-MM-dd" let byDay = Defaults[\.screenTimeByDay] - - return (0..<7).map { offset -> ChartBar in - let dayOffset = offset - 6 - let date = calendar.date(byAdding: .day, value: dayOffset, to: today) ?? today - let key = formatter.string(from: date) - let label = formatter.string(from: date).suffix(5).replacingOccurrences(of: "-", with: "/") - let value: Int - if dayOffset == 0 { - value = mgr.todayScreenTimeSeconds - } else { - value = byDay[key] ?? 0 - } - // week mode: keep same day bars for now (UI toggle still works) - _ = mode - return ChartBar(label: String(label), value: value, isToday: dayOffset == 0) + let todayValue = mgr.todayScreenTimeSeconds + switch mode { + case .day: + return dayBars(byDay: byDay, todayValue: todayValue, labelStyle: .monthDaySlash) + case .week: + return weekBars(byDay: byDay, todayValue: todayValue) } } private static func unlockBars(unlock: Int, mode: ChartMode) -> [ChartBar] { + var byDay = Defaults[\.unlockCountByDay] + let todayKey = dayKey(for: Date()) + byDay[todayKey] = unlock + switch mode { + case .day: + return dayBars(byDay: byDay, todayValue: unlock, labelStyle: .monthDay) + case .week: + return weekBars(byDay: byDay, todayValue: unlock) + } + } + + private enum DayLabelStyle { + case monthDaySlash // 08/04 + case monthDay // 8/4 + } + + private static func dayKey(for date: Date) -> String { + let formatter = DateFormatter() + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.calendar = Calendar.current + formatter.timeZone = TimeZone.current + formatter.dateFormat = "yyyy-MM-dd" + return formatter.string(from: date) + } + + private static func dayBars( + byDay: [String: Int], + todayValue: Int, + labelStyle: DayLabelStyle + ) -> [ChartBar] { let calendar = Calendar.current let today = calendar.startOfDay(for: Date()) - let formatter = DateFormatter() - formatter.dateFormat = "M/d" + let labelFormatter = DateFormatter() + labelFormatter.locale = Locale(identifier: "en_US_POSIX") + switch labelStyle { + case .monthDaySlash: + labelFormatter.dateFormat = "MM/dd" + case .monthDay: + labelFormatter.dateFormat = "M/d" + } + return (0..<7).map { offset -> ChartBar in let dayOffset = offset - 6 let date = calendar.date(byAdding: .day, value: dayOffset, to: today) ?? today + let key = dayKey(for: date) let isToday = dayOffset == 0 - _ = mode + let value = isToday ? todayValue : (byDay[key] ?? 0) return ChartBar( - label: formatter.string(from: date), - value: isToday ? unlock : 0, + label: labelFormatter.string(from: date), + value: value, isToday: isToday ) } } + + /// 近 7 周:每周一根柱,值为该周内按日数据之和;label 为周起始日 M/d + private static func weekBars(byDay: [String: Int], todayValue: Int) -> [ChartBar] { + let calendar = Calendar.current + let today = calendar.startOfDay(for: Date()) + guard let currentWeek = calendar.dateInterval(of: .weekOfYear, for: today) else { + return dayBars(byDay: byDay, todayValue: todayValue, labelStyle: .monthDay) + } + let labelFormatter = DateFormatter() + labelFormatter.locale = Locale(identifier: "en_US_POSIX") + labelFormatter.dateFormat = "M/d" + let todayKey = dayKey(for: today) + + return (0..<7).map { offset -> ChartBar in + let weekOffset = offset - 6 + let weekStart = calendar.date(byAdding: .weekOfYear, value: weekOffset, to: currentWeek.start) + ?? currentWeek.start + let weekInterval = calendar.dateInterval(of: .weekOfYear, for: weekStart) + ?? DateInterval(start: weekStart, duration: 7 * 24 * 3600) + + var sum = 0 + var cursor = weekInterval.start + while cursor < weekInterval.end { + let key = dayKey(for: cursor) + if key == todayKey { + sum += todayValue + } else { + sum += byDay[key] ?? 0 + } + guard let next = calendar.date(byAdding: .day, value: 1, to: cursor) else { break } + cursor = next + } + + return ChartBar( + label: labelFormatter.string(from: weekInterval.start), + value: sum, + isToday: weekOffset == 0 + ) + } + } } diff --git a/QuickLocation/Section/Home/SearchLocation/SearchLocationHeaderView.swift b/QuickLocation/Section/Home/SearchLocation/SearchLocationHeaderView.swift new file mode 100644 index 00000000..e6063d32 --- /dev/null +++ b/QuickLocation/Section/Home/SearchLocation/SearchLocationHeaderView.swift @@ -0,0 +1,164 @@ +// +// SearchLocationHeaderView.swift +// QuickLocation +// + +import UIKit + +/// 查位置页共用顶部:hero + 使用人数 + 双标题 + 跑马灯 +final class SearchLocationHeaderView: UIView { + + let usageLab = UILabel() + let headlineLab = UILabel() + let subheadLab = UILabel() + let marqueeScrollView = UIScrollView() + + /// 猫插画 + 装饰合图;有切图时设 image 并清空 backgroundColor + let heroImageView = UIImageView() + + override init(frame: CGRect) { + super.init(frame: frame) + setupUI() + setupMarquee() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + func startMarqueeAnimation() { + marqueeScrollView.layer.removeAllAnimations() + marqueeScrollView.contentOffset.x = 0 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + guard let self = self else { return } + let contentW = self.marqueeScrollView.contentSize.width + guard contentW > self.marqueeScrollView.bounds.width else { return } + let duration = contentW / 100 + UIView.animate(withDuration: duration, delay: 0, options: [.curveLinear, .repeat]) { + self.marqueeScrollView.contentOffset.x = contentW - self.marqueeScrollView.bounds.width + } + } + } + + private func setupUI() { + addSubview(heroImageView) + addSubview(usageLab) + addSubview(headlineLab) + addSubview(subheadLab) + addSubview(marqueeScrollView) + + heroImageView.backgroundColor = UIColor(hexStr: "#FFD54F") + heroImageView.contentMode = .scaleAspectFit + heroImageView.layoutChain + .top() + .edgesHorzontal(24) + .heightToWidth(220 / 327) + + let count = Int.random(in: 8000...15000) + let usageText = "有 \(count) 人正在使用此功能" + let attr = NSMutableAttributedString(string: usageText) + if let range = usageText.range(of: "\(count)") { + attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#16B3FF"), + range: NSRange(range, in: usageText)) + } + usageLab.attributedText = attr + usageLab.font = .systemFont(ofSize: 14, weight: .medium) + usageLab.textColor = UIColor(hexStr: "#999999") + usageLab.textAlignment = .center + usageLab.layoutChain + .topToBottomOfView(heroImageView, offset: 8) + .centerX() + + headlineLab.text = "实时查看TA的位置" + headlineLab.font = FontManager.boboBold(30) + headlineLab.textColor = UIColor(hexStr: "#293445") + headlineLab.textAlignment = .center + headlineLab.layoutChain + .topToBottomOfView(usageLab, offset: 16) + .centerX() + + subheadLab.text = "为你安心守护出行安全" + subheadLab.font = .systemFont(ofSize: 18, weight: .bold) + subheadLab.textColor = UIColor(hexStr: "#293445") + subheadLab.textAlignment = .center + subheadLab.layoutChain + .topToBottomOfView(headlineLab, offset: 6) + .centerX() + + marqueeScrollView.backgroundColor = .clear + marqueeScrollView.showsHorizontalScrollIndicator = false + marqueeScrollView.isScrollEnabled = false + marqueeScrollView.layoutChain + .topToBottomOfView(subheadLab, offset: 12) + .edgesHorzontal() + .height(36) + .bottom() + } + + private func randomPhoneNumber() -> String { + let prefixes = [ + "134","135","136","137","138","139","147","150","151","152","157","158","159","178","182","183","184","187","188","198", + "130","131","132","145","155","156","166","175","176","185","186","196", + "133","149","153","173","177","180","181","189","191","199" + ] + let prefix = prefixes.randomElement()! + var suffix = "" + for _ in 0..<8 { suffix.append("\(Int.random(in: 0...9))") } + return prefix + suffix + } + + private func setupMarquee() { + let surnames = ["张", "李", "王", "陈", "刘", "杨", "赵", "黄", "周", "吴", + "林", "何", "马", "胡", "郑", "梁", "谢", "宋", "唐", "韩"] + let container = UIView() + container.backgroundColor = .clear + marqueeScrollView.addSubview(container) + + var prevView: UIView? + for _ in 0..<10 { + let iconIndex = Int.random(in: 1...15) + let surname = surnames.randomElement() ?? "张" + let maskedName = "\(surname)**" + let phone = randomPhoneNumber() + let maskedPhone = phone.prefix(3) + "******" + phone.suffix(2) + + let itemView = UIView() + itemView.backgroundColor = UIColor(hexStr: "#EFF9FF") + itemView.cornerRadius = 8 + container.addSubview(itemView) + + let avatar = UIImageView(image: UIImage(named: "UserIcon/\(iconIndex)")) + avatar.contentMode = .scaleAspectFill + avatar.backgroundColor = UIColor(hexStr: "#E0E0E0") + avatar.cornerRadius = 12 + avatar.clipsToBounds = true + itemView.addSubview(avatar) + + let label = UILabel() + label.font = .systemFont(ofSize: 13, weight: .medium) + let fullText = "\(maskedName) 定位到了 \(maskedPhone)" + let attr = NSMutableAttributedString(string: fullText) + attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#16B3FF"), + range: NSRange(fullText.range(of: maskedName)!, in: fullText)) + if let phoneRange = fullText.range(of: maskedPhone) { + attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#16B3FF"), + range: NSRange(phoneRange, in: fullText)) + } + label.attributedText = attr + itemView.addSubview(label) + + avatar.layoutChain.left(10).centerY().width(24).height(24) + label.layoutChain.leftToRightOfView(avatar, offset: 6).centerY().right(10) + itemView.layoutChain.centerY().height(30) + + if let prev = prevView { + itemView.layoutChain.leftToRightOfView(prev, offset: 16) + } else { + itemView.layoutChain.left() + } + prevView = itemView + } + + if let last = prevView { + container.layoutChain.edges().heightToView(marqueeScrollView).rightToView(last) + } + } +} diff --git a/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift b/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift index f08f0818..7efe47ca 100644 --- a/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift +++ b/QuickLocation/Section/Home/SearchLocation/SearchLocationResultVC.swift @@ -2,138 +2,153 @@ // SearchLocationResultVC.swift // QuickLocation // -// Created by 八条 on 2026/6/27. -// import UIKit import RxSwift import RxCocoa -import Lottie +import ObjectMapper +import URLNavigator class SearchLocationResultVC: BaseViewController { - + fileprivate var rootView: SearchLocationResultView! override func loadView() { rootView = SearchLocationResultView(frame: UIScreen.main.bounds) view = rootView } - + private let phone: String private let code: Int - private let memberData: [String : Any] + private let memberData: [String: Any] private var groupModel: GroupModel? override func viewDidLoad() { super.viewDidLoad() - rootView.unlockVipView.isHidden = AppContextManager.shared.vip > 1 - AppContextManager.shared.vip > 1 ? nil : rootView.unlockVipLottieView.play() + let isVip = AppContextManager.shared.vip > 1 + rootView.unlockVipView.isHidden = isVip + rootView.scrollView.isHidden = !isVip reactiveAction() requestPhoneArea() } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + rootView.startMarqueeAnimation() + } + private func reactiveAction() { - rootView.successBtn.rx.tap.subscribe(onNext: { _ in - if self.code == 0 { // 去查看 + rootView.actionBtn.rx.tap.subscribe(onNext: { _ in + switch self.code { + case 0: NotificationCenter.default.post(name: .ShowMemberLocationNotification, object: nil, userInfo: self.memberData) - AppRouter.shared.popToRoot() - } - else { // 邀请Ta → 弹出圈子选择 - guard let model = self.groupModel else { - self.requestGroupInfo(showPicker: true) - return + self.navigationController?.popToRootViewController(animated: true) + if let tab = self.tabBarController as? MainTabBarController + ?? UIViewController.topMost?.tabBarController as? MainTabBarController { + tab.selectTab(at: 0) } - GroupChooseView.show(groupModel: model) { _ in } + case 20004: + SharePopView.show() + case 20005: + self.showGroupPicker() + default: + break } }).disposed(by: disposeBag) - - rootView.inviteBtn.rx.tap.subscribe(onNext: { _ in - guard let model = self.groupModel else { - self.requestGroupInfo(showPicker: true) - return - } - GroupChooseView.show(groupModel: model) { _ in } - }).disposed(by: disposeBag) } - + + private func showGroupPicker() { + guard let model = groupModel else { + requestGroupInfo(showPicker: true) + return + } + presentGroupPicker(with: model) + } + + private func presentGroupPicker(with model: GroupModel) { + GroupListPopView.show(groupModel: model) { groupKey in + guard let key = groupKey, + let groupInfo = model.groups.first(where: { $0.group_key == key })?.toJSON() else { return } + AppRouter.push(Route.inviteJoin, userInfo: ["groupInfo": groupInfo]) + } + } + + private func shareApp() { + let text = "快来极速定位,实时守护家人出行安全" + let activity = UIActivityViewController(activityItems: [text], applicationActivities: nil) + present(activity, animated: true) + } + private func handleCode() { guard AppContextManager.shared.vip > 1 else { return } - - var fileName = "" - var message = "" - var tips = "" + + rootView.actionBtn.isHidden = true + rootView.inviteView.isHidden = true + switch code { - case 0: // 圈子成员 - fileName = "phone_search_success" - message = "定位成功" - tips = "点击去查看可获得具体位置" - rootView.inviteView.isHidden = false - rootView.successTipsLab.text = "已获得具体位置" - rootView.successBtn.setTitle("去查看", for: .normal) - rootView.phoneLab.text = phone - rootView.successLottieView.play() - case 20004: // 未注册 - fileName = "phone_search_fail" - message = "此用户未注册" - tips = "根据最新的相关法规,需用户双方均安装该APP才可实现定位,未安装APP的用户将不再提供具体定位功能。" - rootView.inviteBtn.isHidden = false - case 20005: // 不在一个圈子里 - fileName = "phone_search_success" - message = "定位成功" - tips = "根据最新的相关法规,您查询的用户与您不在同一个圈子时, 不再提供具体的位置定位,邀请ta加入你的圈子后可随时查看位置。" - rootView.inviteView.isHidden = false - rootView.successTipsLab.text = "邀请加入圈子后分享位置" - rootView.successBtn.setTitle("邀请他", for: .normal) - rootView.phoneLab.text = phone - rootView.successLottieView.play() + case 0: + rootView.configureResult( + status: "定位成功", + disclaimer: "点击去查看可获得具体位置", + showInviteRow: false + ) + rootView.actionBtn.setTitle("去查看", for: .normal) + rootView.actionBtn.isHidden = false + case 20004: + rootView.configureResult( + status: "用户未注册", + disclaimer: "根据最新的相关法规,需用户双方均安装该APP才可实现定位,未安装APP的用户将不再提供具体定位功能。", + showInviteRow: false + ) + rootView.actionBtn.setTitle("分享", for: .normal) + rootView.actionBtn.isHidden = false + case 20005: + rootView.configureResult( + status: "定位成功", + disclaimer: "根据最新的相关法规,您查询的用户与您不在同一个圈子时, 不再提供具体的位置定位,邀请ta加入你的圈子后可随时查看位置。", + showInviteRow: false + ) + rootView.actionBtn.setTitle("邀请TA加入", for: .normal) + rootView.actionBtn.isHidden = false requestGroupInfo() default: break } - - if let path = Bundle.main.path(forResource: fileName, ofType: "json") { - self.rootView.normalLottieView.animation = LottieAnimation.filepath(path) - self.rootView.normalLottieView.play() - } - self.rootView.messageLab.text = message - self.rootView.tipsLab.text = tips } - - // MARK: - 手机号归属地 + private func requestPhoneArea() { SystemService.phoneArea(phone: phone).subscribe(onNext: { response in guard let data = response.data else { return } self.handleCode() let province = data["Province"].safeString let city = data["City"].safeString - self.rootView.phoneAreaLab.text = "\(province)·\(city)" - self.rootView.unlockVipPhoneAreaLab.text = "\(province)·\(city)" + let area = "\(province)·\(city)" + self.rootView.phoneAreaLab.text = area + self.rootView.unlockVipPhoneAreaLab.text = area }).disposed(by: disposeBag) } - - // MARK: - 圈子列表 + private func requestGroupInfo(showPicker: Bool = false) { GroupService.groupInfo().subscribe { [weak self] response in guard let self = self, let model = response.model else { return } self.groupModel = model if showPicker { - GroupChooseView.show(groupModel: model) { _ in } + self.presentGroupPicker(with: model) } }.disposed(by: disposeBag) } - - // MARK: - Init - init(phone: String, code: Int, memberData: [String : Any] = [:]) { + + init(phone: String, code: Int, memberData: [String: Any] = [:]) { self.phone = phone self.code = code self.memberData = memberData super.init(nibName: nil, bundle: nil) } - + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } diff --git a/QuickLocation/Section/Home/SearchLocation/SearchLocationResultView.swift b/QuickLocation/Section/Home/SearchLocation/SearchLocationResultView.swift index cf0c2494..3c3c6116 100644 --- a/QuickLocation/Section/Home/SearchLocation/SearchLocationResultView.swift +++ b/QuickLocation/Section/Home/SearchLocation/SearchLocationResultView.swift @@ -2,8 +2,6 @@ // SearchLocationResultView.swift // QuickLocation // -// Created by 八条 on 2026/6/27. -// import UIKit import RxSwift @@ -11,368 +9,301 @@ import RxCocoa import Lottie class SearchLocationResultView: UIView { - + var disposeBag = DisposeBag() - - private func setupRx() { - } - + + let headerView = SearchLocationHeaderView() + private func setupUI() { addSubview(unlockVipView) addSubview(navBgView) addSubview(navView) - - addSubview(normalView) - addSubview(successLottieView) - + addSubview(scrollView) + navBgView.layoutChain .edges(excludingEdge: .bottom) - .heightToWidth(160/375) - + .heightToWidth(160 / 375) + navView.layoutChain .edges(excludingEdge: .bottom) .height(kNaviHeight) - + unlockVipView.layoutChain.edges() - - successLottieView.layoutChain.edges() - - normalView.layoutChain + + scrollView.layoutChain .topToBottomOfView(navView) .edges(excludingEdge: .top) } - - // MARK: - Views - + + func startMarqueeAnimation() { + headerView.startMarqueeAnimation() + } + + func configureResult(status: String, disclaimer: String, showInviteRow: Bool) { + statusPillLab.text = status + disclaimerLab.text = disclaimer + disclaimerLab.textAlignment = disclaimer.contains("去查看") ? .center : .left + disclaimerIcon.isHidden = disclaimer.contains("去查看") + inviteView.isHidden = !showInviteRow + // 隐藏时高度归零,避免仍占 72pt 把卡片撑高 + inviteView.layoutChain + .topToBottomOfView(disclaimerLab, offset: showInviteRow ? 16 : 0) + .height(showInviteRow ? 72 : 0) + } + lazy var navBgView: UIImageView = { let iv = UIImageView() iv.image = UIImage(named: "Common/navBar_bg_2") iv.contentMode = .scaleAspectFill return iv }() - + lazy var navView: BaseNavigationView = { - let nav = BaseNavigationView(title: " ") - return nav + BaseNavigationView(title: " ") }() - - // MARK: - 成功烟花Lottie - lazy var successLottieView: LottieAnimationView = { - let view = LottieAnimationView(name: "phone_search_fireworks") - view.loopMode = .loop - view.isUserInteractionEnabled = false - return view - }() - - // MARK: - 已解锁vip - lazy var normalView: UIView = { - let view = UIView() + + lazy var scrollView: UIScrollView = { + let view = UIScrollView() view.backgroundColor = .clear - - view.addSubview(normalLottieView) - normalLottieView.layoutChain - .top(20) - .width(270) - .heightToWidth(1) - .centerX() - - view.addSubview(phoneAreaLab) - phoneAreaLab.layoutChain - .topToBottomOfView(normalLottieView) - .centerX() - - view.addSubview(messageLab) - messageLab.layoutChain - .topToBottomOfView(phoneAreaLab, offset: 10) - .centerX() - - view.addSubview(tipsLab) - tipsLab.layoutChain - .topToBottomOfView(messageLab, offset: 15) - .edgesHorzontal(31) - - view.addSubview(inviteBtn) - inviteBtn.layoutChain - .topToBottomOfView(tipsLab, offset: 30) - .edgesHorzontal(68) - .height(50) - - view.addSubview(inviteView) - inviteView.layoutChain - .topToBottomOfView(tipsLab, offset: 25) + view.showsVerticalScrollIndicator = false + view.bounces = false + + let contentView = UIView() + contentView.backgroundColor = .clear + view.addSubview(contentView) + contentView.layoutChain.edges().widthToView(view) + + contentView.addSubview(headerView) + headerView.layoutChain.top(12).edgesHorzontal() + + contentView.addSubview(resultCard) + resultCard.layoutChain + .topToBottomOfView(headerView, offset: 20) .edgesHorzontal(15) - .height(80) - + + contentView.addSubview(actionBtn) + actionBtn.layoutChain + .topToBottomOfView(resultCard, offset: 24) + .edgesHorzontal(30) + .height(56) + .bottom(kSafeBottomMargin + 30) + return view }() - + + lazy var resultCard: UIView = { + let card = UIView() + card.backgroundColor = UIColor(hexStr: "#EFF9FF") + card.cornerRadius = 16 + + let locationRow = UIView() + card.addSubview(locationRow) + + let pinIcon = UIImageView(image: UIImage(named: "Home/member_location")) + pinIcon.contentMode = .scaleAspectFit + locationRow.addSubview(pinIcon) + locationRow.addSubview(phoneAreaLab) + + pinIcon.layoutChain.left().top().bottom().width(18).height(18) + phoneAreaLab.layoutChain + .leftToRightOfView(pinIcon, offset: 6) + .right() + .centerY(pinIcon) + locationRow.layoutChain.top(20).centerX() + + let pillContainer = UIView() + pillContainer.backgroundColor = .white + pillContainer.cornerRadius = 14 + card.addSubview(pillContainer) + pillContainer.addSubview(statusPillLab) + statusPillLab.layoutChain.edgesHorzontal(58).edgesVertical(13) + pillContainer.layoutChain + .topToBottomOfView(locationRow, offset: 11) + .centerX() + .height(48) + + card.addSubview(disclaimerIcon) + disclaimerIcon.layoutChain + .topToBottomOfView(pillContainer, offset: 14) + .left(24) + .width(12) + .height(12) + + card.addSubview(disclaimerLab) + disclaimerLab.layoutChain + .topToBottomOfView(pillContainer, offset: 11) + .leftToRightOfView(disclaimerIcon, offset: 3) + .right(23) + + card.addSubview(inviteView) + inviteView.layoutChain + .topToBottomOfView(disclaimerLab, offset: 0) + .edgesHorzontal(12) + .height(0) + .bottom(16) + + return card + }() + lazy var phoneAreaLab: UILabel = { let label = UILabel() - label.text = " " - label.font = .systemFont(ofSize: 20, weight: .semibold) + label.font = .systemFont(ofSize: 18, weight: .bold) + label.textColor = UIColor(hexStr: "#293445") + return label + }() + + lazy var statusPillLab: UILabel = { + let label = UILabel() + label.font = .systemFont(ofSize: 16, weight: .medium) label.textColor = UIColor(hexStr: "#16B3FF") + label.textAlignment = .center return label }() - - lazy var messageLab: UILabel = { - let label = UILabel() - label.font = .systemFont(ofSize: 16, weight: .bold) - label.textColor = UIColor(hexStr: "#333333") - return label + + private lazy var disclaimerIcon: UIImageView = { + let iv = UIImageView(image: UIImage(named: "SearchLocation/warning")) + iv.contentMode = .scaleAspectFit + return iv }() - - lazy var tipsLab: UILabel = { + + lazy var disclaimerLab: UILabel = { let label = UILabel() - label.font = .systemFont(ofSize: 12, weight: .medium) + label.font = .systemFont(ofSize: 12, weight: .regular) label.textColor = UIColor(hexStr: "#999999") label.numberOfLines = 0 return label }() - - lazy var normalLottieView: LottieAnimationView = { - let view = LottieAnimationView() - view.loopMode = .loop - return view - }() - - lazy var inviteBtn: UIButton = { + + lazy var actionBtn: UIButton = { let btn = UIButton(type: .custom) - btn.setTitle("邀请Ta加入", for: .normal) btn.setTitleColor(.white, for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) + btn.titleLabel?.font = FontManager.boboBold(18) btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) - btn.cornerRadius = 25 + btn.cornerRadius = 20 btn.isHidden = true return btn }() - + + var inviteBtn: UIButton { actionBtn } + lazy var inviteView: UIView = { let view = UIView() - view.backgroundColor = UIColor(hexStr: "#EFF9FF") - view.cornerRadius = 16 + view.backgroundColor = .white + view.cornerRadius = 12 view.isHidden = true - + view.addSubview(successBtn) - successBtn.layoutChain - .right(15) - .centerY() - .width(90) - .height(36) - + successBtn.layoutChain.right(12).centerY().width(90).height(36) + view.addSubview(successTipsLab) - successTipsLab.layoutChain - .topToCenterYOfView(view) - .left(15) - + successTipsLab.layoutChain.topToCenterYOfView(view).left(12) + view.addSubview(phoneLab) - phoneLab.layoutChain - .bottomToCenterYOfView(view) - .left(15) - + phoneLab.layoutChain.bottomToCenterYOfView(view).left(12) + return view }() - + lazy var phoneLab: UILabel = { let label = UILabel() label.font = .systemFont(ofSize: 16, weight: .bold) label.textColor = UIColor(hexStr: "#333333") return label }() - + lazy var successTipsLab: UILabel = { let label = UILabel() - label.text = "邀请加入圈子后分享位置" label.font = .systemFont(ofSize: 10, weight: .medium) label.textColor = UIColor(hexStr: "#999999") return label }() - + lazy var successBtn: UIButton = { let btn = UIButton(type: .custom) - btn.setTitle("邀请Ta", for: .normal) btn.setTitleColor(.white, for: .normal) btn.titleLabel?.font = .systemFont(ofSize: 14, weight: .medium) - btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) + btn.backgroundColor = UIColor(hexStr: "#16B3FF") btn.cornerRadius = 18 return btn }() - - // MARK: - 未解锁vip + + // 兼容 VC 旧引用 + lazy var messageLab: UILabel = statusPillLab + lazy var tipsLab: UILabel = disclaimerLab + lazy var normalLottieView: LottieAnimationView = { + let view = LottieAnimationView() + view.isHidden = true + return view + }() + lazy var successLottieView: LottieAnimationView = { + let view = LottieAnimationView(name: "phone_search_fireworks") + view.isHidden = true + return view + }() + lazy var unlockVipView: UIView = { let view = UIView() - view.backgroundColor = .clear - view.clipsToBounds = true + view.backgroundColor = .white view.isHidden = true - - let bgImgView = UIImageView(image: UIImage(named: "SearchLocation/result_bg")) - bgImgView.contentMode = .scaleAspectFill - view.addSubview(bgImgView) - bgImgView.layoutChain - .edges(excludingEdge: .bottom) - .heightToWidth(457/357) - - view.addSubview(unlockVipLottieView) - unlockVipLottieView.layoutChain - .edgesHorzontal(60) - .heightToWidth(1) - .top(150) -// .bottomToView(bgImgView, offset: -15) - + + let heroPlaceholder = UIImageView() + heroPlaceholder.backgroundColor = UIColor(hexStr: "#F5F5F5") + heroPlaceholder.cornerRadius = 16 + view.addSubview(heroPlaceholder) + heroPlaceholder.layoutChain + .top(120) + .edgesHorzontal(40) + .height(200) + view.addSubview(unlockVipPhoneAreaLab) unlockVipPhoneAreaLab.layoutChain - .topToBottomOfView(unlockVipLottieView) + .topToBottomOfView(heroPlaceholder, offset: 16) .centerX() - - let locationView = UIView() - locationView.backgroundColor = .clear - view.addSubview(locationView) - locationView.layoutChain - .topToBottomOfView(unlockVipPhoneAreaLab, offset: 10) - .centerX() - - let locationTitleLab = UILabel() - locationTitleLab.text = "位置:" - locationTitleLab.font = .systemFont(ofSize: 16, weight: .bold) - locationTitleLab.textColor = UIColor(hexStr: "#16B3FF") - locationView.addSubview(locationTitleLab) - locationTitleLab.layoutChain - .left() - .centerY() - - let maskView = UIImageView(image: UIImage(named: "SearchLocation/mask")) - locationView.addSubview(maskView) - maskView.layoutChain - .leftToRightOfView(locationTitleLab) - .right() - .edgesVertical() - .width(144) - .height(30) - + let unlockVipBtn = UIButton() unlockVipBtn.setTitle("开通会员", for: .normal) unlockVipBtn.setTitleColor(.white, for: .normal) - unlockVipBtn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) - unlockVipBtn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) + unlockVipBtn.titleLabel?.font = FontManager.boboBold(16) + unlockVipBtn.backgroundColor = UIColor(hexStr: "#16B3FF") unlockVipBtn.cornerRadius = 25 unlockVipBtn.rx.tap.subscribe(onNext: { _ in AppRouter.push(Route.vipRecharge) }).disposed(by: disposeBag) - view.addSubview(unlockVipBtn) unlockVipBtn.layoutChain .edgesHorzontal(15) .bottom(kSafeBottomMargin + 20) .height(50) - - // 最后出现地点 - let tipsDot3 = UIView() - tipsDot3.backgroundColor = UIColor(hexStr: "#16B3FF") - tipsDot3.cornerRadius = 2.5 - let tipsLab3 = UILabel() - tipsLab3.text = "最后出现地点" - tipsLab3.font = .systemFont(ofSize: 12, weight: .medium) - tipsLab3.textColor = UIColor(hexStr: "#333333") - view.addSubview(tipsLab3) - view.addSubview(tipsDot3) - tipsLab3.layoutChain - .bottomToTopOfView(unlockVipBtn, offset: -20) - .rightToCenterXOfView(view, offset: 30) - - tipsDot3.layoutChain - .rightToLeftOfView(tipsLab3, offset: -8) - .width(5) - .heightToWidth(1) - .centerY(tipsLab3) - - // "近24小时轨迹" - let tipsDot4 = UIView() - tipsDot4.backgroundColor = UIColor(hexStr: "#16B3FF") - tipsDot4.cornerRadius = 2.5 - let tipsLab4 = UILabel() - tipsLab4.text = "近24小时轨迹" - tipsLab4.font = .systemFont(ofSize: 12, weight: .medium) - tipsLab4.textColor = UIColor(hexStr: "#333333") - view.addSubview(tipsLab4) - view.addSubview(tipsDot4) - tipsDot4.layoutChain - .leftToCenterXOfView(view, offset: 30) - .width(5) - .heightToWidth(1) - .centerY(tipsLab4) - tipsLab4.layoutChain - .bottomToTopOfView(unlockVipBtn, offset: -20) - .leftToRightOfView(tipsDot4, offset: 8) - - // 是否在线 - let tipsDot1 = UIView() - tipsDot1.backgroundColor = UIColor(hexStr: "#16B3FF") - tipsDot1.cornerRadius = 2.5 - let tipsLab1 = UILabel() - tipsLab1.text = "是否在线" - tipsLab1.font = .systemFont(ofSize: 12, weight: .medium) - tipsLab1.textColor = UIColor(hexStr: "#333333") - view.addSubview(tipsLab1) - view.addSubview(tipsDot1) - tipsDot1.layoutChain - .leftToView(tipsDot3) - .width(5) - .heightToWidth(1) - .centerY(tipsLab1) - tipsLab1.layoutChain - .bottomToTopOfView(tipsLab3, offset: -10) - .leftToRightOfView(tipsDot1, offset: 8) - - // 实时位置变化 - let tipsDot2 = UIView() - tipsDot2.backgroundColor = UIColor(hexStr: "#16B3FF") - tipsDot2.cornerRadius = 2.5 - let tipsLab2 = UILabel() - tipsLab2.text = "实时位置变化" - tipsLab2.font = .systemFont(ofSize: 12, weight: .medium) - tipsLab2.textColor = UIColor(hexStr: "#333333") - view.addSubview(tipsLab2) - view.addSubview(tipsDot2) - tipsDot2.layoutChain - .leftToView(tipsDot4) - .width(5) - .heightToWidth(1) - .centerY(tipsLab2) - tipsLab2.layoutChain - .bottomToTopOfView(tipsLab4, offset: -10) - .leftToRightOfView(tipsDot2, offset: 8) - - // 再迈一步,你就能看到: + let unlockVipTitleLab = UILabel() unlockVipTitleLab.text = "再迈一步,你就能看到:" unlockVipTitleLab.font = .systemFont(ofSize: 14, weight: .medium) unlockVipTitleLab.textColor = UIColor(hexStr: "#16B3FF") view.addSubview(unlockVipTitleLab) unlockVipTitleLab.layoutChain - .bottomToTopOfView(tipsLab1, offset: -8) + .bottomToTopOfView(unlockVipBtn, offset: -60) .centerX() - + return view }() - + lazy var unlockVipLottieView: LottieAnimationView = { let view = LottieAnimationView(name: "phone_search_no_vip") - view.loopMode = .loop + view.isHidden = true return view }() - + lazy var unlockVipPhoneAreaLab: UILabel = { let label = UILabel() - label.text = " " label.font = .systemFont(ofSize: 20, weight: .semibold) label.textColor = UIColor(hexStr: "#16B3FF") return label }() - + override init(frame: CGRect) { super.init(frame: .zero) backgroundColor = .white setupUI() - setupRx() } required init?(coder aDecoder: NSCoder) { diff --git a/QuickLocation/Section/Home/SearchLocation/SearchLocationView.swift b/QuickLocation/Section/Home/SearchLocation/SearchLocationView.swift index 9a2a8c37..b09b53b3 100644 --- a/QuickLocation/Section/Home/SearchLocation/SearchLocationView.swift +++ b/QuickLocation/Section/Home/SearchLocation/SearchLocationView.swift @@ -2,8 +2,6 @@ // SearchLocationView.swift // QuickLocation // -// Created by 八条 on 2026/6/27. -// import UIKit import RxSwift @@ -21,6 +19,8 @@ class SearchLocationView: UIView { private var player: AVPlayer? private var timeObserver: Any? + let headerView = SearchLocationHeaderView() + private func setupRx() { phoneInputTF.rx.text .map { text -> String? in @@ -28,21 +28,14 @@ class SearchLocationView: UIView { return String(text.prefix(11)) }.bind(to: phoneInputTF.rx.text) .disposed(by: disposeBag) - - phoneInputTF.rx.text.orEmpty.map { phone -> Bool in - if phone.count == 11 { - return true - } else { - return false - } - } - .bind(to: searchBtn.rx.isEnabled) - .disposed(by: disposeBag) - + + phoneInputTF.rx.text.orEmpty.map { $0.count == 11 } + .bind(to: searchBtn.rx.isEnabled) + .disposed(by: disposeBag) + phoneInputTF.rx.controlEvent(.editingDidEndOnExit) .subscribe(onNext: { [weak self] in - guard let self = self else { return } - self.phoneInputTF.resignFirstResponder() + self?.phoneInputTF.resignFirstResponder() }) .disposed(by: disposeBag) } @@ -53,127 +46,28 @@ class SearchLocationView: UIView { addSubview(scrollView) addSubview(videoView) addSubview(searchProgressView) - - videoView.layoutChain.edges() + videoView.layoutChain.edges() searchProgressView.layoutChain .edgesHorzontal(15) .bottom(kSafeBottomMargin + 20) .height(221) - + navBgView.layoutChain .edges(excludingEdge: .bottom) - .heightToWidth(160/375) + .heightToWidth(160 / 375) navView.layoutChain .edges(excludingEdge: .bottom) .height(kNaviHeight) - + scrollView.layoutChain .topToBottomOfView(navView) .edges(excludingEdge: .top) } - // MARK: - Marquee - private func randomPhoneNumber() -> String { - // 所有合法前3位号段 - let prefixes = [ - "134","135","136","137","138","139","147","150","151","152","157","158","159","178","182","183","184","187","188","198", - "130","131","132","145","155","156","166","175","176","185","186","196", - "133","149","153","173","177","180","181","189","191","199" - ] - // 随机选一个号段 - let prefix = prefixes.randomElement()! - - // 随机生成后面8位数字 - var suffix = "" - for _ in 0..<8 { - suffix.append("\(Int.random(in: 0...9))") - } - - return prefix + suffix - } - - private func setupMarquee() { - let surnames = ["张", "李", "王", "陈", "刘", "杨", "赵", "黄", "周", "吴", - "林", "何", "马", "胡", "郑", "梁", "谢", "宋", "唐", "韩"] - - let container = UIView() - container.backgroundColor = .clear - marqueeScrollView.addSubview(container) - - var prevView: UIView? - for _ in 0..<10 { - let iconIndex = Int.random(in: 1...15) - let surname = surnames.randomElement() ?? "张" - let maskedName = "\(surname)**" - let phone = randomPhoneNumber() - let maskedPhone = phone.prefix(3) + "******" + phone.suffix(2) - - let itemView = UIView() - itemView.backgroundColor = UIColor(hexStr: "#EFF9FF") - itemView.cornerRadius = 6 - container.addSubview(itemView) - - let avatar = UIImageView(image: UIImage(named: "UserIcon/\(iconIndex)")) - avatar.contentMode = .scaleAspectFill - avatar.cornerRadius = 12 - avatar.clipsToBounds = true - itemView.addSubview(avatar) - - let label = UILabel() - label.font = .systemFont(ofSize: 13, weight: .medium) - let fullText = "\(maskedName) 定位到了 \(maskedPhone)" - let attr = NSMutableAttributedString(string: fullText) - attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#16B3FF"), - range: NSRange(fullText.range(of: maskedName)!, in: fullText)) - if let phoneRange = fullText.range(of: maskedPhone) { - attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#16B3FF"), - range: NSRange(phoneRange, in: fullText)) - } - label.attributedText = attr - itemView.addSubview(label) - - avatar.layoutChain - .left(10).centerY() - .width(24).height(24) - - label.layoutChain - .leftToRightOfView(avatar, offset: 6) - .centerY().right(10) - - itemView.layoutChain - .centerY() - .height(30) - - if let prev = prevView { - itemView.layoutChain.leftToRightOfView(prev, offset: 20) - } else { - itemView.layoutChain.left() - } - prevView = itemView - } - - if let last = prevView { - container.layoutChain - .edges().heightToView(marqueeScrollView) - .rightToView(last) - } - } - func startMarqueeAnimation() { - marqueeScrollView.layer.removeAllAnimations() - marqueeScrollView.contentOffset.x = 0 - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in - guard let self = self else { return } - let contentW = self.marqueeScrollView.contentSize.width - guard contentW > self.marqueeScrollView.bounds.width else { return } - let duration = contentW / 100 - - UIView.animate(withDuration: duration, delay: 0, options: [.curveLinear, .repeat]) { - self.marqueeScrollView.contentOffset.x = contentW - self.marqueeScrollView.bounds.width - } - } + headerView.startMarqueeAnimation() } override func willMove(toWindow newWindow: UIWindow?) { @@ -183,56 +77,41 @@ class SearchLocationView: UIView { } } - // MARK: - Views - lazy var navBgView: UIImageView = { let iv = UIImageView() iv.image = UIImage(named: "Common/navBar_bg_2") iv.contentMode = .scaleAspectFill + iv.isHidden = true return iv }() lazy var navView: BaseNavigationView = { - let nav = BaseNavigationView(title: "找人助手") - return nav + BaseNavigationView(title: " ") }() - + lazy var scrollView: UIScrollView = { let view = UIScrollView() view.backgroundColor = .clear view.showsVerticalScrollIndicator = false view.bounces = false - + let contentView = UIView() contentView.backgroundColor = .clear view.addSubview(contentView) contentView.layoutChain.edges().widthToView(view) - - let bgImgView = UIImageView() - bgImgView.image = UIImage(named: "SearchLocation/bg_1") - contentView.addSubview(bgImgView) - bgImgView.layoutChain - .top(15) - .edgesHorzontal(56.5) - .heightToWidth(626/524) - - contentView.addSubview(titleLab) - titleLab.layoutChain - .topToBottomOfView(bgImgView, offset: 0) - .centerX() - - contentView.addSubview(marqueeScrollView) - marqueeScrollView.layoutChain - .topToBottomOfView(titleLab, offset: 10) + + contentView.addSubview(headerView) + headerView.layoutChain + .top(12) .edgesHorzontal() - .height(30) - + .widthToView(contentView) + contentView.addSubview(searchInputView) searchInputView.layoutChain - .topToBottomOfView(marqueeScrollView, offset: 20) + .topToBottomOfView(headerView, offset: 20) .edgesHorzontal(15) .bottom(kSafeBottomMargin + 30) - + return view }() @@ -240,12 +119,12 @@ class SearchLocationView: UIView { let v = UIView() v.backgroundColor = .black v.isHidden = true - return v }() func playVideo(completion: (() -> Void)? = nil) { - guard let path = Bundle.main.path(forResource: "search_interlude", ofType: "mp4") ?? Bundle.main.path(forResource: "search_interlude", ofType: "mp4", inDirectory: "video") else { + guard let path = Bundle.main.path(forResource: "search_interlude", ofType: "mp4") + ?? Bundle.main.path(forResource: "search_interlude", ofType: "mp4", inDirectory: "video") else { print("[video] file not found in bundle: \(Bundle.main.resourcePath ?? "")") return } @@ -259,7 +138,6 @@ class SearchLocationView: UIView { playerLayer.videoGravity = .resizeAspectFill videoView.layer.addSublayer(playerLayer) - // 进度跟踪 timeObserver = player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.1, preferredTimescale: 600), queue: .main) { [weak self] time in guard let self = self, let duration = self.player?.currentItem?.duration.seconds, duration > 0 else { return } self.updateVideoProgress(Float(time.seconds / duration)) @@ -288,52 +166,24 @@ class SearchLocationView: UIView { } } - lazy var titleLab: UILabel = { - let label = UILabel() - label.text = "有 \(Int.random(in: 1000...10000)) 人正在使用此功能" - label.font = .systemFont(ofSize: 16, weight: .medium) - label.textColor = ThemeManager.shared.color.titleAuxColor - label.textAlignment = .center - return label - }() - - lazy var marqueeScrollView: UIScrollView = { - let sv = UIScrollView() - sv.backgroundColor = .clear - sv.showsHorizontalScrollIndicator = false - sv.isScrollEnabled = false - return sv - }() - lazy var searchInputView: UIView = { let view = UIView() - view.backgroundColor = UIColor(hexStr: "#EFF9FF") - view.cornerRadius = 10 - - let titleLab = UILabel() - titleLab.text = "TA在哪?输入号码就知道" - titleLab.font = .systemFont(ofSize: 16, weight: .semibold) - titleLab.textColor = ThemeManager.shared.color.titleAuxColor - view.addSubview(titleLab) - titleLab.layoutChain - .top(18) - .left(15) + view.backgroundColor = UIColor(hexStr: "#EFFAFF") + view.cornerRadius = 40 let inputView = UIView() inputView.backgroundColor = .white - inputView.cornerRadius = 4 + inputView.cornerRadius = 14 view.addSubview(inputView) inputView.layoutChain - .topToBottomOfView(titleLab, offset: 20) + .top(20) .edgesHorzontal(15) - .height(40) + .height(44) let contactsBtn = UIButton() - contactsBtn.setTitle(" 通讯录导入", for: .normal) + contactsBtn.setTitle("通讯录导入", for: .normal) contactsBtn.setTitleColor(UIColor(hexStr: "#16B3FF"), for: .normal) contactsBtn.titleLabel?.font = .systemFont(ofSize: 12, weight: .regular) - contactsBtn.setImage(UIImage(named: "SearchLocation/contacts"), for: .normal) - contactsBtn.extendEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 15) contactsBtn.rx.tap.subscribe(onNext: { [weak self] in guard let self = self else { return } self.phoneInputTF.resignFirstResponder() @@ -352,11 +202,7 @@ class SearchLocationView: UIView { } }).disposed(by: disposeBag) inputView.addSubview(contactsBtn) - contactsBtn.layoutChain - .right(15) - .width(90) - .edgesVertical() - contactsBtn.sizeToFit() + contactsBtn.layoutChain.edgesVertical().width(60).right(12) inputView.addSubview(phoneInputTF) phoneInputTF.layoutChain @@ -364,21 +210,31 @@ class SearchLocationView: UIView { .left(15) .rightToLeftOfView(contactsBtn, offset: -8) + let warningIcon = UIImageView(image: UIImage(named: "SearchLocation/warning")) + warningIcon.contentMode = .scaleAspectFit + view.addSubview(warningIcon) + warningIcon.layoutChain + .topToBottomOfView(inputView, offset: 10) + .left(15) + .width(14) + .height(14) + let tipsLab = UILabel() tipsLab.text = "我们不会存储和泄露你导入的通讯录隐私" tipsLab.font = .systemFont(ofSize: 12, weight: .regular) - tipsLab.textColor = ThemeManager.shared.color.contentColor + tipsLab.textColor = UIColor(hexStr: "#999999") view.addSubview(tipsLab) tipsLab.layoutChain - .topToBottomOfView(inputView, offset: 6) + .leftToRightOfView(warningIcon, offset: 4) + .centerY(warningIcon) .right(15) view.addSubview(searchBtn) searchBtn.layoutChain - .topToBottomOfView(tipsLab, offset: 35) - .edgesHorzontal(52) + .topToBottomOfView(warningIcon, offset: 24) + .edgesHorzontal(20) .height(50) - .bottom(30) + .bottom(24) return view }() @@ -386,7 +242,7 @@ class SearchLocationView: UIView { lazy var phoneInputTF: UITextField = { let textField = UITextField() textField.font = .systemFont(ofSize: 14, weight: .medium) - textField.placeholder = "请输入要查找的号码" + textField.placeholder = "输入要查看的号码" textField.keyboardType = .numberPad textField.returnKeyType = .done return textField @@ -396,12 +252,12 @@ class SearchLocationView: UIView { let btn = UIButton(type: .custom) btn.setTitle("开始查找", for: .normal) btn.setTitleColor(.white, for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) + btn.titleLabel?.font = FontManager.boboBold(16) btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) - btn.cornerRadius = 25 + btn.cornerRadius = 20 return btn }() - + lazy var searchProgressView: UIView = { let view = UIView() view.backgroundColor = .black.withAlphaComponent(0.8) @@ -409,17 +265,17 @@ class SearchLocationView: UIView { view.borderWidth = 0.5 view.borderColor = .white view.isHidden = true - + view.addSubview(searchPhoneLottieView) searchPhoneLottieView.layoutChain .top(30) .left(15) .width(120) .heightToWidth(1) - + let steps = ["分析用户号码", "正在找 CGI 蜂窝参数", "SS7 信息交流", "号码已获授权", "处理完成"] var prevStepView: UIView? - for (i, text) in steps.enumerated() { + for text in steps { let stepView = UIView() view.addSubview(stepView) @@ -434,14 +290,8 @@ class SearchLocationView: UIView { label.textColor = .white stepView.addSubview(label) - icon.layoutChain - .left().centerY() - .width(18).height(18) - - label.layoutChain - .leftToRightOfView(icon, offset: 8) - .centerY().right() - + icon.layoutChain.left().centerY().width(18).height(18) + label.layoutChain.leftToRightOfView(icon, offset: 8).centerY().right() stepView.layoutChain .leftToRightOfView(searchPhoneLottieView, offset: 10) .right(10) @@ -455,7 +305,6 @@ class SearchLocationView: UIView { prevStepView = stepView } - // 进度条 + 百分比 progressBar.layer.cornerRadius = 4 progressBar.clipsToBounds = true progressBar.trackTintColor = .white.withAlphaComponent(0.2) @@ -483,16 +332,13 @@ class SearchLocationView: UIView { private var progressIcons: [UIImageView] = [] private lazy var progressBar: UIProgressView = { - let p = UIProgressView() - return p + UIProgressView() }() private lazy var progressLab: UILabel = { - let l = UILabel() - return l + UILabel() }() - /// 根据视频进度更新步骤图标和进度条 (0~1) func updateVideoProgress(_ progress: Float) { let clamped = max(0, min(1, progress)) progressBar.progress = clamped @@ -517,7 +363,6 @@ class SearchLocationView: UIView { backgroundColor = .white setupUI() setupRx() - setupMarquee() } required init?(coder aDecoder: NSCoder) { diff --git a/QuickLocation/Section/Mine/About/AboutVC.swift b/QuickLocation/Section/Mine/About/AboutVC.swift new file mode 100644 index 00000000..e9455c35 --- /dev/null +++ b/QuickLocation/Section/Mine/About/AboutVC.swift @@ -0,0 +1,70 @@ +// +// AboutVC.swift +// QuickLocation +// + +import UIKit +import RxSwift +import RxCocoa + +final class AboutVC: BaseViewController { + + private var rootView: AboutView! + + override func loadView() { + rootView = AboutView(frame: UIScreen.main.bounds) + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + bind() + } + + private func bind() { + rootView.navView.onBackTapped = { [weak self] in + self?.navigationController?.popViewController(animated: true) + } + + rootView.feedbackBtn.rx.controlEvent(.touchUpInside) + .subscribe(onNext: { _ in + DLToast.show(text: "敬请期待") + }) + .disposed(by: disposeBag) + + rootView.rateBtn.rx.controlEvent(.touchUpInside) + .subscribe(onNext: { _ in + Self.openAppStoreReview() + }) + .disposed(by: disposeBag) + + rootView.agreementBtn.rx.controlEvent(.touchUpInside) + .subscribe(onNext: { _ in + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.userAgreementUrl]) + }) + .disposed(by: disposeBag) + + rootView.privacyBtn.rx.controlEvent(.touchUpInside) + .subscribe(onNext: { _ in + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.privacyPolicyUrl]) + }) + .disposed(by: disposeBag) + + rootView.kidsPrivacyBtn.rx.controlEvent(.touchUpInside) + .subscribe(onNext: { _ in + AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.kidsPrivacyUrl]) + }) + .disposed(by: disposeBag) + } + + private static func openAppStoreReview() { + // Bundle 未配置 appId 时给提示;有则跳转写评价页 + let appId = AppSettings.shared.appId + guard !appId.isEmpty, + let url = URL(string: "itms-apps://itunes.apple.com/app/id\(appId)?action=write-review") else { + DLToast.show(text: "暂无法打开评价") + return + } + UIApplication.shared.open(url) + } +} diff --git a/QuickLocation/Section/Mine/About/AboutView.swift b/QuickLocation/Section/Mine/About/AboutView.swift new file mode 100644 index 00000000..459a5be6 --- /dev/null +++ b/QuickLocation/Section/Mine/About/AboutView.swift @@ -0,0 +1,124 @@ +// +// AboutView.swift +// QuickLocation +// + +import UIKit + +final class AboutView: UIView { + + lazy var navView: BaseNavigationView = { + BaseNavigationView(title: "关于我们") + }() + + lazy var navBgView: UIImageView = { + let iv = UIImageView(image: UIImage(named: "Common/navBar_bg_2")) + iv.contentMode = .scaleAspectFill + return iv + }() + + let logoImage = UIImageView(image: UIImage(named: "Mine/")) + let nameImage = UIImageView(image: UIImage(named: "Mine/about_logo")) + let versionLab = UILabel() + + let feedbackBtn = AboutMenuButton(title: "意见反馈") + let rateBtn = AboutMenuButton(title: "给个好评") + let agreementBtn = AboutMenuButton(title: "用户协议") + let privacyBtn = AboutMenuButton(title: "隐私政策") + let kidsPrivacyBtn = AboutMenuButton(title: "儿童隐私政策") + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = UIColor(hexStr: "#FAFAFA") + setupUI() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupUI() { + addSubview(navBgView) + addSubview(navView) + navBgView.layoutChain.edges(excludingEdge: .bottom).heightToWidth(160 / 375) + navView.layoutChain.top().edgesHorzontal().height(kNaviHeight) + + logoImage.contentMode = .scaleAspectFill + logoImage.backgroundColor = .lightGray + logoImage.cornerRadius = 30 + + addSubview(logoImage) + logoImage.layoutChain + .topToBottomOfView(navView, offset: 67) + .centerX() + .width(100) + .heightToWidth(1) + + addSubview(nameImage) + nameImage.layoutChain + .topToBottomOfView(logoImage, offset: 24) + .centerX() + .width(114) + .height(25) + + let card1 = makeCard() + addSubview(card1) + card1.layoutChain.topToBottomOfView(nameImage, offset: 40).edgesHorzontal(15) + stackInCard(card1, buttons: [feedbackBtn, rateBtn]) + + let card2 = makeCard() + addSubview(card2) + card2.layoutChain.topToBottomOfView(card1, offset: 12).edgesHorzontal(15) + stackInCard(card2, buttons: [agreementBtn, privacyBtn, kidsPrivacyBtn]) + + versionLab.text = kAppShortVersion + versionLab.font = .systemFont(ofSize: 12, weight: .medium) + versionLab.textColor = UIColor(hexStr: "#AAAAAA") + versionLab.textAlignment = .center + addSubview(versionLab) + versionLab.layoutChain.bottom(34).centerX() + } + + private func makeCard() -> UIView { + let v = UIView() + v.backgroundColor = .white + v.layer.cornerRadius = 16 + v.layer.shadowColor = UIColor(hexStr: "#0F2846", alpha: 0.08).cgColor + v.layer.shadowOffset = CGSize(width: 0, height: 2) + v.layer.shadowOpacity = 1 + v.layer.shadowRadius = 8 + return v + } + + private func stackInCard(_ card: UIView, buttons: [AboutMenuButton]) { + let stack = UIStackView(arrangedSubviews: buttons) + stack.axis = .vertical + stack.spacing = 0 + card.addSubview(stack) + stack.layoutChain.edges() + buttons.forEach { $0.layoutChain.height(52) } + for (i, btn) in buttons.enumerated() where i < buttons.count - 1 { + let line = UIView() + line.backgroundColor = UIColor(hexStr: "#F2F2F2") + btn.addSubview(line) + line.layoutChain.left(15).right(15).bottom(0).height(0.5) + } + } +} + +final class AboutMenuButton: UIControl { + private let titleLab = UILabel() + private let arrow = UIImageView(image: UIImage(named: "Mine/arrow_right")) + + init(title: String) { + super.init(frame: .zero) + titleLab.text = title + titleLab.font = .systemFont(ofSize: 15, weight: .medium) + titleLab.textColor = UIColor(hexStr: "#293445") + addSubview(titleLab) + titleLab.layoutChain.left(15).centerY() + arrow.contentMode = .scaleAspectFit + addSubview(arrow) + arrow.layoutChain.right(15).centerY().width(12).height(12) + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } +} diff --git a/QuickLocation/Section/Mine/Account/AccountVC.swift b/QuickLocation/Section/Mine/Account/AccountVC.swift index f3e92503..e4301aaf 100644 --- a/QuickLocation/Section/Mine/Account/AccountVC.swift +++ b/QuickLocation/Section/Mine/Account/AccountVC.swift @@ -53,9 +53,7 @@ class AccountVC: BaseViewController { }).disposed(by: disposeBag) rootView.cancelledBtn.rx.tap.subscribe(onNext: { _ in - CancellationPopView.show { - self.deleteAccount() - } + AppRouter.push(Route.cancelAccount) }).disposed(by: disposeBag) let tap = UITapGestureRecognizer(target: self, action: #selector(handleClearCacheTap)) diff --git a/QuickLocation/Section/Mine/Account/AccountView.swift b/QuickLocation/Section/Mine/Account/AccountView.swift index 53ef00a4..ac7557a8 100644 --- a/QuickLocation/Section/Mine/Account/AccountView.swift +++ b/QuickLocation/Section/Mine/Account/AccountView.swift @@ -290,10 +290,10 @@ class AccountView: UIView { lazy var logoutBtn: UIButton = { let btn = UIButton(type: .custom) btn.setTitle("退出登录", for: .normal) - btn.titleLabel?.font = .systemFont(ofSize: 16, weight: .medium) + btn.titleLabel?.font = FontManager.boboBold(18) btn.setTitleColor(.white, for: .normal) btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal) - btn.cornerRadius = 25 + btn.cornerRadius = 16 return btn }() diff --git a/QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift b/QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift new file mode 100644 index 00000000..ac47ad3f --- /dev/null +++ b/QuickLocation/Section/Mine/CancelAccount/CancelAccountVC.swift @@ -0,0 +1,105 @@ +// +// CancelAccountVC.swift +// QuickLocation +// + +import UIKit +import RxSwift +import RxCocoa +#if !targetEnvironment(simulator) +import GeYanSdk +#endif + +final class CancelAccountVC: BaseViewController { + + private var rootView: CancelAccountView! + private let requiredPhrase = "我自愿注销本账号" + + override func loadView() { + rootView = CancelAccountView(frame: UIScreen.main.bounds) + view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + bind() + } + + private func bind() { + rootView.navView.onBackTapped = { [weak self] in + self?.navigationController?.popViewController(animated: true) + } + + rootView.checkItems.forEach { item in + item.checkBtn.rx.tap + .subscribe(onNext: { [weak self, weak item] in + item?.checkBtn.isSelected.toggle() + self?.refreshSaveEnabled() + }) + .disposed(by: disposeBag) + } + + rootView.confirmInput.rx.text.orEmpty + .subscribe(onNext: { [weak self] _ in + self?.refreshSaveEnabled() + }) + .disposed(by: disposeBag) + + rootView.saveBtn.rx.tap + .subscribe(onNext: { [weak self] in + self?.submit() + }) + .disposed(by: disposeBag) + } + + private func refreshSaveEnabled() { + let allChecked = rootView.checkItems.allSatisfy(\.isChecked) + let phraseOK = rootView.confirmInput.text == requiredPhrase + rootView.setSaveEnabled(allChecked && phraseOK) + } + + private func submit() { + guard rootView.checkItems.allSatisfy(\.isChecked), + rootView.confirmInput.text == requiredPhrase else { return } + DLToast.showLoading() + UserService.deleteAccount().subscribe(onNext: { [weak self] _ in + DLToast.dismiss() + self?.showSuccessToast { + NotificationCenter.default.post(name: .invalidatePopupQueue, object: nil) + #if !targetEnvironment(simulator) + GeYanSdk.deletePreResultCache() + #endif + AppContextManager.shared.deleteAccount() + GroupIMService.shared.logout() + AppDelegate.shared.showMainViewController() + } + }, onError: { _ in }).disposed(by: disposeBag) + } + + private func showSuccessToast(completion: @escaping () -> Void) { + let toast = UIView() + toast.backgroundColor = UIColor.black.withAlphaComponent(0.75) + toast.layer.cornerRadius = 12 + view.addSubview(toast) + toast.layoutChain.center().width(120).height(120) + + let icon = UIImageView(image: UIImage(systemName: "checkmark.circle")) + icon.tintColor = .white + icon.contentMode = .scaleAspectFit + toast.addSubview(icon) + icon.layoutChain.top(28).centerX().width(36).height(36) + + let lab = UILabel() + lab.text = "注销成功" + lab.textColor = .white + lab.font = .systemFont(ofSize: 14, weight: .medium) + lab.textAlignment = .center + toast.addSubview(lab) + lab.layoutChain.topToBottomOfView(icon, offset: 12).edgesHorzontal(8) + + DispatchQueue.main.asyncAfter(deadline: .now() + 1.2) { + toast.removeFromSuperview() + completion() + } + } +} diff --git a/QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift b/QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift new file mode 100644 index 00000000..27c8c305 --- /dev/null +++ b/QuickLocation/Section/Mine/CancelAccount/CancelAccountView.swift @@ -0,0 +1,165 @@ +// +// CancelAccountView.swift +// QuickLocation +// + +import UIKit + +final class CancelAccountView: UIView { + + lazy var navView = BaseNavigationView(title: "注销账号") + + let scrollView = UIScrollView() + let contentView = UIView() + let warningIcon = UIImageView(image: UIImage(named: "Mine/cancel_warning")) + let introLab = UILabel() + let card = UIView() + let confirmInput = UITextField() + let saveBtn = UIButton(type: .custom) + + private(set) var checkItems: [CancelCheckItemView] = [] + + override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = UIColor(hexStr: "#F9F9F9") + setupUI() + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private func setupUI() { + addSubview(navView) + navView.layoutChain.top().edgesHorzontal().height(kNaviHeight) + + addSubview(saveBtn) + saveBtn.setTitle("保存", for: .normal) + saveBtn.titleLabel?.font = FontManager.boboBold(18) + saveBtn.setTitleColor(.white, for: .normal) + saveBtn.backgroundColor = UIColor(hexStr: "#FF9B9B") + saveBtn.layer.cornerRadius = 20 + saveBtn.isEnabled = false + saveBtn.alpha = 0.5 + saveBtn.layoutChain.left(20).right(20).bottom(34).height(56) + + addSubview(scrollView) + scrollView.keyboardDismissMode = .onDrag + scrollView.backgroundColor = .clear + scrollView.layoutChain + .topToBottomOfView(navView) + .edgesHorzontal() + .bottomToTopOfView(saveBtn, offset: -12) + scrollView.addSubview(contentView) + contentView.backgroundColor = UIColor(hexStr: "#F9F9F9") + contentView.layoutChain.edges().widthToView(scrollView) + + warningIcon.contentMode = .scaleAspectFit + contentView.addSubview(warningIcon) + warningIcon.layoutChain.top(24).centerX().width(68).height(68) + + introLab.text = "为保证你的账号安全,在你提交的注销申请生效前,需要同时满足以下条件:" + introLab.font = .systemFont(ofSize: 16, weight: .medium) + introLab.textColor = UIColor(hexStr: "#3D3D3D") + introLab.numberOfLines = 0 + contentView.addSubview(introLab) + introLab.layoutChain.topToBottomOfView(warningIcon, offset: 16).edgesHorzontal(20) + + card.backgroundColor = .white + card.layer.cornerRadius = 24 + contentView.addSubview(card) + card.layoutChain + .topToBottomOfView(introLab, offset: 16) + .edgesHorzontal(15) + .bottom(20) + + let specs: [(String, String)] = [ + ("1. 放弃当前的VIP权益", "当前充值的VIP我们不会退款,请解除你的自动续费(如果有),同意请打勾"), + ("2. 当前账号没有违规及其他的法律纠纷", "同意请打勾"), + ("3. 确认是账号本人进行注销操作,自愿承担后果", "同意请打勾"), + ("4. 账号注销后账号不可登录,不可恢复", "同意请打勾") + ] + var previous: UIView? + for spec in specs { + let item = CancelCheckItemView(title: spec.0, subtitle: spec.1) + checkItems.append(item) + card.addSubview(item) + if let previous { + item.layoutChain.topToBottomOfView(previous).edgesHorzontal(14) + } else { + item.layoutChain.top(14).edgesHorzontal(14) + } + previous = item + } + + let tip5 = UILabel() + tip5.text = "5. 请在输入框中输入以下文字" + tip5.font = .systemFont(ofSize: 16, weight: .medium) + tip5.textColor = UIColor(hexStr: "#293445") + card.addSubview(tip5) + tip5.layoutChain.topToBottomOfView(previous!, offset: 12).left(14).right(14) + + let phrase = UILabel() + phrase.text = "我自愿注销本账号" + phrase.font = .systemFont(ofSize: 16, weight: .medium) + phrase.textColor = UIColor(hexStr: "#F64545") + card.addSubview(phrase) + phrase.layoutChain.topToBottomOfView(tip5, offset: 8).leftToView(tip5, offset: 16) + + confirmInput.backgroundColor = UIColor(hexStr: "#F5F5F5") + confirmInput.layer.cornerRadius = 8 + confirmInput.borderWidth = 1 + confirmInput.borderColor = UIColor(hexStr: "#DEDEDE") + confirmInput.font = .systemFont(ofSize: 14, weight: .medium) + confirmInput.textColor = UIColor(hexStr: "#293445") + confirmInput.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 12, height: 1)) + confirmInput.leftViewMode = .always + confirmInput.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 12, height: 1)) + confirmInput.rightViewMode = .always + card.addSubview(confirmInput) + confirmInput.layoutChain + .topToBottomOfView(phrase, offset: 10) + .left(14) + .right(14) + .height(40) + .bottom(16) + } + + func setSaveEnabled(_ enabled: Bool) { + saveBtn.isEnabled = enabled + saveBtn.alpha = enabled ? 1 : 0.5 + saveBtn.backgroundColor = UIColor(hexStr: enabled ? "#FF5252" : "#FF9B9B") + } +} + +final class CancelCheckItemView: UIView { + let checkBtn = UIButton(type: .custom) + private let titleLab = UILabel() + private let subLab = UILabel() + + var isChecked: Bool { checkBtn.isSelected } + + init(title: String, subtitle: String) { + super.init(frame: .zero) + titleLab.text = title + titleLab.font = .systemFont(ofSize: 15, weight: .medium) + titleLab.textColor = UIColor(hexStr: "#293445") + titleLab.numberOfLines = 0 + addSubview(titleLab) + + subLab.text = subtitle + subLab.font = .systemFont(ofSize: 13, weight: .medium) + subLab.textColor = UIColor(hexStr: "#767676") + subLab.numberOfLines = 0 + addSubview(subLab) + + checkBtn.setBackgroundImage(UIImage(named: "Common/checkbox"), for: .normal) + checkBtn.setBackgroundImage(UIImage(named: "Common/checkbox_on"), for: .selected) + checkBtn.extendEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 20, right: 20) + addSubview(checkBtn) + + titleLab.layoutChain.top(10).left(0).rightToLeftOfView(checkBtn, offset: 8) + subLab.layoutChain.topToBottomOfView(titleLab, offset: 4).left(0).rightToLeftOfView(checkBtn, offset: 12).bottom(10) + checkBtn.layoutChain.right(0).centerY(titleLab).width(24).height(24) + } + + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } +} diff --git a/QuickLocation/Section/Mine/MinePhotoWallView.swift b/QuickLocation/Section/Mine/MinePhotoWallView.swift index 17829f07..3e23aab1 100644 --- a/QuickLocation/Section/Mine/MinePhotoWallView.swift +++ b/QuickLocation/Section/Mine/MinePhotoWallView.swift @@ -12,7 +12,8 @@ final class MinePhotoWallView: UIView { var onCenteredMember: ((GroupMemberModel) -> Void)? var onCopyID: ((String) -> Void)? - var onTapSelfAvatar: (() -> Void)? + /// 点击照片墙上某成员(含自己)→ 进入成员信息 + var onTapMember: ((GroupMemberModel) -> Void)? private var members: [GroupMemberModel] = [] /// 与 members 对齐的夹子颜色下标(相邻不同色) @@ -463,15 +464,13 @@ extension MinePhotoWallView: UICollectionViewDataSource, UICollectionViewDelegat func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let model = members[indexPath.item] - if model.user_id == AppContextManager.shared.userId { - onTapSelfAvatar?() - } centeredIndex = indexPath.item let before = collectionView.contentOffset scrollToIndex(indexPath.item, animated: true) applyArcAndFocus() updateInfo(model) onCenteredMember?(model) + onTapMember?(model) DispatchQueue.main.async { [weak self] in guard let self = self else { return } if abs(self.collectionView.contentOffset.x - before.x) < 0.5, !self.isDragging { diff --git a/QuickLocation/Section/Mine/MineViewController.swift b/QuickLocation/Section/Mine/MineViewController.swift index 504e38a3..eec0c366 100644 --- a/QuickLocation/Section/Mine/MineViewController.swift +++ b/QuickLocation/Section/Mine/MineViewController.swift @@ -9,6 +9,7 @@ import UIKit import RxSwift import RxCocoa import RxDataSources +import ObjectMapper final class MineViewController: BaseViewController { @@ -23,6 +24,8 @@ final class MineViewController: BaseViewController { private let viewModel = MineViewModel() private var groupKey: String = "" + private var groupModel: GroupModel? + private var photoWallMembers: [GroupMemberModel] = [] override func loadView() { rootView = MineView(frame: UIScreen.main.bounds) @@ -64,8 +67,8 @@ final class MineViewController: BaseViewController { DLToast.showSuccess(text: "已复制") } - rootView.photoWall.onTapSelfAvatar = { - AppRouter.push(Route.myProfile) + rootView.photoWall.onTapMember = { [weak self] member in + self?.openMemberInfo(selectedUserId: member.user_id) } rootView.onQuickTap = { [weak self] title in @@ -94,8 +97,10 @@ final class MineViewController: BaseViewController { private func requestGroupMembers() { GroupService.groupInfo().subscribe(onNext: { [weak self] response in guard let self = self, let model = response.model else { return } + self.groupModel = model self.groupKey = model.default_group_key let sorted = self.viewModel.sortedMembers(model.select_group_employee, groupKey: model.default_group_key) + self.photoWallMembers = sorted // 圈主 id:group_key 含 userId let ownerId = sorted.first(where: { model.default_group_key.contains($0.user_id) })?.user_id ?? "" self.rootView.photoWall.reload( @@ -105,4 +110,17 @@ final class MineViewController: BaseViewController { ) }).disposed(by: disposeBag) } + + private func openMemberInfo(selectedUserId: String) { + let members = photoWallMembers.map { $0.toJSON() } + guard !members.isEmpty else { return } + var userInfo: [String: Any] = [ + "members": members, + "userId": selectedUserId + ] + if let group = groupModel { + userInfo["groupJson"] = group.toJSON() + } + AppRouter.push(Route.memberInfo, userInfo: userInfo) + } } diff --git a/QuickLocation/Section/Mine/MineViewModel.swift b/QuickLocation/Section/Mine/MineViewModel.swift index 98c4ec44..bfd58954 100644 --- a/QuickLocation/Section/Mine/MineViewModel.swift +++ b/QuickLocation/Section/Mine/MineViewModel.swift @@ -59,8 +59,10 @@ class MineViewModel { requestWechatService() case "权限检测": AppRouter.push(Route.checkPermission) - case "数据安全", "状态设置", "关于我们": + case "数据安全", "状态设置": DLToast.show(text: "敬请期待") + case "关于我们": + AppRouter.push(Route.about) default: break } diff --git a/QuickLocation/Section/VipRecharge/VipRechargeView.swift b/QuickLocation/Section/VipRecharge/VipRechargeView.swift index c88f2b78..25bd206e 100644 --- a/QuickLocation/Section/VipRecharge/VipRechargeView.swift +++ b/QuickLocation/Section/VipRecharge/VipRechargeView.swift @@ -15,7 +15,11 @@ class VipRechargeView: UIView { private func setupRx() { navView.onBackTapped = { VipWaivePopView.show() } - + + backBtn.rx.tap.subscribe { _ in + VipWaivePopView.show() + }.disposed(by: disposeBag) + agreementLab.rx.tapGesture.subscribe { _ in AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.userAgreementUrl]) }.disposed(by: disposeBag) @@ -45,11 +49,19 @@ class VipRechargeView: UIView { bottomView.addSubview(payBtnView) bottomView.addSubview(payPriceView) + addSubview(backBtn) addSubview(navView) + backBtn.layoutChain + .top(kStatusBarHeight + 5) + .left(15) + .width(36) + .height(36) + navView.layoutChain .edges(excludingEdge: .bottom) .height(kNaviHeight) + navView.backgroundColor = .white navView.alpha = 0 bottomView.layoutChain @@ -131,6 +143,13 @@ class VipRechargeView: UIView { lazy var navView = BaseNavigationView(title: "升级会员") + lazy var backBtn: UIButton = { + let btn = UIButton(type: .custom) + btn.setImage(UIImage(named: "Common/back"), for: .normal) + btn.extendEdgeInsets = UIEdgeInsets(top: 54, left: 15, bottom: 100, right: 100) + return btn + }() + lazy var scrollView: UIScrollView = { let view = UIScrollView() view.backgroundColor = UIColor(hexStr: "#F5FBFB") @@ -716,7 +735,7 @@ class VipRechargeView: UIView { extension VipRechargeView: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { let maxY = scrollView.contentOffset.y - let alpha = maxY / kNaviHeight + let alpha = maxY / (kNaviHeight / 2) navView.alpha = alpha < 0.0 ? 0.0 : alpha } }