From 8997d1ba1c8a6ca27f48f2b067dcc1096aa34e01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B1=89=E7=A7=8B?= <497055328@qq.com> Date: Mon, 29 Jun 2026 10:22:53 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E6=88=90=20MJRefresh=20=E5=B9=B6?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=BB=20TabBar=20=E4=B8=BA=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=20TabView=20=E6=A0=B7=E5=BC=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 SwiftUI 桥接层与单元测试,更新 Tab 图标资源命名和多倍图,同步调整 UI Test 的 Tab/扫码定位逻辑。 Co-authored-by: Cursor --- Podfile | 1 + Podfile.lock | 6 +- Pods/MJRefresh/LICENSE | 19 + .../MJRefresh/Base/MJRefreshAutoFooter.h | 34 + .../MJRefresh/Base/MJRefreshAutoFooter.m | 216 +++ .../MJRefresh/Base/MJRefreshBackFooter.h | 21 + .../MJRefresh/Base/MJRefreshBackFooter.m | 158 ++ .../MJRefresh/Base/MJRefreshComponent.h | 151 ++ .../MJRefresh/Base/MJRefreshComponent.m | 323 ++++ .../MJRefresh/Base/MJRefreshFooter.h | 37 + .../MJRefresh/Base/MJRefreshFooter.m | 71 + .../MJRefresh/Base/MJRefreshHeader.h | 35 + .../MJRefresh/Base/MJRefreshHeader.m | 297 +++ .../MJRefresh/Base/MJRefreshTrailer.h | 30 + .../MJRefresh/Base/MJRefreshTrailer.m | 179 ++ .../Footer/Auto/MJRefreshAutoGifFooter.h | 25 + .../Footer/Auto/MJRefreshAutoGifFooter.m | 121 ++ .../Footer/Auto/MJRefreshAutoNormalFooter.h | 25 + .../Footer/Auto/MJRefreshAutoNormalFooter.m | 81 + .../Footer/Auto/MJRefreshAutoStateFooter.h | 30 + .../Footer/Auto/MJRefreshAutoStateFooter.m | 119 ++ .../Footer/Back/MJRefreshBackGifFooter.h | 25 + .../Footer/Back/MJRefreshBackGifFooter.m | 132 ++ .../Footer/Back/MJRefreshBackNormalFooter.h | 25 + .../Footer/Back/MJRefreshBackNormalFooter.m | 132 ++ .../Footer/Back/MJRefreshBackStateFooter.h | 29 + .../Footer/Back/MJRefreshBackStateFooter.m | 93 + .../Custom/Header/MJRefreshGifHeader.h | 25 + .../Custom/Header/MJRefreshGifHeader.m | 135 ++ .../Custom/Header/MJRefreshNormalHeader.h | 26 + .../Custom/Header/MJRefreshNormalHeader.m | 137 ++ .../Custom/Header/MJRefreshStateHeader.h | 39 + .../Custom/Header/MJRefreshStateHeader.m | 191 ++ .../Custom/Trailer/MJRefreshNormalTrailer.h | 23 + .../Custom/Trailer/MJRefreshNormalTrailer.m | 80 + .../Custom/Trailer/MJRefreshStateTrailer.h | 28 + .../Custom/Trailer/MJRefreshStateTrailer.m | 87 + .../MJRefresh/MJRefresh.bundle/arrow@2x.png | Bin 0 -> 1033 bytes .../en.lproj/Localizable.strings | Bin 0 -> 1374 bytes .../ko.lproj/Localizable.strings | 16 + .../ru.lproj/Localizable.strings | Bin 0 -> 1502 bytes .../MJRefresh.bundle/trail_arrow@2x.png | Bin 0 -> 2322 bytes .../uk.lproj/Localizable.strings | Bin 0 -> 1534 bytes .../zh-Hans.lproj/Localizable.strings | Bin 0 -> 1368 bytes .../zh-Hant.lproj/Localizable.strings | 19 + Pods/MJRefresh/MJRefresh/MJRefresh.h | 42 + Pods/MJRefresh/MJRefresh/MJRefreshConfig.h | 36 + Pods/MJRefresh/MJRefresh/MJRefreshConfig.m | 42 + Pods/MJRefresh/MJRefresh/MJRefreshConst.h | 115 ++ Pods/MJRefresh/MJRefresh/MJRefreshConst.m | 39 + Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.h | 21 + Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.m | 116 ++ .../MJRefresh/MJRefresh/PrivacyInfo.xcprivacy | 23 + .../UICollectionViewLayout+MJRefresh.h | 20 + .../UICollectionViewLayout+MJRefresh.m | 45 + .../MJRefresh/UIScrollView+MJExtension.h | 28 + .../MJRefresh/UIScrollView+MJExtension.m | 153 ++ .../MJRefresh/UIScrollView+MJRefresh.h | 36 + .../MJRefresh/UIScrollView+MJRefresh.m | 120 ++ Pods/MJRefresh/MJRefresh/UIView+MJExtension.h | 22 + Pods/MJRefresh/MJRefresh/UIView+MJExtension.m | 83 + Pods/MJRefresh/README.md | 457 +++++ Pods/Manifest.lock | 6 +- Pods/Pods.xcodeproj/project.pbxproj | 1641 +++++++++++------ .../MJRefresh/MJRefresh-Info.plist | 26 + .../MJRefresh/MJRefresh-dummy.m | 5 + .../MJRefresh/MJRefresh-prefix.pch | 12 + .../MJRefresh/MJRefresh-umbrella.h | 41 + .../MJRefresh/MJRefresh.debug.xcconfig | 12 + .../MJRefresh/MJRefresh.modulemap | 6 + .../MJRefresh/MJRefresh.release.xcconfig | 12 + ...dle-MJRefresh.Privacy-MJRefresh-Info.plist | 24 + .../Pods-suixinkan-acknowledgements.markdown | 23 + .../Pods-suixinkan-acknowledgements.plist | 29 + ...an-frameworks-Debug-input-files.xcfilelist | 2 + ...n-frameworks-Debug-output-files.xcfilelist | 1 + ...-frameworks-Release-input-files.xcfilelist | 2 + ...frameworks-Release-output-files.xcfilelist | 1 + .../Pods-suixinkan-frameworks.sh | 186 ++ .../Pods-suixinkan.debug.xcconfig | 7 +- .../Pods-suixinkan.release.xcconfig | 7 +- .../Pods-suixinkanTests.debug.xcconfig | 5 +- .../Pods-suixinkanTests.release.xcconfig | 5 +- suixinkan.xcodeproj/project.pbxproj | 30 +- suixinkan/App/Navigation/AppTab.swift | 28 + suixinkan/App/suixinkanApp.swift | 1 + .../tab_data_selected.png | Bin 2008 -> 0 bytes .../tab_data_unselected.png | Bin 2358 -> 0 bytes .../tab_home_selected.png | Bin 2075 -> 0 bytes .../tab_home_unselected.png | Bin 2404 -> 0 bytes .../tab_order_selected.png | Bin 1246 -> 0 bytes .../tab_order_unselected.png | Bin 1403 -> 0 bytes .../tab_profile_selected.png | Bin 1649 -> 0 bytes .../tab_profile_unselected.png | Bin 1922 -> 0 bytes .../icon_scan.imageset/Contents.json | 23 + .../icon_scan.imageset/icon_scan.png | Bin 0 -> 381 bytes .../icon_scan.imageset/icon_scan@2x.png | Bin 0 -> 675 bytes .../icon_scan.imageset/icon_scan@3x.png | Bin 0 -> 1022 bytes .../Contents.json | 2 + .../tab_data_selected.png | Bin 0 -> 908 bytes .../tab_data_selected@2x.png | Bin 0 -> 1802 bytes .../tab_data_selected@3x.png | Bin 0 -> 3015 bytes .../Contents.json | 2 + .../tab_data_unselected.png | Bin 0 -> 1169 bytes .../tab_data_unselected@2x.png | Bin 0 -> 2227 bytes .../tab_data_unselected@3x.png | Bin 0 -> 3864 bytes .../Contents.json | 2 + .../tab_home_selected.png | Bin 0 -> 867 bytes .../tab_home_selected@2x.png | Bin 0 -> 1673 bytes .../tab_home_selected@3x.png | Bin 0 -> 2910 bytes .../Contents.json | 2 + .../tab_home_unselected.png | Bin 0 -> 1129 bytes .../tab_home_unselected@2x.png | Bin 0 -> 2146 bytes .../tab_home_unselected@3x.png | Bin 0 -> 3892 bytes .../Contents.json | 2 + .../tab_order_selected.png | Bin 0 -> 733 bytes .../tab_order_selected@2x.png | Bin 0 -> 1246 bytes .../tab_order_selected@3x.png | Bin 0 -> 1834 bytes .../Contents.json | 2 + .../tab_order_unselected.png | Bin 0 -> 1026 bytes .../tab_order_unselected@2x.png | Bin 0 -> 1667 bytes .../tab_order_unselected@3x.png | Bin 0 -> 2410 bytes .../Contents.json | 2 + .../tab_profile_selected.png | Bin 0 -> 710 bytes .../tab_profile_selected@2x.png | Bin 0 -> 1485 bytes .../tab_profile_selected@3x.png | Bin 0 -> 2264 bytes .../Contents.json | 2 + .../tab_profile_unselected.png | Bin 0 -> 944 bytes .../tab_profile_unselected@2x.png | Bin 0 -> 1939 bytes .../tab_profile_unselected@3x.png | Bin 0 -> 2944 bytes suixinkan/Core/Core.md | 14 + suixinkan/Core/Design/MJRefreshSupport.swift | 205 ++ suixinkan/Features/Main/Main.md | 31 +- .../Main/Views/CustomMainTabBar.swift | 157 -- .../Features/Main/Views/MainTabsView.swift | 183 +- .../Views/OperatingAreaViews.swift | 4 +- suixinkanTests/MJRefreshSupportTests.swift | 38 + .../Orders/OrdersFlowUITests.swift | 13 +- .../Support/SuixinkanUIApplication.swift | 5 +- .../Support/TabBarNavigator.swift | 31 +- 140 files changed, 6574 insertions(+), 877 deletions(-) create mode 100644 Pods/MJRefresh/LICENSE create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.h create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.h create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.h create mode 100644 Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h create mode 100644 Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m create mode 100755 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/arrow@2x.png create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/en.lproj/Localizable.strings create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ko.lproj/Localizable.strings create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ru.lproj/Localizable.strings create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/trail_arrow@2x.png create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/uk.lproj/Localizable.strings create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hans.lproj/Localizable.strings create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings create mode 100644 Pods/MJRefresh/MJRefresh/MJRefresh.h create mode 100644 Pods/MJRefresh/MJRefresh/MJRefreshConfig.h create mode 100644 Pods/MJRefresh/MJRefresh/MJRefreshConfig.m create mode 100644 Pods/MJRefresh/MJRefresh/MJRefreshConst.h create mode 100644 Pods/MJRefresh/MJRefresh/MJRefreshConst.m create mode 100644 Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.h create mode 100644 Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.m create mode 100644 Pods/MJRefresh/MJRefresh/PrivacyInfo.xcprivacy create mode 100644 Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.h create mode 100644 Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.m create mode 100644 Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.h create mode 100644 Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m create mode 100644 Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.h create mode 100644 Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m create mode 100644 Pods/MJRefresh/MJRefresh/UIView+MJExtension.h create mode 100644 Pods/MJRefresh/MJRefresh/UIView+MJExtension.m create mode 100644 Pods/MJRefresh/README.md create mode 100644 Pods/Target Support Files/MJRefresh/MJRefresh-Info.plist create mode 100644 Pods/Target Support Files/MJRefresh/MJRefresh-dummy.m create mode 100644 Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch create mode 100644 Pods/Target Support Files/MJRefresh/MJRefresh-umbrella.h create mode 100644 Pods/Target Support Files/MJRefresh/MJRefresh.debug.xcconfig create mode 100644 Pods/Target Support Files/MJRefresh/MJRefresh.modulemap create mode 100644 Pods/Target Support Files/MJRefresh/MJRefresh.release.xcconfig create mode 100644 Pods/Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist create mode 100644 Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-output-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-input-files.xcfilelist create mode 100644 Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-output-files.xcfilelist create mode 100755 Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh delete mode 100644 suixinkan/Assets.xcassets/TabDataSelected.imageset/tab_data_selected.png delete mode 100644 suixinkan/Assets.xcassets/TabDataUnselected.imageset/tab_data_unselected.png delete mode 100644 suixinkan/Assets.xcassets/TabHomeSelected.imageset/tab_home_selected.png delete mode 100644 suixinkan/Assets.xcassets/TabHomeUnselected.imageset/tab_home_unselected.png delete mode 100644 suixinkan/Assets.xcassets/TabOrderSelected.imageset/tab_order_selected.png delete mode 100644 suixinkan/Assets.xcassets/TabOrderUnselected.imageset/tab_order_unselected.png delete mode 100644 suixinkan/Assets.xcassets/TabProfileSelected.imageset/tab_profile_selected.png delete mode 100644 suixinkan/Assets.xcassets/TabProfileUnselected.imageset/tab_profile_unselected.png create mode 100644 suixinkan/Assets.xcassets/icon_scan.imageset/Contents.json create mode 100644 suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan.png create mode 100644 suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@2x.png create mode 100644 suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@3x.png rename suixinkan/Assets.xcassets/{TabDataSelected.imageset => tab_data_selected.imageset}/Contents.json (77%) create mode 100644 suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected.png create mode 100644 suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@3x.png rename suixinkan/Assets.xcassets/{TabDataUnselected.imageset => tab_data_unselected.imageset}/Contents.json (76%) create mode 100644 suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected.png create mode 100644 suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected@3x.png rename suixinkan/Assets.xcassets/{TabHomeSelected.imageset => tab_home_selected.imageset}/Contents.json (77%) create mode 100644 suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected.png create mode 100644 suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@3x.png rename suixinkan/Assets.xcassets/{TabHomeUnselected.imageset => tab_home_unselected.imageset}/Contents.json (76%) create mode 100644 suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected.png create mode 100644 suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@3x.png rename suixinkan/Assets.xcassets/{TabOrderSelected.imageset => tab_order_selected.imageset}/Contents.json (76%) create mode 100644 suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected.png create mode 100644 suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@3x.png rename suixinkan/Assets.xcassets/{TabOrderUnselected.imageset => tab_order_unselected.imageset}/Contents.json (76%) create mode 100644 suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected.png create mode 100644 suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected@3x.png rename suixinkan/Assets.xcassets/{TabProfileSelected.imageset => tab_profile_selected.imageset}/Contents.json (76%) create mode 100644 suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected.png create mode 100644 suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@3x.png rename suixinkan/Assets.xcassets/{TabProfileUnselected.imageset => tab_profile_unselected.imageset}/Contents.json (75%) create mode 100644 suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected.png create mode 100644 suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected@2x.png create mode 100644 suixinkan/Assets.xcassets/tab_profile_unselected.imageset/tab_profile_unselected@3x.png create mode 100644 suixinkan/Core/Design/MJRefreshSupport.swift delete mode 100644 suixinkan/Features/Main/Views/CustomMainTabBar.swift create mode 100644 suixinkanTests/MJRefreshSupportTests.swift diff --git a/Podfile b/Podfile index 914de66..d8a9b67 100644 --- a/Podfile +++ b/Podfile @@ -7,6 +7,7 @@ target 'suixinkan' do pod 'AMap3DMap-NO-IDFA', '~> 11.1' pod 'AMapSearch-NO-IDFA', '~> 9.7' pod 'AMapLocation-NO-IDFA', '~> 2.11' + pod 'MJRefresh', '~> 3.7' target 'suixinkanTests' do inherit! :search_paths diff --git a/Podfile.lock b/Podfile.lock index db846d1..1b87510 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -6,11 +6,13 @@ PODS: - AMapFoundation-NO-IDFA (>= 1.8.7) - AMapSearch-NO-IDFA (9.7.5): - AMapFoundation-NO-IDFA (>= 1.8.0) + - MJRefresh (3.7.9) DEPENDENCIES: - AMap3DMap-NO-IDFA (~> 11.1) - AMapLocation-NO-IDFA (~> 2.11) - AMapSearch-NO-IDFA (~> 9.7) + - MJRefresh (~> 3.7) SPEC REPOS: trunk: @@ -18,13 +20,15 @@ SPEC REPOS: - AMapFoundation-NO-IDFA - AMapLocation-NO-IDFA - AMapSearch-NO-IDFA + - MJRefresh SPEC CHECKSUMS: AMap3DMap-NO-IDFA: 393a24abb0451fed2daa4316c8d3d356a395f2be AMapFoundation-NO-IDFA: f48acbf6e74913dc6744581053f7d984f2432850 AMapLocation-NO-IDFA: 0fa6e7d5e42e10253f4437424d98966f53760862 AMapSearch-NO-IDFA: 8e9d104032990a3b0cab66afb535299887c61047 + MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 -PODFILE CHECKSUM: baa972253fcebc312545f7592c48cbba632f1907 +PODFILE CHECKSUM: dd39a238c7d1f1de8b61bcb07e20911bedae96b7 COCOAPODS: 1.16.2 diff --git a/Pods/MJRefresh/LICENSE b/Pods/MJRefresh/LICENSE new file mode 100644 index 0000000..11bf234 --- /dev/null +++ b/Pods/MJRefresh/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.h b/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.h new file mode 100644 index 0000000..e4eb872 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.h @@ -0,0 +1,34 @@ +// +// MJRefreshAutoFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshAutoFooter : MJRefreshFooter +/** 是否自动刷新(默认为YES) */ +@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh; + +/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ +@property (assign, nonatomic) CGFloat appearencePercentTriggerAutoRefresh MJRefreshDeprecated("请使用triggerAutomaticallyRefreshPercent属性"); + +/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ +@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent; + +/** 自动触发次数, 默认为 1, 仅在拖拽 ScrollView 时才生效, + + 如果为 -1, 则为无限触发 + */ +@property (nonatomic) NSInteger autoTriggerTimes; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m b/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m new file mode 100644 index 0000000..66616e1 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m @@ -0,0 +1,216 @@ +// +// MJRefreshAutoFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoFooter.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +@interface MJRefreshAutoFooter() +/** 一个新的拖拽 */ +@property (nonatomic) BOOL triggerByDrag; +@property (nonatomic) NSInteger leftTriggerTimes; +@end + +@implementation MJRefreshAutoFooter + +#pragma mark - 初始化 +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + if (newSuperview) { // 新的父控件 + if (self.hidden == NO) { + self.scrollView.mj_insetB += self.mj_h; + } + + // 设置位置 + self.mj_y = _scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom; + } else { // 被移除了 + if (self.hidden == NO) { + self.scrollView.mj_insetB -= self.mj_h; + } + } +} + +#pragma mark - 过期方法 +- (void)setAppearencePercentTriggerAutoRefresh:(CGFloat)appearencePercentTriggerAutoRefresh +{ + self.triggerAutomaticallyRefreshPercent = appearencePercentTriggerAutoRefresh; +} + +- (CGFloat)appearencePercentTriggerAutoRefresh +{ + return self.triggerAutomaticallyRefreshPercent; +} + +#pragma mark - 实现父类的方法 +- (void)prepare +{ + [super prepare]; + + // 默认底部控件100%出现时才会自动刷新 + self.triggerAutomaticallyRefreshPercent = 1.0; + + // 设置为默认状态 + self.automaticallyRefresh = YES; + + self.autoTriggerTimes = 1; +} + +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change +{ + [super scrollViewContentSizeDidChange:change]; + + CGSize size = [change[NSKeyValueChangeNewKey] CGSizeValue]; + CGFloat contentHeight = size.height == 0 ? self.scrollView.mj_contentH : size.height; + // 设置位置 + CGFloat y = contentHeight + self.ignoredScrollViewContentInsetBottom; + if (self.mj_y != y) { + self.mj_y = y; + } +} + +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change +{ + [super scrollViewContentOffsetDidChange:change]; + + if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return; + + if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕 + // 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理 + if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) { + // 防止手松开时连续调用 + CGPoint old = [change[@"old"] CGPointValue]; + CGPoint new = [change[@"new"] CGPointValue]; + if (new.y <= old.y) return; + + if (_scrollView.isDragging) { + self.triggerByDrag = YES; + } + // 当底部刷新控件完全出现时,才刷新 + [self beginRefreshing]; + } + } +} + +- (void)scrollViewPanStateDidChange:(NSDictionary *)change +{ + [super scrollViewPanStateDidChange:change]; + + if (self.state != MJRefreshStateIdle) return; + + UIGestureRecognizerState panState = _scrollView.panGestureRecognizer.state; + + switch (panState) { + // 手松开 + case UIGestureRecognizerStateEnded: { + if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) { // 不够一个屏幕 + if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽 + self.triggerByDrag = YES; + [self beginRefreshing]; + } + } else { // 超出一个屏幕 + if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) { + self.triggerByDrag = YES; + [self beginRefreshing]; + } + } + } + break; + + case UIGestureRecognizerStateBegan: { + [self resetTriggerTimes]; + } + break; + + default: + break; + } +} + +- (BOOL)unlimitedTrigger { + return self.leftTriggerTimes == -1; +} + +- (void)beginRefreshing +{ + if (self.triggerByDrag && self.leftTriggerTimes <= 0 && !self.unlimitedTrigger) { + return; + } + + [super beginRefreshing]; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + if (state == MJRefreshStateRefreshing) { + [self executeRefreshingCallback]; + } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + if (self.triggerByDrag) { + if (!self.unlimitedTrigger) { + self.leftTriggerTimes -= 1; + } + self.triggerByDrag = NO; + } + + if (MJRefreshStateRefreshing == oldState) { + if (self.scrollView.pagingEnabled) { + CGPoint offset = self.scrollView.contentOffset; + offset.y -= self.scrollView.mj_insetB; + [UIView animateWithDuration:self.slowAnimationDuration animations:^{ + self.scrollView.contentOffset = offset; + + if (self.endRefreshingAnimationBeginAction) { + self.endRefreshingAnimationBeginAction(); + } + } completion:^(BOOL finished) { + if (self.endRefreshingCompletionBlock) { + self.endRefreshingCompletionBlock(); + } + }]; + return; + } + + if (self.endRefreshingCompletionBlock) { + self.endRefreshingCompletionBlock(); + } + } + } +} + +- (void)resetTriggerTimes { + self.leftTriggerTimes = self.autoTriggerTimes; +} + +- (void)setHidden:(BOOL)hidden +{ + BOOL lastHidden = self.isHidden; + + [super setHidden:hidden]; + + if (!lastHidden && hidden) { + self.state = MJRefreshStateIdle; + + self.scrollView.mj_insetB -= self.mj_h; + } else if (lastHidden && !hidden) { + self.scrollView.mj_insetB += self.mj_h; + + // 设置位置 + self.mj_y = _scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom; + } +} + +- (void)setAutoTriggerTimes:(NSInteger)autoTriggerTimes { + _autoTriggerTimes = autoTriggerTimes; + self.leftTriggerTimes = autoTriggerTimes; +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.h b/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.h new file mode 100644 index 0000000..8484372 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.h @@ -0,0 +1,21 @@ +// +// MJRefreshBackFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshBackFooter : MJRefreshFooter + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m b/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m new file mode 100644 index 0000000..4990ca5 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m @@ -0,0 +1,158 @@ +// +// MJRefreshBackFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackFooter.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +@interface MJRefreshBackFooter() +@property (assign, nonatomic) NSInteger lastRefreshCount; +@property (assign, nonatomic) CGFloat lastBottomDelta; +@end + +@implementation MJRefreshBackFooter + +#pragma mark - 初始化 +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + [self scrollViewContentSizeDidChange:nil]; +} + +#pragma mark - 实现父类的方法 +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change +{ + [super scrollViewContentOffsetDidChange:change]; + + // 如果正在刷新,直接返回 + if (self.state == MJRefreshStateRefreshing) return; + + _scrollViewOriginalInset = self.scrollView.mj_inset; + + // 当前的contentOffset + CGFloat currentOffsetY = self.scrollView.mj_offsetY; + // 尾部控件刚好出现的offsetY + CGFloat happenOffsetY = [self happenOffsetY]; + // 如果是向下滚动到看不见尾部控件,直接返回 + if (currentOffsetY <= happenOffsetY) return; + + CGFloat pullingPercent = (currentOffsetY - happenOffsetY) / self.mj_h; + + // 如果已全部加载,仅设置pullingPercent,然后返回 + if (self.state == MJRefreshStateNoMoreData) { + self.pullingPercent = pullingPercent; + return; + } + + if (self.scrollView.isDragging) { + self.pullingPercent = pullingPercent; + // 普通 和 即将刷新 的临界点 + CGFloat normal2pullingOffsetY = happenOffsetY + self.mj_h; + + if (self.state == MJRefreshStateIdle && currentOffsetY > normal2pullingOffsetY) { + // 转为即将刷新状态 + self.state = MJRefreshStatePulling; + } else if (self.state == MJRefreshStatePulling && currentOffsetY <= normal2pullingOffsetY) { + // 转为普通状态 + self.state = MJRefreshStateIdle; + } + } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 + // 开始刷新 + [self beginRefreshing]; + } else if (pullingPercent < 1) { + self.pullingPercent = pullingPercent; + } +} + +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change +{ + [super scrollViewContentSizeDidChange:change]; + + CGSize size = [change[NSKeyValueChangeNewKey] CGSizeValue]; + CGFloat contentHeight = size.height == 0 ? self.scrollView.mj_contentH : size.height; + // 内容的高度 + contentHeight += self.ignoredScrollViewContentInsetBottom; + // 表格的高度 + CGFloat scrollHeight = self.scrollView.mj_h - self.scrollViewOriginalInset.top - self.scrollViewOriginalInset.bottom + self.ignoredScrollViewContentInsetBottom; + // 设置位置 + CGFloat y = MAX(contentHeight, scrollHeight); + if (self.mj_y != y) { + self.mj_y = y; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态来设置属性 + if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + // 刷新完毕 + if (MJRefreshStateRefreshing == oldState) { + [UIView animateWithDuration:self.slowAnimationDuration animations:^{ + if (self.endRefreshingAnimationBeginAction) { + self.endRefreshingAnimationBeginAction(); + } + + self.scrollView.mj_insetB -= self.lastBottomDelta; + // 自动调整透明度 + if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0; + } completion:^(BOOL finished) { + self.pullingPercent = 0.0; + + if (self.endRefreshingCompletionBlock) { + self.endRefreshingCompletionBlock(); + } + }]; + } + + CGFloat deltaH = [self heightForContentBreakView]; + // 刚刷新完毕 + if (MJRefreshStateRefreshing == oldState && deltaH > 0 && self.scrollView.mj_totalDataCount != self.lastRefreshCount) { + self.scrollView.mj_offsetY = self.scrollView.mj_offsetY; + } + } else if (state == MJRefreshStateRefreshing) { + // 记录刷新前的数量 + self.lastRefreshCount = self.scrollView.mj_totalDataCount; + + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + CGFloat bottom = self.mj_h + self.scrollViewOriginalInset.bottom; + CGFloat deltaH = [self heightForContentBreakView]; + if (deltaH < 0) { // 如果内容高度小于view的高度 + bottom -= deltaH; + } + self.lastBottomDelta = bottom - self.scrollView.mj_insetB; + self.scrollView.mj_insetB = bottom; + self.scrollView.mj_offsetY = [self happenOffsetY] + self.mj_h; + } completion:^(BOOL finished) { + [self executeRefreshingCallback]; + }]; + } +} +#pragma mark - 私有方法 +#pragma mark 获得scrollView的内容 超出 view 的高度 +- (CGFloat)heightForContentBreakView +{ + CGFloat h = self.scrollView.frame.size.height - self.scrollViewOriginalInset.bottom - self.scrollViewOriginalInset.top; + return self.scrollView.contentSize.height - h; +} + +#pragma mark 刚好看到上拉刷新控件时的contentOffset.y +- (CGFloat)happenOffsetY +{ + CGFloat deltaH = [self heightForContentBreakView]; + if (deltaH > 0) { + return deltaH - self.scrollViewOriginalInset.top; + } else { + return - self.scrollViewOriginalInset.top; + } +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.h b/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.h new file mode 100644 index 0000000..f098101 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.h @@ -0,0 +1,151 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// MJRefreshComponent.h +// MJRefresh +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 刷新控件的基类 + +#import +#if __has_include() +#import +#else +#import "MJRefreshConst.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** 刷新控件的状态 */ +typedef NS_ENUM(NSInteger, MJRefreshState) { + /** 普通闲置状态 */ + MJRefreshStateIdle = 1, + /** 松开就可以进行刷新的状态 */ + MJRefreshStatePulling, + /** 正在刷新中的状态 */ + MJRefreshStateRefreshing, + /** 即将刷新的状态 */ + MJRefreshStateWillRefresh, + /** 所有数据加载完毕,没有更多的数据了 */ + MJRefreshStateNoMoreData +}; + +/** 进入刷新状态的回调 */ +typedef void (^MJRefreshComponentRefreshingBlock)(void) MJRefreshDeprecated("first deprecated in 3.3.0 - Use `MJRefreshComponentAction` instead"); +/** 开始刷新后的回调(进入刷新状态后的回调) */ +typedef void (^MJRefreshComponentBeginRefreshingCompletionBlock)(void) MJRefreshDeprecated("first deprecated in 3.3.0 - Use `MJRefreshComponentAction` instead"); +/** 结束刷新后的回调 */ +typedef void (^MJRefreshComponentEndRefreshingCompletionBlock)(void) MJRefreshDeprecated("first deprecated in 3.3.0 - Use `MJRefreshComponentAction` instead"); + +/** 刷新用到的回调类型 */ +typedef void (^MJRefreshComponentAction)(void); + +/** 刷新控件的基类 */ +@interface MJRefreshComponent : UIView +{ + /** 记录scrollView刚开始的inset */ + UIEdgeInsets _scrollViewOriginalInset; + /** 父控件 */ + __weak UIScrollView *_scrollView; +} + +#pragma mark - 刷新动画时间控制 +/** 快速动画时间(一般用在刷新开始的回弹动画), 默认 0.25 */ +@property (nonatomic) NSTimeInterval fastAnimationDuration; +/** 慢速动画时间(一般用在刷新结束后的回弹动画), 默认 0.4*/ +@property (nonatomic) NSTimeInterval slowAnimationDuration; +/** 关闭全部默认动画效果, 可以简单粗暴地解决 CollectionView 的回弹动画 bug */ +- (instancetype)setAnimationDisabled; + +#pragma mark - 刷新回调 +/** 正在刷新的回调 */ +@property (copy, nonatomic, nullable) MJRefreshComponentAction refreshingBlock; +/** 设置回调对象和回调方法 */ +- (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** 回调对象 */ +@property (weak, nonatomic) id refreshingTarget; +/** 回调方法 */ +@property (assign, nonatomic) SEL refreshingAction; +/** 触发回调(交给子类去调用) */ +- (void)executeRefreshingCallback; + +#pragma mark - 刷新状态控制 +/** 进入刷新状态 */ +- (void)beginRefreshing; +- (void)beginRefreshingWithCompletionBlock:(void (^)(void))completionBlock; +/** 开始刷新后的回调(进入刷新状态后的回调) */ +@property (copy, nonatomic, nullable) MJRefreshComponentAction beginRefreshingCompletionBlock; +/** 带动画的结束刷新的回调 */ +@property (copy, nonatomic, nullable) MJRefreshComponentAction endRefreshingAnimateCompletionBlock MJRefreshDeprecated("first deprecated in 3.3.0 - Use `endRefreshingAnimationBeginAction` instead"); +@property (copy, nonatomic, nullable) MJRefreshComponentAction endRefreshingAnimationBeginAction; +/** 结束刷新的回调 */ +@property (copy, nonatomic, nullable) MJRefreshComponentAction endRefreshingCompletionBlock; +/** 结束刷新状态 */ +- (void)endRefreshing; +- (void)endRefreshingWithCompletionBlock:(void (^)(void))completionBlock; +/** 是否正在刷新 */ +@property (assign, nonatomic, readonly, getter=isRefreshing) BOOL refreshing; + +/** 刷新状态 一般交给子类内部实现 */ +@property (assign, nonatomic) MJRefreshState state; + +#pragma mark - 交给子类去访问 +/** 记录scrollView刚开始的inset */ +@property (assign, nonatomic, readonly) UIEdgeInsets scrollViewOriginalInset; +/** 父控件 */ +@property (weak, nonatomic, readonly) UIScrollView *scrollView; + +#pragma mark - 交给子类们去实现 +/** 初始化 */ +- (void)prepare NS_REQUIRES_SUPER; +/** 摆放子控件frame */ +- (void)placeSubviews NS_REQUIRES_SUPER; +/** 当scrollView的contentOffset发生改变的时候调用 */ +- (void)scrollViewContentOffsetDidChange:(nullable NSDictionary *)change NS_REQUIRES_SUPER; +/** 当scrollView的contentSize发生改变的时候调用 */ +- (void)scrollViewContentSizeDidChange:(nullable NSDictionary *)change NS_REQUIRES_SUPER; +/** 当scrollView的拖拽状态发生改变的时候调用 */ +- (void)scrollViewPanStateDidChange:(nullable NSDictionary *)change NS_REQUIRES_SUPER; + +/** 多语言配置 language 发生变化时调用 + + `MJRefreshConfig.defaultConfig.language` 发生改变时调用. + + ⚠️ 父类会调用 `placeSubviews` 方法, 请勿在 placeSubviews 中调用本方法, 造成死循环. 子类在需要重新布局时, 在配置完修改后, 最后再调用 super 方法, 否则可能导致配置修改后, 定位先于修改执行. + */ +- (void)i18nDidChange NS_REQUIRES_SUPER; + +#pragma mark - 其他 +/** 拉拽的百分比(交给子类重写) */ +@property (assign, nonatomic) CGFloat pullingPercent; +/** 根据拖拽比例自动切换透明度 */ +@property (assign, nonatomic, getter=isAutoChangeAlpha) BOOL autoChangeAlpha MJRefreshDeprecated("请使用automaticallyChangeAlpha属性"); +/** 根据拖拽比例自动切换透明度 */ +@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha; +@end + +@interface UILabel(MJRefresh) ++ (instancetype)mj_label; +- (CGFloat)mj_textWidth; +@end + +@interface MJRefreshComponent (ChainingGrammar) + +#pragma mark - <<< 为 Swift 扩展链式语法 >>> - +/// 自动变化透明度 +- (instancetype)autoChangeTransparency:(BOOL)isAutoChange; +/// 刷新开始后立即调用的回调 +- (instancetype)afterBeginningAction:(MJRefreshComponentAction)action; +/// 刷新动画开始后立即调用的回调 +- (instancetype)endingAnimationBeginningAction:(MJRefreshComponentAction)action; +/// 刷新结束后立即调用的回调 +- (instancetype)afterEndingAction:(MJRefreshComponentAction)action; + + +/// 需要子类必须实现 +/// @param scrollView 赋值给的 ScrollView 的 Header/Footer/Trailer +- (instancetype)linkTo:(UIScrollView *)scrollView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m b/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m new file mode 100644 index 0000000..785df18 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m @@ -0,0 +1,323 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// MJRefreshComponent.m +// MJRefresh +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshComponent.h" +#import "MJRefreshConst.h" +#import "MJRefreshConfig.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" +#import "NSBundle+MJRefresh.h" + +@interface MJRefreshComponent() +@property (strong, nonatomic) UIPanGestureRecognizer *pan; +@end + +@implementation MJRefreshComponent +#pragma mark - 初始化 +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + // 准备工作 + [self prepare]; + + // 默认是普通状态 + self.state = MJRefreshStateIdle; + self.fastAnimationDuration = 0.25; + self.slowAnimationDuration = 0.4; + } + return self; +} + +- (void)prepare +{ + // 基本属性 + self.autoresizingMask = UIViewAutoresizingFlexibleWidth; + self.backgroundColor = [UIColor clearColor]; +} + +- (void)layoutSubviews +{ + [self placeSubviews]; + + [super layoutSubviews]; +} + +- (void)placeSubviews{} + +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + // 如果不是UIScrollView,不做任何事情 + if (newSuperview && ![newSuperview isKindOfClass:[UIScrollView class]]) return; + + // 旧的父控件移除监听 + [self removeObservers]; + + if (newSuperview) { // 新的父控件 + // 记录UIScrollView + _scrollView = (UIScrollView *)newSuperview; + + // 设置宽度 + self.mj_w = _scrollView.mj_w; + // 设置位置 + self.mj_x = -_scrollView.mj_insetL; + + // 设置永远支持垂直弹簧效果 + _scrollView.alwaysBounceVertical = YES; + // 记录UIScrollView最开始的contentInset + _scrollViewOriginalInset = _scrollView.mj_inset; + + // 添加监听 + [self addObservers]; + } +} + +- (void)drawRect:(CGRect)rect +{ + [super drawRect:rect]; + + if (self.state == MJRefreshStateWillRefresh) { + // 预防view还没显示出来就调用了beginRefreshing + self.state = MJRefreshStateRefreshing; + } +} + +#pragma mark - KVO监听 +- (void)addObservers +{ + NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld; + [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentOffset options:options context:nil]; + [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentSize options:options context:nil]; + self.pan = self.scrollView.panGestureRecognizer; + [self.pan addObserver:self forKeyPath:MJRefreshKeyPathPanState options:options context:nil]; + + [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(i18nDidChange) name:MJRefreshDidChangeLanguageNotification object:MJRefreshConfig.defaultConfig]; +} + +- (void)removeObservers +{ + [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentOffset]; + [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentSize]; + [self.pan removeObserver:self forKeyPath:MJRefreshKeyPathPanState]; + self.pan = nil; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + // 遇到这些情况就直接返回 + if (!self.userInteractionEnabled) return; + + // 这个就算看不见也需要处理 + if ([keyPath isEqualToString:MJRefreshKeyPathContentSize]) { + [self scrollViewContentSizeDidChange:change]; + } + + // 看不见 + if (self.hidden) return; + if ([keyPath isEqualToString:MJRefreshKeyPathContentOffset]) { + [self scrollViewContentOffsetDidChange:change]; + } else if ([keyPath isEqualToString:MJRefreshKeyPathPanState]) { + [self scrollViewPanStateDidChange:change]; + } +} + +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change{} +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change{} +- (void)scrollViewPanStateDidChange:(NSDictionary *)change{} + +- (void)i18nDidChange { + [self placeSubviews]; +} + +#pragma mark - 公共方法 +#pragma mark 设置回调对象和回调方法 +- (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action +{ + self.refreshingTarget = target; + self.refreshingAction = action; +} + +- (void)setState:(MJRefreshState)state +{ + _state = state; + + // 加入主队列的目的是等setState:方法调用完毕、设置完文字后再去布局子控件 + MJRefreshDispatchAsyncOnMainQueue([self setNeedsLayout];) +} + +#pragma mark 进入刷新状态 +- (void)beginRefreshing +{ + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.alpha = 1.0; + }]; + self.pullingPercent = 1.0; + // 只要正在刷新,就完全显示 + if (self.window) { + self.state = MJRefreshStateRefreshing; + } else { + // 预防正在刷新中时,调用本方法使得header inset回置失败 + if (self.state != MJRefreshStateRefreshing) { + self.state = MJRefreshStateWillRefresh; + // 刷新(预防从另一个控制器回到这个控制器的情况,回来要重新刷新一下) + [self setNeedsDisplay]; + } + } +} + +- (void)beginRefreshingWithCompletionBlock:(void (^)(void))completionBlock +{ + self.beginRefreshingCompletionBlock = completionBlock; + + [self beginRefreshing]; +} + +#pragma mark 结束刷新状态 +- (void)endRefreshing +{ + MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateIdle;) +} + +- (void)endRefreshingWithCompletionBlock:(void (^)(void))completionBlock +{ + self.endRefreshingCompletionBlock = completionBlock; + + [self endRefreshing]; +} + +#pragma mark 是否正在刷新 +- (BOOL)isRefreshing +{ + return self.state == MJRefreshStateRefreshing || self.state == MJRefreshStateWillRefresh; +} + +#pragma mark 自动切换透明度 +- (void)setAutoChangeAlpha:(BOOL)autoChangeAlpha +{ + self.automaticallyChangeAlpha = autoChangeAlpha; +} + +- (BOOL)isAutoChangeAlpha +{ + return self.isAutomaticallyChangeAlpha; +} + +- (void)setAutomaticallyChangeAlpha:(BOOL)automaticallyChangeAlpha +{ + _automaticallyChangeAlpha = automaticallyChangeAlpha; + + if (self.isRefreshing) return; + + if (automaticallyChangeAlpha) { + self.alpha = self.pullingPercent; + } else { + self.alpha = 1.0; + } +} + +#pragma mark 根据拖拽进度设置透明度 +- (void)setPullingPercent:(CGFloat)pullingPercent +{ + _pullingPercent = pullingPercent; + + if (self.isRefreshing) return; + + if (self.isAutomaticallyChangeAlpha) { + self.alpha = pullingPercent; + } +} + +#pragma mark - 内部方法 +- (void)executeRefreshingCallback +{ + if (self.refreshingBlock) { + self.refreshingBlock(); + } + if ([self.refreshingTarget respondsToSelector:self.refreshingAction]) { + MJRefreshMsgSend(MJRefreshMsgTarget(self.refreshingTarget), self.refreshingAction, self); + } + if (self.beginRefreshingCompletionBlock) { + self.beginRefreshingCompletionBlock(); + } +} + +#pragma mark - 刷新动画时间控制 +- (instancetype)setAnimationDisabled { + self.fastAnimationDuration = 0; + self.slowAnimationDuration = 0; + + return self; +} + +#pragma mark - <<< Deprecation compatible function >>> - +- (void)setEndRefreshingAnimateCompletionBlock:(MJRefreshComponentEndRefreshingCompletionBlock)endRefreshingAnimateCompletionBlock { + _endRefreshingAnimationBeginAction = endRefreshingAnimateCompletionBlock; +} +@end + +@implementation UILabel(MJRefresh) ++ (instancetype)mj_label +{ + UILabel *label = [[self alloc] init]; + label.font = MJRefreshLabelFont; + label.textColor = MJRefreshLabelTextColor; + label.autoresizingMask = UIViewAutoresizingFlexibleWidth; + label.textAlignment = NSTextAlignmentCenter; + label.backgroundColor = [UIColor clearColor]; + return label; +} + +- (CGFloat)mj_textWidth { + CGFloat stringWidth = 0; + CGSize size = CGSizeMake(MAXFLOAT, MAXFLOAT); + + if (self.attributedText) { + if (self.attributedText.length == 0) { return 0; } + stringWidth = [self.attributedText boundingRectWithSize:size + options:NSStringDrawingUsesLineFragmentOrigin + context:nil].size.width; + } else { + if (self.text.length == 0) { return 0; } + NSAssert(self.font != nil, @"请检查 mj_label's `font` 是否设置正确"); + stringWidth = [self.text boundingRectWithSize:size + options:NSStringDrawingUsesLineFragmentOrigin + attributes:@{NSFontAttributeName:self.font} + context:nil].size.width; + } + return stringWidth; +} +@end + + +#pragma mark - <<< 为 Swift 扩展链式语法 >>> - +@implementation MJRefreshComponent (ChainingGrammar) + +- (instancetype)autoChangeTransparency:(BOOL)isAutoChange { + self.automaticallyChangeAlpha = isAutoChange; + return self; +} +- (instancetype)afterBeginningAction:(MJRefreshComponentAction)action { + self.beginRefreshingCompletionBlock = action; + return self; +} +- (instancetype)endingAnimationBeginningAction:(MJRefreshComponentAction)action { + self.endRefreshingAnimationBeginAction = action; + return self; +} +- (instancetype)afterEndingAction:(MJRefreshComponentAction)action { + self.endRefreshingCompletionBlock = action; + return self; +} + +- (instancetype)linkTo:(UIScrollView *)scrollView { + return self; +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.h b/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.h new file mode 100644 index 0000000..7b7c7b6 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.h @@ -0,0 +1,37 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// MJRefreshFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/3/5. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 上拉刷新控件 + +#if __has_include() +#import +#else +#import "MJRefreshComponent.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshFooter : MJRefreshComponent +/** 创建footer */ ++ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; +/** 创建footer */ ++ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** 提示没有更多的数据 */ +- (void)endRefreshingWithNoMoreData; +- (void)noticeNoMoreData MJRefreshDeprecated("使用endRefreshingWithNoMoreData"); + +/** 重置没有更多的数据(消除没有更多数据的状态) */ +- (void)resetNoMoreData; + +/** 忽略多少scrollView的contentInset的bottom */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom; + +/** 自动根据有无数据来显示和隐藏(有数据就显示,没有数据隐藏。默认是NO) */ +@property (assign, nonatomic, getter=isAutomaticallyHidden) BOOL automaticallyHidden MJRefreshDeprecated("已废弃此属性,开发者请自行控制footer的显示和隐藏"); +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m b/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m new file mode 100644 index 0000000..8096fdb --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m @@ -0,0 +1,71 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// MJRefreshFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/3/5. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshFooter.h" +#import "UIScrollView+MJRefresh.h" +#import "UIView+MJExtension.h" + +@interface MJRefreshFooter() + +@end + +@implementation MJRefreshFooter +#pragma mark - 构造方法 ++ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock +{ + MJRefreshFooter *cmp = [[self alloc] init]; + cmp.refreshingBlock = refreshingBlock; + return cmp; +} ++ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action +{ + MJRefreshFooter *cmp = [[self alloc] init]; + [cmp setRefreshingTarget:target refreshingAction:action]; + return cmp; +} + +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + // 设置自己的高度 + self.mj_h = MJRefreshFooterHeight; + + // 默认不会自动隐藏 +// self.automaticallyHidden = NO; +} + +#pragma mark . 链式语法部分 . + +- (instancetype)linkTo:(UIScrollView *)scrollView { + scrollView.mj_footer = self; + return self; +} + +#pragma mark - 公共方法 +- (void)endRefreshingWithNoMoreData +{ + MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateNoMoreData;) +} + +- (void)noticeNoMoreData +{ + [self endRefreshingWithNoMoreData]; +} + +- (void)resetNoMoreData +{ + MJRefreshDispatchAsyncOnMainQueue(self.state = MJRefreshStateIdle;) +} + +- (void)setAutomaticallyHidden:(BOOL)automaticallyHidden +{ + _automaticallyHidden = automaticallyHidden; +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.h b/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.h new file mode 100644 index 0000000..95d8cb2 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.h @@ -0,0 +1,35 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// MJRefreshHeader.h +// MJRefresh +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 下拉刷新控件:负责监控用户下拉的状态 + +#if __has_include() +#import +#else +#import "MJRefreshComponent.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshHeader : MJRefreshComponent +/** 创建header */ ++ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; +/** 创建header */ ++ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** 这个key用来存储上一次下拉刷新成功的时间 */ +@property (copy, nonatomic) NSString *lastUpdatedTimeKey; +/** 上一次下拉刷新成功的时间 */ +@property (strong, nonatomic, readonly, nullable) NSDate *lastUpdatedTime; + +/** 忽略多少scrollView的contentInset的top */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop; + +/** 默认是关闭状态, 如果遇到 CollectionView 的动画异常问题可以尝试打开 */ +@property (nonatomic) BOOL isCollectionViewAnimationBug; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m b/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m new file mode 100644 index 0000000..b276412 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m @@ -0,0 +1,297 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// MJRefreshHeader.m +// MJRefresh +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshHeader.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +NSString * const MJRefreshHeaderRefreshing2IdleBoundsKey = @"MJRefreshHeaderRefreshing2IdleBounds"; +NSString * const MJRefreshHeaderRefreshingBoundsKey = @"MJRefreshHeaderRefreshingBounds"; + +@interface MJRefreshHeader() +@property (assign, nonatomic) CGFloat insetTDelta; +@end + +@implementation MJRefreshHeader +#pragma mark - 构造方法 ++ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock +{ + MJRefreshHeader *cmp = [[self alloc] init]; + cmp.refreshingBlock = refreshingBlock; + return cmp; +} ++ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action +{ + MJRefreshHeader *cmp = [[self alloc] init]; + [cmp setRefreshingTarget:target refreshingAction:action]; + return cmp; +} + +#pragma mark - 覆盖父类的方法 +- (void)prepare +{ + [super prepare]; + + // 设置key + self.lastUpdatedTimeKey = MJRefreshHeaderLastUpdatedTimeKey; + + // 设置高度 + self.mj_h = MJRefreshHeaderHeight; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 设置y值(当自己的高度发生改变了,肯定要重新调整Y值,所以放到placeSubviews方法中设置y值) + self.mj_y = - self.mj_h - self.ignoredScrollViewContentInsetTop; +} + +- (void)resetInset { + if (@available(iOS 11.0, *)) { + } else { + // 如果 iOS 10 及以下系统在刷新时, push 新的 VC, 等待刷新完成后回来, 会导致顶部 Insets.top 异常, 不能 resetInset, 检查一下这种特殊情况 + if (!self.window) { return; } + } + + // sectionheader停留解决 + CGFloat insetT = - self.scrollView.mj_offsetY > _scrollViewOriginalInset.top ? - self.scrollView.mj_offsetY : _scrollViewOriginalInset.top; + insetT = insetT > self.mj_h + _scrollViewOriginalInset.top ? self.mj_h + _scrollViewOriginalInset.top : insetT; + self.insetTDelta = _scrollViewOriginalInset.top - insetT; + // 避免 CollectionView 在使用根据 Autolayout 和 内容自动伸缩 Cell, 刷新时导致的 Layout 异常渲染问题 + if (fabs(self.scrollView.mj_insetT - insetT) > FLT_EPSILON) { + self.scrollView.mj_insetT = insetT; + } +} + +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change +{ + [super scrollViewContentOffsetDidChange:change]; + + // 在刷新的refreshing状态 + if (self.state == MJRefreshStateRefreshing) { + [self resetInset]; + return; + } + + // 跳转到下一个控制器时,contentInset可能会变 + _scrollViewOriginalInset = self.scrollView.mj_inset; + + // 当前的contentOffset + CGFloat offsetY = self.scrollView.mj_offsetY; + // 头部控件刚好出现的offsetY + CGFloat happenOffsetY = - self.scrollViewOriginalInset.top; + + // 如果是向上滚动到看不见头部控件,直接返回 + // >= -> > + if (offsetY > happenOffsetY) return; + + // 普通 和 即将刷新 的临界点 + CGFloat normal2pullingOffsetY = happenOffsetY - self.mj_h; + CGFloat pullingPercent = (happenOffsetY - offsetY) / self.mj_h; + + if (self.scrollView.isDragging) { // 如果正在拖拽 + self.pullingPercent = pullingPercent; + if (self.state == MJRefreshStateIdle && offsetY < normal2pullingOffsetY) { + // 转为即将刷新状态 + self.state = MJRefreshStatePulling; + } else if (self.state == MJRefreshStatePulling && offsetY >= normal2pullingOffsetY) { + // 转为普通状态 + self.state = MJRefreshStateIdle; + } + } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 + // 开始刷新 + [self beginRefreshing]; + } else if (pullingPercent < 1) { + self.pullingPercent = pullingPercent; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateIdle) { + if (oldState != MJRefreshStateRefreshing) return; + + [self headerEndingAction]; + } else if (state == MJRefreshStateRefreshing) { + [self headerRefreshingAction]; + } +} + +- (void)headerEndingAction { + // 保存刷新时间 + [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:self.lastUpdatedTimeKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + // 默认使用 UIViewAnimation 动画 + if (!self.isCollectionViewAnimationBug) { + // 恢复inset和offset + [UIView animateWithDuration:self.slowAnimationDuration animations:^{ + self.scrollView.mj_insetT += self.insetTDelta; + + if (self.endRefreshingAnimationBeginAction) { + self.endRefreshingAnimationBeginAction(); + } + // 自动调整透明度 + if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0; + } completion:^(BOOL finished) { + self.pullingPercent = 0.0; + + if (self.endRefreshingCompletionBlock) { + self.endRefreshingCompletionBlock(); + } + }]; + + return; + } + + /** + 这个解决方法的思路出自 https://github.com/CoderMJLee/MJRefresh/pull/844 + 修改了用+ [UIView animateWithDuration: animations:]实现的修改contentInset的动画 + fix issue#225 https://github.com/CoderMJLee/MJRefresh/issues/225 + 另一种解法 pull#737 https://github.com/CoderMJLee/MJRefresh/pull/737 + + 同时, 处理了 Refreshing 中的动画替换. + */ + + // 由于修改 Inset 会导致 self.pullingPercent 联动设置 self.alpha, 故提前获取 alpha 值, 后续用于还原 alpha 动画 + CGFloat viewAlpha = self.alpha; + + self.scrollView.mj_insetT += self.insetTDelta; + // 禁用交互, 如果不禁用可能会引起渲染问题. + self.scrollView.userInteractionEnabled = NO; + + //CAAnimation keyPath 不支持 contentInset 用Bounds的动画代替 + CABasicAnimation *boundsAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; + boundsAnimation.fromValue = [NSValue valueWithCGRect:CGRectOffset(self.scrollView.bounds, 0, self.insetTDelta)]; + boundsAnimation.duration = self.slowAnimationDuration; + //在delegate里移除 + boundsAnimation.removedOnCompletion = NO; + boundsAnimation.fillMode = kCAFillModeBoth; + boundsAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + boundsAnimation.delegate = self; + [boundsAnimation setValue:MJRefreshHeaderRefreshing2IdleBoundsKey forKey:@"identity"]; + + [self.scrollView.layer addAnimation:boundsAnimation forKey:MJRefreshHeaderRefreshing2IdleBoundsKey]; + + if (self.endRefreshingAnimationBeginAction) { + self.endRefreshingAnimationBeginAction(); + } + // 自动调整透明度的动画 + if (self.isAutomaticallyChangeAlpha) { + CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; + opacityAnimation.fromValue = @(viewAlpha); + opacityAnimation.toValue = @(0.0); + opacityAnimation.duration = self.slowAnimationDuration; + opacityAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + [self.layer addAnimation:opacityAnimation forKey:@"MJRefreshHeaderRefreshing2IdleOpacity"]; + + // 由于修改了 inset 导致, pullingPercent 被设置值, alpha 已经被提前修改为 0 了. 所以这里不用置 0, 但为了代码的严谨性, 不依赖其他的特殊实现方式, 这里还是置 0. + self.alpha = 0; + } +} + +- (void)headerRefreshingAction { + // 默认使用 UIViewAnimation 动画 + if (!self.isCollectionViewAnimationBug) { + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + if (self.scrollView.panGestureRecognizer.state != UIGestureRecognizerStateCancelled) { + CGFloat top = self.scrollViewOriginalInset.top + self.mj_h; + // 增加滚动区域top + self.scrollView.mj_insetT = top; + // 设置滚动位置 + CGPoint offset = self.scrollView.contentOffset; + offset.y = -top; + [self.scrollView setContentOffset:offset animated:NO]; + } + } completion:^(BOOL finished) { + [self executeRefreshingCallback]; + }]; + return; + } + + if (self.scrollView.panGestureRecognizer.state != UIGestureRecognizerStateCancelled) { + CGFloat top = self.scrollViewOriginalInset.top + self.mj_h; + // 禁用交互, 如果不禁用可能会引起渲染问题. + self.scrollView.userInteractionEnabled = NO; + + // CAAnimation keyPath不支持 contentOffset 用Bounds的动画代替 + CABasicAnimation *boundsAnimation = [CABasicAnimation animationWithKeyPath:@"bounds"]; + CGRect bounds = self.scrollView.bounds; + bounds.origin.y = -top; + boundsAnimation.fromValue = [NSValue valueWithCGRect:self.scrollView.bounds]; + boundsAnimation.toValue = [NSValue valueWithCGRect:bounds]; + boundsAnimation.duration = self.fastAnimationDuration; + //在delegate里移除 + boundsAnimation.removedOnCompletion = NO; + boundsAnimation.fillMode = kCAFillModeBoth; + boundsAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + boundsAnimation.delegate = self; + [boundsAnimation setValue:MJRefreshHeaderRefreshingBoundsKey forKey:@"identity"]; + [self.scrollView.layer addAnimation:boundsAnimation forKey:MJRefreshHeaderRefreshingBoundsKey]; + } else { + [self executeRefreshingCallback]; + } +} + +#pragma mark . 链式语法部分 . + +- (instancetype)linkTo:(UIScrollView *)scrollView { + scrollView.mj_header = self; + return self; +} + +#pragma mark - CAAnimationDelegate +- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { + NSString *identity = [anim valueForKey:@"identity"]; + if ([identity isEqualToString:MJRefreshHeaderRefreshing2IdleBoundsKey]) { + self.pullingPercent = 0.0; + self.scrollView.userInteractionEnabled = YES; + if (self.endRefreshingCompletionBlock) { + self.endRefreshingCompletionBlock(); + } + } else if ([identity isEqualToString:MJRefreshHeaderRefreshingBoundsKey]) { + // 避免出现 end 先于 Refreshing 状态 + if (self.state != MJRefreshStateIdle) { + CGFloat top = self.scrollViewOriginalInset.top + self.mj_h; + self.scrollView.mj_insetT = top; + // 设置最终滚动位置 + CGPoint offset = self.scrollView.contentOffset; + offset.y = -top; + [self.scrollView setContentOffset:offset animated:NO]; + } + self.scrollView.userInteractionEnabled = YES; + [self executeRefreshingCallback]; + } + + if ([self.scrollView.layer animationForKey:MJRefreshHeaderRefreshing2IdleBoundsKey]) { + [self.scrollView.layer removeAnimationForKey:MJRefreshHeaderRefreshing2IdleBoundsKey]; + } + + if ([self.scrollView.layer animationForKey:MJRefreshHeaderRefreshingBoundsKey]) { + [self.scrollView.layer removeAnimationForKey:MJRefreshHeaderRefreshingBoundsKey]; + } +} + +#pragma mark - 公共方法 +- (NSDate *)lastUpdatedTime +{ + return [[NSUserDefaults standardUserDefaults] objectForKey:self.lastUpdatedTimeKey]; +} + +- (void)setIgnoredScrollViewContentInsetTop:(CGFloat)ignoredScrollViewContentInsetTop { + _ignoredScrollViewContentInsetTop = ignoredScrollViewContentInsetTop; + + self.mj_y = - self.mj_h - _ignoredScrollViewContentInsetTop; +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.h b/Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.h new file mode 100644 index 0000000..ca4c7ea --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.h @@ -0,0 +1,30 @@ +// +// MJRefreshTrailer.h +// MJRefresh +// +// Created by kinarobin on 2020/5/3. +// Copyright © 2020 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshComponent.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshTrailer : MJRefreshComponent + +/** 创建trailer*/ ++ (instancetype)trailerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; +/** 创建trailer */ ++ (instancetype)trailerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** 忽略多少scrollView的contentInset的right */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetRight; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.m b/Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.m new file mode 100644 index 0000000..da66f20 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Base/MJRefreshTrailer.m @@ -0,0 +1,179 @@ +// +// MJRefreshTrailer.m +// MJRefresh +// +// Created by kinarobin on 2020/5/3. +// Copyright © 2020 小码哥. All rights reserved. +// + +#import "MJRefreshTrailer.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" +#import "UIScrollView+MJExtension.h" + +@interface MJRefreshTrailer() +@property (assign, nonatomic) NSInteger lastRefreshCount; +@property (assign, nonatomic) CGFloat lastRightDelta; +@end + +@implementation MJRefreshTrailer + +#pragma mark - 构造方法 ++ (instancetype)trailerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock { + MJRefreshTrailer *cmp = [[self alloc] init]; + cmp.refreshingBlock = refreshingBlock; + return cmp; +} + ++ (instancetype)trailerWithRefreshingTarget:(id)target refreshingAction:(SEL)action { + MJRefreshTrailer *cmp = [[self alloc] init]; + [cmp setRefreshingTarget:target refreshingAction:action]; + return cmp; +} + +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change { + [super scrollViewContentOffsetDidChange:change]; + + // 如果正在刷新,直接返回 + if (self.state == MJRefreshStateRefreshing) return; + + _scrollViewOriginalInset = self.scrollView.mj_inset; + + // 当前的contentOffset + CGFloat currentOffsetX = self.scrollView.mj_offsetX; + // 尾部控件刚好出现的offsetX + CGFloat happenOffsetX = [self happenOffsetX]; + // 如果是向右滚动到看不见右边控件,直接返回 + if (currentOffsetX <= happenOffsetX) return; + + CGFloat pullingPercent = (currentOffsetX - happenOffsetX) / self.mj_w; + + // 如果已全部加载,仅设置pullingPercent,然后返回 + if (self.state == MJRefreshStateNoMoreData) { + self.pullingPercent = pullingPercent; + return; + } + + if (self.scrollView.isDragging) { + self.pullingPercent = pullingPercent; + // 普通 和 即将刷新 的临界点 + CGFloat normal2pullingOffsetX = happenOffsetX + self.mj_w; + + if (self.state == MJRefreshStateIdle && currentOffsetX > normal2pullingOffsetX) { + self.state = MJRefreshStatePulling; + } else if (self.state == MJRefreshStatePulling && currentOffsetX <= normal2pullingOffsetX) { + // 转为普通状态 + self.state = MJRefreshStateIdle; + } + } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 + // 开始刷新 + [self beginRefreshing]; + } else if (pullingPercent < 1) { + self.pullingPercent = pullingPercent; + } +} + +- (void)setState:(MJRefreshState)state { + MJRefreshCheckState + // 根据状态来设置属性 + if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + // 刷新完毕 + if (MJRefreshStateRefreshing == oldState) { + [UIView animateWithDuration:self.slowAnimationDuration animations:^{ + if (self.endRefreshingAnimationBeginAction) { + self.endRefreshingAnimationBeginAction(); + } + + self.scrollView.mj_insetR -= self.lastRightDelta; + // 自动调整透明度 + if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0; + } completion:^(BOOL finished) { + self.pullingPercent = 0.0; + + if (self.endRefreshingCompletionBlock) { + self.endRefreshingCompletionBlock(); + } + }]; + } + + CGFloat deltaW = [self widthForContentBreakView]; + // 刚刷新完毕 + if (MJRefreshStateRefreshing == oldState && deltaW > 0 && self.scrollView.mj_totalDataCount != self.lastRefreshCount) { + self.scrollView.mj_offsetX = self.scrollView.mj_offsetX; + } + } else if (state == MJRefreshStateRefreshing) { + // 记录刷新前的数量 + self.lastRefreshCount = self.scrollView.mj_totalDataCount; + + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + CGFloat right = self.mj_w + self.scrollViewOriginalInset.right; + CGFloat deltaW = [self widthForContentBreakView]; + if (deltaW < 0) { // 如果内容宽度小于view的宽度 + right -= deltaW; + } + self.lastRightDelta = right - self.scrollView.mj_insetR; + self.scrollView.mj_insetR = right; + + // 设置滚动位置 + CGPoint offset = self.scrollView.contentOffset; + offset.x = [self happenOffsetX] + self.mj_w; + [self.scrollView setContentOffset:offset animated:NO]; + } completion:^(BOOL finished) { + [self executeRefreshingCallback]; + }]; + } +} + +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change { + [super scrollViewContentSizeDidChange:change]; + + // 内容的宽度 + CGFloat contentWidth = self.scrollView.mj_contentW + self.ignoredScrollViewContentInsetRight; + // 表格的宽度 + CGFloat scrollWidth = self.scrollView.mj_w - self.scrollViewOriginalInset.left - self.scrollViewOriginalInset.right + self.ignoredScrollViewContentInsetRight; + // 设置位置和尺寸 + self.mj_x = MAX(contentWidth, scrollWidth); +} + +- (void)placeSubviews { + [super placeSubviews]; + + self.mj_h = _scrollView.mj_h; + // 设置自己的宽度 + self.mj_w = MJRefreshTrailWidth; +} + +- (void)willMoveToSuperview:(UIView *)newSuperview { + [super willMoveToSuperview:newSuperview]; + + if (newSuperview) { + // 设置支持水平弹簧效果 + _scrollView.alwaysBounceHorizontal = YES; + _scrollView.alwaysBounceVertical = NO; + } +} + +#pragma mark . 链式语法部分 . + +- (instancetype)linkTo:(UIScrollView *)scrollView { + scrollView.mj_trailer = self; + return self; +} + +#pragma mark - 刚好看到上拉刷新控件时的contentOffset.x +- (CGFloat)happenOffsetX { + CGFloat deltaW = [self widthForContentBreakView]; + if (deltaW > 0) { + return deltaW - self.scrollViewOriginalInset.left; + } else { + return - self.scrollViewOriginalInset.left; + } +} + +#pragma mark 获得scrollView的内容 超出 view 的宽度 +- (CGFloat)widthForContentBreakView { + CGFloat w = self.scrollView.frame.size.width - self.scrollViewOriginalInset.right - self.scrollViewOriginalInset.left; + return self.scrollView.contentSize.width - w; +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h new file mode 100644 index 0000000..f346157 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h @@ -0,0 +1,25 @@ +// +// MJRefreshAutoGifFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshAutoStateFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshAutoGifFooter : MJRefreshAutoStateFooter +@property (weak, nonatomic, readonly) UIImageView *gifView; + +/** 设置state状态下的动画图片images 动画持续时间duration*/ +- (instancetype)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; +- (instancetype)setImages:(NSArray *)images forState:(MJRefreshState)state; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m new file mode 100644 index 0000000..213f69f --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m @@ -0,0 +1,121 @@ +// +// MJRefreshAutoGifFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoGifFooter.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +@interface MJRefreshAutoGifFooter() +{ + __unsafe_unretained UIImageView *_gifView; +} +/** 所有状态对应的动画图片 */ +@property (strong, nonatomic) NSMutableDictionary *stateImages; +/** 所有状态对应的动画时间 */ +@property (strong, nonatomic) NSMutableDictionary *stateDurations; +@end + +@implementation MJRefreshAutoGifFooter +#pragma mark - 懒加载 +- (UIImageView *)gifView +{ + if (!_gifView) { + UIImageView *gifView = [[UIImageView alloc] init]; + [self addSubview:_gifView = gifView]; + } + return _gifView; +} + +- (NSMutableDictionary *)stateImages +{ + if (!_stateImages) { + self.stateImages = [NSMutableDictionary dictionary]; + } + return _stateImages; +} + +- (NSMutableDictionary *)stateDurations +{ + if (!_stateDurations) { + self.stateDurations = [NSMutableDictionary dictionary]; + } + return _stateDurations; +} + +#pragma mark - 公共方法 +- (instancetype)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state +{ + if (images == nil) return self; + + self.stateImages[@(state)] = images; + self.stateDurations[@(state)] = @(duration); + + /* 根据图片设置控件的高度 */ + UIImage *image = [images firstObject]; + if (image.size.height > self.mj_h) { + self.mj_h = image.size.height; + } + return self; +} + +- (instancetype)setImages:(NSArray *)images forState:(MJRefreshState)state +{ + return [self setImages:images duration:images.count * 0.1 forState:state]; +} + +#pragma mark - 实现父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化间距 + self.labelLeftInset = 20; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.gifView.constraints.count) return; + + self.gifView.frame = self.bounds; + if (self.isRefreshingTitleHidden) { + self.gifView.contentMode = UIViewContentModeCenter; + } else { + self.gifView.contentMode = UIViewContentModeRight; + self.gifView.mj_w = self.mj_w * 0.5 - self.labelLeftInset - self.stateLabel.mj_textWidth * 0.5; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateRefreshing) { + NSArray *images = self.stateImages[@(state)]; + if (images.count == 0) return; + [self.gifView stopAnimating]; + + self.gifView.hidden = NO; + if (images.count == 1) { // 单张图片 + self.gifView.image = [images lastObject]; + } else { // 多张图片 + self.gifView.animationImages = images; + self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; + [self.gifView startAnimating]; + } + } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + [self.gifView stopAnimating]; + self.gifView.hidden = YES; + } +} +@end + diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h new file mode 100644 index 0000000..f8d1e04 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h @@ -0,0 +1,25 @@ +// +// MJRefreshAutoNormalFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshAutoStateFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshAutoNormalFooter : MJRefreshAutoStateFooter +@property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; + +/** 菊花的样式 */ +@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); +@end + + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m new file mode 100644 index 0000000..9e6a03d --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m @@ -0,0 +1,81 @@ +// +// MJRefreshAutoNormalFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoNormalFooter.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +@interface MJRefreshAutoNormalFooter() +@property (weak, nonatomic) UIActivityIndicatorView *loadingView; +@end + +@implementation MJRefreshAutoNormalFooter +#pragma mark - 懒加载子控件 +- (UIActivityIndicatorView *)loadingView +{ + if (!_loadingView) { + UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:_activityIndicatorViewStyle]; + loadingView.hidesWhenStopped = YES; + [self addSubview:_loadingView = loadingView]; + } + return _loadingView; +} + +- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle +{ + _activityIndicatorViewStyle = activityIndicatorViewStyle; + + [self.loadingView removeFromSuperview]; + self.loadingView = nil; + [self setNeedsLayout]; +} +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + if (@available(iOS 13.0, *)) { + _activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium; + return; + } +#endif + + _activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.loadingView.constraints.count) return; + + // 圈圈 + CGFloat loadingCenterX = self.mj_w * 0.5; + if (!self.isRefreshingTitleHidden) { + loadingCenterX -= self.stateLabel.mj_textWidth * 0.5 + self.labelLeftInset; + } + CGFloat loadingCenterY = self.mj_h * 0.5; + self.loadingView.center = CGPointMake(loadingCenterX, loadingCenterY); +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + [self.loadingView stopAnimating]; + } else if (state == MJRefreshStateRefreshing) { + [self.loadingView startAnimating]; + } +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h new file mode 100644 index 0000000..c83622d --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h @@ -0,0 +1,30 @@ +// +// MJRefreshAutoStateFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshAutoFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshAutoStateFooter : MJRefreshAutoFooter +/** 文字距离圈圈、箭头的距离 */ +@property (assign, nonatomic) CGFloat labelLeftInset; +/** 显示刷新状态的label */ +@property (weak, nonatomic, readonly) UILabel *stateLabel; + +/** 设置state状态下的文字 */ +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state; + +/** 隐藏刷新状态的文字 */ +@property (assign, nonatomic, getter=isRefreshingTitleHidden) BOOL refreshingTitleHidden; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m new file mode 100644 index 0000000..e5ff652 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m @@ -0,0 +1,119 @@ +// +// MJRefreshAutoStateFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoStateFooter.h" +#import "NSBundle+MJRefresh.h" + +@interface MJRefreshAutoFooter (TapTriggerFix) + +- (void)beginRefreshingWithoutValidation; +@end + + +@implementation MJRefreshAutoFooter (TapTriggerFix) + +- (void)beginRefreshingWithoutValidation { + [super beginRefreshing]; +} + +@end + +@interface MJRefreshAutoStateFooter() +{ + /** 显示刷新状态的label */ + __unsafe_unretained UILabel *_stateLabel; +} +/** 所有状态对应的文字 */ +@property (strong, nonatomic) NSMutableDictionary *stateTitles; +@end + +@implementation MJRefreshAutoStateFooter +#pragma mark - 懒加载 +- (NSMutableDictionary *)stateTitles +{ + if (!_stateTitles) { + self.stateTitles = [NSMutableDictionary dictionary]; + } + return _stateTitles; +} + +- (UILabel *)stateLabel +{ + if (!_stateLabel) { + [self addSubview:_stateLabel = [UILabel mj_label]]; + } + return _stateLabel; +} + +#pragma mark - 公共方法 +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state +{ + if (title == nil) return self; + self.stateTitles[@(state)] = title; + self.stateLabel.text = self.stateTitles[@(self.state)]; + return self; +} + +#pragma mark - 私有方法 +- (void)stateLabelClick +{ + if (self.state == MJRefreshStateIdle) { + [super beginRefreshingWithoutValidation]; + } +} + +- (void)textConfiguration { + // 初始化文字 + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshAutoFooterIdleText] forState:MJRefreshStateIdle]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshAutoFooterRefreshingText] forState:MJRefreshStateRefreshing]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshAutoFooterNoMoreDataText] forState:MJRefreshStateNoMoreData]; +} + +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化间距 + self.labelLeftInset = MJRefreshLabelLeftInset; + + [self textConfiguration]; + + // 监听label + self.stateLabel.userInteractionEnabled = YES; + [self.stateLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(stateLabelClick)]]; +} + +- (void)i18nDidChange { + [self textConfiguration]; + + [super i18nDidChange]; +} + + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.stateLabel.constraints.count) return; + + // 状态标签 + self.stateLabel.frame = self.bounds; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + if (self.isRefreshingTitleHidden && state == MJRefreshStateRefreshing) { + self.stateLabel.text = nil; + } else { + self.stateLabel.text = self.stateTitles[@(state)]; + } +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h new file mode 100644 index 0000000..a7ba065 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h @@ -0,0 +1,25 @@ +// +// MJRefreshBackGifFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshBackStateFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshBackGifFooter : MJRefreshBackStateFooter +@property (weak, nonatomic, readonly) UIImageView *gifView; + +/** 设置state状态下的动画图片images 动画持续时间duration*/ +- (instancetype)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; +- (instancetype)setImages:(NSArray *)images forState:(MJRefreshState)state; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m new file mode 100644 index 0000000..23c626c --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m @@ -0,0 +1,132 @@ +// +// MJRefreshBackGifFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackGifFooter.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +@interface MJRefreshBackGifFooter() +{ + __unsafe_unretained UIImageView *_gifView; +} +/** 所有状态对应的动画图片 */ +@property (strong, nonatomic) NSMutableDictionary *stateImages; +/** 所有状态对应的动画时间 */ +@property (strong, nonatomic) NSMutableDictionary *stateDurations; +@end + +@implementation MJRefreshBackGifFooter +#pragma mark - 懒加载 +- (UIImageView *)gifView +{ + if (!_gifView) { + UIImageView *gifView = [[UIImageView alloc] init]; + [self addSubview:_gifView = gifView]; + } + return _gifView; +} + +- (NSMutableDictionary *)stateImages +{ + if (!_stateImages) { + self.stateImages = [NSMutableDictionary dictionary]; + } + return _stateImages; +} + +- (NSMutableDictionary *)stateDurations +{ + if (!_stateDurations) { + self.stateDurations = [NSMutableDictionary dictionary]; + } + return _stateDurations; +} + +#pragma mark - 公共方法 +- (instancetype)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state +{ + if (images == nil) return self; + + self.stateImages[@(state)] = images; + self.stateDurations[@(state)] = @(duration); + + /* 根据图片设置控件的高度 */ + UIImage *image = [images firstObject]; + if (image.size.height > self.mj_h) { + self.mj_h = image.size.height; + } + return self; +} + +- (instancetype)setImages:(NSArray *)images forState:(MJRefreshState)state +{ + return [self setImages:images duration:images.count * 0.1 forState:state]; +} + +#pragma mark - 实现父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化间距 + self.labelLeftInset = 20; +} + +- (void)setPullingPercent:(CGFloat)pullingPercent +{ + [super setPullingPercent:pullingPercent]; + NSArray *images = self.stateImages[@(MJRefreshStateIdle)]; + if (self.state != MJRefreshStateIdle || images.count == 0) return; + [self.gifView stopAnimating]; + NSUInteger index = images.count * pullingPercent; + if (index >= images.count) index = images.count - 1; + self.gifView.image = images[index]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.gifView.constraints.count) return; + + self.gifView.frame = self.bounds; + if (self.stateLabel.hidden) { + self.gifView.contentMode = UIViewContentModeCenter; + } else { + self.gifView.contentMode = UIViewContentModeRight; + self.gifView.mj_w = self.mj_w * 0.5 - self.labelLeftInset - self.stateLabel.mj_textWidth * 0.5; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) { + NSArray *images = self.stateImages[@(state)]; + if (images.count == 0) return; + + self.gifView.hidden = NO; + [self.gifView stopAnimating]; + if (images.count == 1) { // 单张图片 + self.gifView.image = [images lastObject]; + } else { // 多张图片 + self.gifView.animationImages = images; + self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; + [self.gifView startAnimating]; + } + } else if (state == MJRefreshStateIdle) { + self.gifView.hidden = NO; + } else if (state == MJRefreshStateNoMoreData) { + self.gifView.hidden = YES; + } +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h new file mode 100644 index 0000000..d255807 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h @@ -0,0 +1,25 @@ +// +// MJRefreshBackNormalFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshBackStateFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshBackNormalFooter : MJRefreshBackStateFooter +@property (weak, nonatomic, readonly) UIImageView *arrowView; +@property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; + +/** 菊花的样式 */ +@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m new file mode 100644 index 0000000..932af76 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m @@ -0,0 +1,132 @@ +// +// MJRefreshBackNormalFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackNormalFooter.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" + +@interface MJRefreshBackNormalFooter() +{ + __unsafe_unretained UIImageView *_arrowView; +} +@property (weak, nonatomic) UIActivityIndicatorView *loadingView; +@end + +@implementation MJRefreshBackNormalFooter +#pragma mark - 懒加载子控件 +- (UIImageView *)arrowView +{ + if (!_arrowView) { + UIImageView *arrowView = [[UIImageView alloc] initWithImage:[NSBundle mj_arrowImage]]; + [self addSubview:_arrowView = arrowView]; + } + return _arrowView; +} + + +- (UIActivityIndicatorView *)loadingView +{ + if (!_loadingView) { + UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:_activityIndicatorViewStyle]; + loadingView.hidesWhenStopped = YES; + [self addSubview:_loadingView = loadingView]; + } + return _loadingView; +} + +- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle +{ + _activityIndicatorViewStyle = activityIndicatorViewStyle; + + [self.loadingView removeFromSuperview]; + self.loadingView = nil; + [self setNeedsLayout]; +} +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + if (@available(iOS 13.0, *)) { + _activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium; + return; + } +#endif + + _activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 箭头的中心点 + CGFloat arrowCenterX = self.mj_w * 0.5; + if (!self.stateLabel.hidden) { + arrowCenterX -= self.labelLeftInset + self.stateLabel.mj_textWidth * 0.5; + } + CGFloat arrowCenterY = self.mj_h * 0.5; + CGPoint arrowCenter = CGPointMake(arrowCenterX, arrowCenterY); + + // 箭头 + if (self.arrowView.constraints.count == 0) { + self.arrowView.mj_size = self.arrowView.image.size; + self.arrowView.center = arrowCenter; + } + + // 圈圈 + if (self.loadingView.constraints.count == 0) { + self.loadingView.center = arrowCenter; + } + + self.arrowView.tintColor = self.stateLabel.textColor; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateIdle) { + if (oldState == MJRefreshStateRefreshing) { + self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); + [UIView animateWithDuration:self.slowAnimationDuration animations:^{ + self.loadingView.alpha = 0.0; + } completion:^(BOOL finished) { + // 防止动画结束后,状态已经不是MJRefreshStateIdle + if (self.state != MJRefreshStateIdle) return; + + self.loadingView.alpha = 1.0; + [self.loadingView stopAnimating]; + + self.arrowView.hidden = NO; + }]; + } else { + self.arrowView.hidden = NO; + [self.loadingView stopAnimating]; + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); + }]; + } + } else if (state == MJRefreshStatePulling) { + self.arrowView.hidden = NO; + [self.loadingView stopAnimating]; + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformIdentity; + }]; + } else if (state == MJRefreshStateRefreshing) { + self.arrowView.hidden = YES; + [self.loadingView startAnimating]; + } else if (state == MJRefreshStateNoMoreData) { + self.arrowView.hidden = YES; + [self.loadingView stopAnimating]; + } +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h new file mode 100644 index 0000000..c6897f4 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h @@ -0,0 +1,29 @@ +// +// MJRefreshBackStateFooter.h +// MJRefresh +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshBackFooter.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshBackStateFooter : MJRefreshBackFooter +/** 文字距离圈圈、箭头的距离 */ +@property (assign, nonatomic) CGFloat labelLeftInset; +/** 显示刷新状态的label */ +@property (weak, nonatomic, readonly) UILabel *stateLabel; +/** 设置state状态下的文字 */ +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state; + +/** 获取state状态下的title */ +- (NSString *)titleForState:(MJRefreshState)state; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m new file mode 100644 index 0000000..70f4024 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m @@ -0,0 +1,93 @@ +// +// MJRefreshBackStateFooter.m +// MJRefresh +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackStateFooter.h" +#import "NSBundle+MJRefresh.h" + +@interface MJRefreshBackStateFooter() +{ + /** 显示刷新状态的label */ + __unsafe_unretained UILabel *_stateLabel; +} +/** 所有状态对应的文字 */ +@property (strong, nonatomic) NSMutableDictionary *stateTitles; +@end + +@implementation MJRefreshBackStateFooter +#pragma mark - 懒加载 +- (NSMutableDictionary *)stateTitles +{ + if (!_stateTitles) { + self.stateTitles = [NSMutableDictionary dictionary]; + } + return _stateTitles; +} + +- (UILabel *)stateLabel +{ + if (!_stateLabel) { + [self addSubview:_stateLabel = [UILabel mj_label]]; + } + return _stateLabel; +} + +#pragma mark - 公共方法 +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state +{ + if (title == nil) return self; + self.stateTitles[@(state)] = title; + self.stateLabel.text = self.stateTitles[@(self.state)]; + return self; +} + +- (NSString *)titleForState:(MJRefreshState)state { + return self.stateTitles[@(state)]; +} + +- (void)textConfiguration { + // 初始化文字 + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterIdleText] forState:MJRefreshStateIdle]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterPullingText] forState:MJRefreshStatePulling]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterRefreshingText] forState:MJRefreshStateRefreshing]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterNoMoreDataText] forState:MJRefreshStateNoMoreData]; +} + +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化间距 + self.labelLeftInset = MJRefreshLabelLeftInset; + [self textConfiguration]; +} + +- (void)i18nDidChange { + [self textConfiguration]; + + [super i18nDidChange]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.stateLabel.constraints.count) return; + + // 状态标签 + self.stateLabel.frame = self.bounds; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 设置状态文字 + self.stateLabel.text = self.stateTitles[@(state)]; +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.h b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.h new file mode 100644 index 0000000..afa4a13 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.h @@ -0,0 +1,25 @@ +// +// MJRefreshGifHeader.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshStateHeader.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshGifHeader : MJRefreshStateHeader +@property (weak, nonatomic, readonly) UIImageView *gifView; + +/** 设置state状态下的动画图片images 动画持续时间duration*/ +- (instancetype)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; +- (instancetype)setImages:(NSArray *)images forState:(MJRefreshState)state; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m new file mode 100644 index 0000000..707e466 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m @@ -0,0 +1,135 @@ +// +// MJRefreshGifHeader.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshGifHeader.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" + +@interface MJRefreshGifHeader() +{ + __unsafe_unretained UIImageView *_gifView; +} +/** 所有状态对应的动画图片 */ +@property (strong, nonatomic) NSMutableDictionary *stateImages; +/** 所有状态对应的动画时间 */ +@property (strong, nonatomic) NSMutableDictionary *stateDurations; +@end + +@implementation MJRefreshGifHeader +#pragma mark - 懒加载 +- (UIImageView *)gifView +{ + if (!_gifView) { + UIImageView *gifView = [[UIImageView alloc] init]; + [self addSubview:_gifView = gifView]; + } + return _gifView; +} + +- (NSMutableDictionary *)stateImages +{ + if (!_stateImages) { + self.stateImages = [NSMutableDictionary dictionary]; + } + return _stateImages; +} + +- (NSMutableDictionary *)stateDurations +{ + if (!_stateDurations) { + self.stateDurations = [NSMutableDictionary dictionary]; + } + return _stateDurations; +} + +#pragma mark - 公共方法 +- (instancetype)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state { + if (images == nil) return self; + + self.stateImages[@(state)] = images; + self.stateDurations[@(state)] = @(duration); + + /* 根据图片设置控件的高度 */ + UIImage *image = [images firstObject]; + if (image.size.height > self.mj_h) { + self.mj_h = image.size.height; + } + return self; +} + +- (instancetype)setImages:(NSArray *)images forState:(MJRefreshState)state +{ + return [self setImages:images duration:images.count * 0.1 forState:state]; +} + +#pragma mark - 实现父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化间距 + self.labelLeftInset = 20; +} + +- (void)setPullingPercent:(CGFloat)pullingPercent +{ + [super setPullingPercent:pullingPercent]; + NSArray *images = self.stateImages[@(MJRefreshStateIdle)]; + if (self.state != MJRefreshStateIdle || images.count == 0) return; + // 停止动画 + [self.gifView stopAnimating]; + // 设置当前需要显示的图片 + NSUInteger index = images.count * pullingPercent; + if (index >= images.count) index = images.count - 1; + self.gifView.image = images[index]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.gifView.constraints.count) return; + + self.gifView.frame = self.bounds; + if (self.stateLabel.hidden && self.lastUpdatedTimeLabel.hidden) { + self.gifView.contentMode = UIViewContentModeCenter; + } else { + self.gifView.contentMode = UIViewContentModeRight; + + CGFloat stateWidth = self.stateLabel.mj_textWidth; + CGFloat timeWidth = 0.0; + if (!self.lastUpdatedTimeLabel.hidden) { + timeWidth = self.lastUpdatedTimeLabel.mj_textWidth; + } + CGFloat textWidth = MAX(stateWidth, timeWidth); + self.gifView.mj_w = self.mj_w * 0.5 - textWidth * 0.5 - self.labelLeftInset; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) { + NSArray *images = self.stateImages[@(state)]; + if (images.count == 0) return; + + [self.gifView stopAnimating]; + if (images.count == 1) { // 单张图片 + self.gifView.image = [images lastObject]; + } else { // 多张图片 + self.gifView.animationImages = images; + self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; + [self.gifView startAnimating]; + } + } else if (state == MJRefreshStateIdle) { + [self.gifView stopAnimating]; + } +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.h b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.h new file mode 100644 index 0000000..2bfef39 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.h @@ -0,0 +1,26 @@ +// +// MJRefreshNormalHeader.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshStateHeader.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshNormalHeader : MJRefreshStateHeader +@property (weak, nonatomic, readonly) UIImageView *arrowView; +@property (weak, nonatomic, readonly) UIActivityIndicatorView *loadingView; + + +/** 菊花的样式 */ +@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle MJRefreshDeprecated("first deprecated in 3.2.2 - Use `loadingView` property"); +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m new file mode 100644 index 0000000..84a66cb --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m @@ -0,0 +1,137 @@ +// +// MJRefreshNormalHeader.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshNormalHeader.h" +#import "NSBundle+MJRefresh.h" +#import "UIScrollView+MJRefresh.h" +#import "UIView+MJExtension.h" + +@interface MJRefreshNormalHeader() +{ + __unsafe_unretained UIImageView *_arrowView; +} +@property (weak, nonatomic) UIActivityIndicatorView *loadingView; +@end + +@implementation MJRefreshNormalHeader +#pragma mark - 懒加载子控件 +- (UIImageView *)arrowView +{ + if (!_arrowView) { + UIImageView *arrowView = [[UIImageView alloc] initWithImage:[NSBundle mj_arrowImage]]; + [self addSubview:_arrowView = arrowView]; + } + return _arrowView; +} + +- (UIActivityIndicatorView *)loadingView +{ + if (!_loadingView) { + UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:_activityIndicatorViewStyle]; + loadingView.hidesWhenStopped = YES; + [self addSubview:_loadingView = loadingView]; + } + return _loadingView; +} + +#pragma mark - 公共方法 +- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle +{ + _activityIndicatorViewStyle = activityIndicatorViewStyle; + + [self.loadingView removeFromSuperview]; + self.loadingView = nil; + [self setNeedsLayout]; +} + +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 + if (@available(iOS 13.0, *)) { + _activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium; + return; + } +#endif + + _activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 箭头的中心点 + CGFloat arrowCenterX = self.mj_w * 0.5; + if (!self.stateLabel.hidden) { + CGFloat stateWidth = self.stateLabel.mj_textWidth; + CGFloat timeWidth = 0.0; + if (!self.lastUpdatedTimeLabel.hidden) { + timeWidth = self.lastUpdatedTimeLabel.mj_textWidth; + } + CGFloat textWidth = MAX(stateWidth, timeWidth); + arrowCenterX -= textWidth / 2 + self.labelLeftInset; + } + CGFloat arrowCenterY = self.mj_h * 0.5; + CGPoint arrowCenter = CGPointMake(arrowCenterX, arrowCenterY); + + // 箭头 + if (self.arrowView.constraints.count == 0) { + self.arrowView.mj_size = self.arrowView.image.size; + self.arrowView.center = arrowCenter; + } + + // 圈圈 + if (self.loadingView.constraints.count == 0) { + self.loadingView.center = arrowCenter; + } + + self.arrowView.tintColor = self.stateLabel.textColor; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateIdle) { + if (oldState == MJRefreshStateRefreshing) { + self.arrowView.transform = CGAffineTransformIdentity; + + [UIView animateWithDuration:self.slowAnimationDuration animations:^{ + self.loadingView.alpha = 0.0; + } completion:^(BOOL finished) { + // 如果执行完动画发现不是idle状态,就直接返回,进入其他状态 + if (self.state != MJRefreshStateIdle) return; + + self.loadingView.alpha = 1.0; + [self.loadingView stopAnimating]; + self.arrowView.hidden = NO; + }]; + } else { + [self.loadingView stopAnimating]; + self.arrowView.hidden = NO; + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformIdentity; + }]; + } + } else if (state == MJRefreshStatePulling) { + [self.loadingView stopAnimating]; + self.arrowView.hidden = NO; + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); + }]; + } else if (state == MJRefreshStateRefreshing) { + self.loadingView.alpha = 1.0; // 防止refreshing -> idle的动画完毕动作没有被执行 + [self.loadingView startAnimating]; + self.arrowView.hidden = YES; + } +} +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.h b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.h new file mode 100644 index 0000000..8e1d108 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.h @@ -0,0 +1,39 @@ +// +// MJRefreshStateHeader.h +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshHeader.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshStateHeader : MJRefreshHeader +#pragma mark - 刷新时间相关 +/** 利用这个block来决定显示的更新时间文字 */ +@property (copy, nonatomic, nullable) NSString *(^lastUpdatedTimeText)(NSDate * _Nullable lastUpdatedTime); +/** 显示上一次刷新时间的label */ +@property (weak, nonatomic, readonly) UILabel *lastUpdatedTimeLabel; + +#pragma mark - 状态相关 +/** 文字距离圈圈、箭头的距离 */ +@property (assign, nonatomic) CGFloat labelLeftInset; +/** 显示刷新状态的label */ +@property (weak, nonatomic, readonly) UILabel *stateLabel; +/** 设置state状态下的文字 */ +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state; +@end + +@interface MJRefreshStateHeader (ChainingGrammar) + +- (instancetype)modifyLastUpdatedTimeText:(NSString * (^)(NSDate * _Nullable lastUpdatedTime))handler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m new file mode 100644 index 0000000..62d1ddc --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m @@ -0,0 +1,191 @@ +// +// MJRefreshStateHeader.m +// MJRefresh +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshStateHeader.h" +#import "MJRefreshConst.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" + +@interface MJRefreshStateHeader() +{ + /** 显示上一次刷新时间的label */ + __unsafe_unretained UILabel *_lastUpdatedTimeLabel; + /** 显示刷新状态的label */ + __unsafe_unretained UILabel *_stateLabel; +} +/** 所有状态对应的文字 */ +@property (strong, nonatomic) NSMutableDictionary *stateTitles; +@end + +@implementation MJRefreshStateHeader +#pragma mark - 懒加载 +- (NSMutableDictionary *)stateTitles +{ + if (!_stateTitles) { + self.stateTitles = [NSMutableDictionary dictionary]; + } + return _stateTitles; +} + +- (UILabel *)stateLabel +{ + if (!_stateLabel) { + [self addSubview:_stateLabel = [UILabel mj_label]]; + } + return _stateLabel; +} + +- (UILabel *)lastUpdatedTimeLabel +{ + if (!_lastUpdatedTimeLabel) { + [self addSubview:_lastUpdatedTimeLabel = [UILabel mj_label]]; + } + return _lastUpdatedTimeLabel; +} + +- (void)setLastUpdatedTimeText:(NSString * _Nonnull (^)(NSDate * _Nullable))lastUpdatedTimeText{ + _lastUpdatedTimeText = lastUpdatedTimeText; + // 重新设置key(重新显示时间) + self.lastUpdatedTimeKey = self.lastUpdatedTimeKey; +} + +#pragma mark - 公共方法 +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state +{ + if (title == nil) return self; + self.stateTitles[@(state)] = title; + self.stateLabel.text = self.stateTitles[@(self.state)]; + return self; +} + +#pragma mark key的处理 +- (void)setLastUpdatedTimeKey:(NSString *)lastUpdatedTimeKey +{ + [super setLastUpdatedTimeKey:lastUpdatedTimeKey]; + + // 如果label隐藏了,就不用再处理 + if (self.lastUpdatedTimeLabel.hidden) return; + + NSDate *lastUpdatedTime = [[NSUserDefaults standardUserDefaults] objectForKey:lastUpdatedTimeKey]; + + // 如果有block + if (self.lastUpdatedTimeText) { + self.lastUpdatedTimeLabel.text = self.lastUpdatedTimeText(lastUpdatedTime); + return; + } + + if (lastUpdatedTime) { + // 1.获得年月日 + NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; + NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute; + NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:lastUpdatedTime]; + NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]]; + + // 2.格式化日期 + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + BOOL isToday = NO; + if ([cmp1 day] == [cmp2 day]) { // 今天 + formatter.dateFormat = @" HH:mm"; + isToday = YES; + } else if ([cmp1 year] == [cmp2 year]) { // 今年 + formatter.dateFormat = @"MM-dd HH:mm"; + } else { + formatter.dateFormat = @"yyyy-MM-dd HH:mm"; + } + NSString *time = [formatter stringFromDate:lastUpdatedTime]; + + // 3.显示日期 + self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"%@%@%@", + [NSBundle mj_localizedStringForKey:MJRefreshHeaderLastTimeText], + isToday ? [NSBundle mj_localizedStringForKey:MJRefreshHeaderDateTodayText] : @"", + time]; + } else { + self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"%@%@", + [NSBundle mj_localizedStringForKey:MJRefreshHeaderLastTimeText], + [NSBundle mj_localizedStringForKey:MJRefreshHeaderNoneLastDateText]]; + } +} + + +- (void)textConfiguration { + // 初始化文字 + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderIdleText] forState:MJRefreshStateIdle]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderPullingText] forState:MJRefreshStatePulling]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderRefreshingText] forState:MJRefreshStateRefreshing]; + self.lastUpdatedTimeKey = MJRefreshHeaderLastUpdatedTimeKey; +} + +#pragma mark - 覆盖父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化间距 + self.labelLeftInset = MJRefreshLabelLeftInset; + [self textConfiguration]; +} + +- (void)i18nDidChange { + [self textConfiguration]; + + [super i18nDidChange]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.stateLabel.hidden) return; + + BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0; + + if (self.lastUpdatedTimeLabel.hidden) { + // 状态 + if (noConstrainsOnStatusLabel) self.stateLabel.frame = self.bounds; + } else { + CGFloat stateLabelH = self.mj_h * 0.5; + // 状态 + if (noConstrainsOnStatusLabel) { + self.stateLabel.mj_x = 0; + self.stateLabel.mj_y = 0; + self.stateLabel.mj_w = self.mj_w; + self.stateLabel.mj_h = stateLabelH; + } + + // 更新时间 + if (self.lastUpdatedTimeLabel.constraints.count == 0) { + self.lastUpdatedTimeLabel.mj_x = 0; + self.lastUpdatedTimeLabel.mj_y = stateLabelH; + self.lastUpdatedTimeLabel.mj_w = self.mj_w; + self.lastUpdatedTimeLabel.mj_h = self.mj_h - self.lastUpdatedTimeLabel.mj_y; + } + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 设置状态文字 + self.stateLabel.text = self.stateTitles[@(state)]; + + // 重新设置key(重新显示时间) + self.lastUpdatedTimeKey = self.lastUpdatedTimeKey; +} +@end + +#pragma mark - <<< 为 Swift 扩展链式语法 >>> - +@implementation MJRefreshStateHeader (ChainingGrammar) + +- (instancetype)modifyLastUpdatedTimeText:(NSString * _Nonnull (^)(NSDate * _Nullable))handler { + self.lastUpdatedTimeText = handler; + return self; +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h new file mode 100644 index 0000000..97385d7 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h @@ -0,0 +1,23 @@ +// +// MJRefreshNormalTrailer.h +// MJRefresh +// +// Created by kinarobin on 2020/5/3. +// Copyright © 2020 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshStateTrailer.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshNormalTrailer : MJRefreshStateTrailer + +@property (weak, nonatomic, readonly) UIImageView *arrowView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m new file mode 100644 index 0000000..4b269f2 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m @@ -0,0 +1,80 @@ +// +// MJRefreshNormalTrailer.m +// MJRefresh +// +// Created by kinarobin on 2020/5/3. +// Copyright © 2020 小码哥. All rights reserved. +// + +#import "MJRefreshNormalTrailer.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" + +@interface MJRefreshNormalTrailer() { + __unsafe_unretained UIImageView *_arrowView; +} +@end + +@implementation MJRefreshNormalTrailer +#pragma mark - 懒加载子控件 +- (UIImageView *)arrowView { + if (!_arrowView) { + UIImageView *arrowView = [[UIImageView alloc] initWithImage:[NSBundle mj_trailArrowImage]]; + [self addSubview:_arrowView = arrowView]; + } + return _arrowView; +} + +- (void)placeSubviews { + [super placeSubviews]; + + CGSize arrowSize = self.arrowView.image.size; + // 箭头的中心点 + CGPoint selfCenter = CGPointMake(self.mj_w * 0.5, self.mj_h * 0.5); + CGPoint arrowCenter = CGPointMake(arrowSize.width * 0.5 + 5, self.mj_h * 0.5); + BOOL stateHidden = self.stateLabel.isHidden; + + if (self.arrowView.constraints.count == 0) { + self.arrowView.mj_size = self.arrowView.image.size; + self.arrowView.center = stateHidden ? selfCenter : arrowCenter ; + } + self.arrowView.tintColor = self.stateLabel.textColor; + + if (stateHidden) return; + + BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0; + CGFloat stateLabelW = ceil(self.stateLabel.font.pointSize); + // 状态 + if (noConstrainsOnStatusLabel) { + BOOL arrowHidden = self.arrowView.isHidden; + CGFloat stateCenterX = (self.mj_w + arrowSize.width) * 0.5; + self.stateLabel.center = arrowHidden ? selfCenter : CGPointMake(stateCenterX, self.mj_h * 0.5); + self.stateLabel.mj_size = CGSizeMake(stateLabelW, self.mj_h) ; + } +} + +- (void)setState:(MJRefreshState)state { + MJRefreshCheckState + // 根据状态做事情 + if (state == MJRefreshStateIdle) { + if (oldState == MJRefreshStateRefreshing) { + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformMakeRotation(M_PI); + } completion:^(BOOL finished) { + self.arrowView.transform = CGAffineTransformIdentity; + }]; + } else { + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformIdentity; + }]; + } + } else if (state == MJRefreshStatePulling) { + [UIView animateWithDuration:self.fastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformMakeRotation(M_PI); + }]; + } +} + + + +@end diff --git a/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h new file mode 100644 index 0000000..92ac203 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h @@ -0,0 +1,28 @@ +// +// MJRefreshStateTrailer.h +// MJRefresh +// +// Created by kinarobin on 2020/5/3. +// Copyright © 2020 小码哥. All rights reserved. +// + +#if __has_include() +#import +#else +#import "MJRefreshTrailer.h" +#endif + +NS_ASSUME_NONNULL_BEGIN + + +@interface MJRefreshStateTrailer : MJRefreshTrailer + +#pragma mark - 状态相关 +/** 显示刷新状态的label */ +@property (weak, nonatomic, readonly) UILabel *stateLabel; +/** 设置state状态下的文字 */ +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m new file mode 100644 index 0000000..3ce0ba6 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m @@ -0,0 +1,87 @@ +// +// MJRefreshStateTrailer.m +// MJRefresh +// +// Created by kinarobin on 2020/5/3. +// Copyright © 2020 小码哥. All rights reserved. +// + +#import "MJRefreshStateTrailer.h" +#import "NSBundle+MJRefresh.h" +#import "UIView+MJExtension.h" + +@interface MJRefreshStateTrailer() { + /** 显示刷新状态的label */ + __unsafe_unretained UILabel *_stateLabel; +} +/** 所有状态对应的文字 */ +@property (strong, nonatomic) NSMutableDictionary *stateTitles; +@end + +@implementation MJRefreshStateTrailer +#pragma mark - 懒加载 +- (NSMutableDictionary *)stateTitles { + if (!_stateTitles) { + self.stateTitles = [NSMutableDictionary dictionary]; + } + return _stateTitles; +} + +- (UILabel *)stateLabel { + if (!_stateLabel) { + UILabel *stateLabel = [UILabel mj_label]; + stateLabel.numberOfLines = 0; + [self addSubview:_stateLabel = stateLabel]; + } + return _stateLabel; +} + +#pragma mark - 公共方法 +- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state { + if (title == nil) return self; + self.stateTitles[@(state)] = title; + self.stateLabel.text = self.stateTitles[@(self.state)]; + return self; +} + +- (void)textConfiguration { + // 初始化文字 + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshTrailerIdleText] forState:MJRefreshStateIdle]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshTrailerPullingText] forState:MJRefreshStatePulling]; + [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshTrailerPullingText] forState:MJRefreshStateRefreshing]; +} + +#pragma mark - 覆盖父类的方法 +- (void)prepare { + [super prepare]; + + [self textConfiguration]; +} + +- (void)i18nDidChange { + [self textConfiguration]; + + [super i18nDidChange]; +} + +- (void)setState:(MJRefreshState)state { + MJRefreshCheckState + // 设置状态文字 + self.stateLabel.text = self.stateTitles[@(state)]; +} + +- (void)placeSubviews { + [super placeSubviews]; + + if (self.stateLabel.hidden) return; + + BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0; + CGFloat stateLabelW = ceil(self.stateLabel.font.pointSize); + // 状态 + if (noConstrainsOnStatusLabel) { + self.stateLabel.center = CGPointMake(self.mj_w * 0.5, self.mj_h * 0.5); + self.stateLabel.mj_size = CGSizeMake(stateLabelW, self.mj_h) ; + } +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/arrow@2x.png b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/arrow@2x.png new file mode 100755 index 0000000000000000000000000000000000000000..b1078de8653b1c7167cb0c0663b595b0b42cfede GIT binary patch literal 1033 zcmeAS@N?(olHy`uVBq!ia0vp^azGrw!3HGxl8){JQjEnx?oJHr&dIz4aukw1f_xbm zs?-=58d?|_egTCVUNA6}8Za=tN?>5Hn!&&zUNC1@pbb!hv%n*=n1O*?7=#%aX3dcR z8Wx!u5>XQ2>tmIipR1RclAn~SSCLx)RL#I(Q(*;U=BAb;Dpcg=|?L9&C18K8MsJ85o#kJzX3_GFacvIO}!TL7-u_ z%iap1n#n=h6|e3~d$2lgyfVv7!^!dED`t+SAkVCY8eJmqt1^Evs9xVCJXxY*S@9or&8vV%`^cW33fMDJ;untOX+<2tVR`rZ(&)aRdn9yIC< zske|Zd;PVFF}we}#J*o$5(gR=z5ngMHq86wZprKqYyslWR$1gr9Amt?Z1(BJEIT^> zrXH+cpdKQ9fOnH6TlKth&I9aLiIN`#USz9HF6?mB?qj_3@Pps-&rVqyieBdz27I@i z>nDFHYvVDN9>(^=^WN)n@i(V!zUd_Ji~CP_#nPb47OBa$N2j(qIv-?dm)H4jaZD`r zDaX;}kF1mb)TgM4oSzxw>v`jP)>dP_{Oz~%6RXcHEMPnvsjb@P*c`d{u|;|F!3QP< ze`JsC7Exx2vvEIYG5xgcXWONZubgLn+^JY_YW}N_N{bu}H7`l8y8X6JW%5bi9g*9X zc{C;nW~3O*>nQlqyMys?ZclS=pvE(|Ala5Fr=Lbg{Ioo)I3@0niTKj~B~}qDuD`B5 wbpCQ_#rt;;V&CstCu^gZY^cBni@!6bA6V0Vv8{}Z(F12XPgg&ebxsLQ0NSRDTL1t6 literal 0 HcmV?d00001 diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/en.lproj/Localizable.strings b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/en.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..bf56786e8b1bf1b655c3789bb25a26c21d12c7cc GIT binary patch literal 1374 zcmcJPZ%V^J5XIkTPqE|x9zgMfBBIiYNG?#C_y^NQ(iHXb>ThvctSL zZ{F_rSEi|M^`KIZYIv{otZTkA6}%hW@U4h))`wbUaynyWy4RYWinvg%cP)upBIoP$ z)iRyxi2PxkSnY*6PYE<*Xgp>xEcZhC+v_&G37wb*VgFe6gig}EoTG+yf5obahPBJ7 z{YDoxS~;Sq3)puf^37JEh zUXU}_>qt$bgB)s_w!5pC!i!b6`6TVjU1pa;J;dx%IES0v?>l6|99PUE=QJ%i8Jq5i x8DVz88>LQ|;<(!*_|7WV-dUdsjDBxiP19xx+sLiQ_B|5B literal 0 HcmV?d00001 diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ko.lproj/Localizable.strings b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ko.lproj/Localizable.strings new file mode 100644 index 0000000..ac25579 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ko.lproj/Localizable.strings @@ -0,0 +1,16 @@ +"MJRefreshHeaderIdleText" = "아래로 당겨 새로고침"; +"MJRefreshHeaderPullingText" = "놓으면 새로고침"; +"MJRefreshHeaderRefreshingText" = "로딩중..."; + +"MJRefreshAutoFooterIdleText" = "탭 또는 위로 당겨 로드함"; +"MJRefreshAutoFooterRefreshingText" = "로딩중..."; +"MJRefreshAutoFooterNoMoreDataText" = "더이상 데이터 없음"; + +"MJRefreshBackFooterIdleText" = "위로 당겨 더 로드 가능"; +"MJRefreshBackFooterPullingText" = "놓으면 더 로드됨."; +"MJRefreshBackFooterRefreshingText" = "로딩중..."; +"MJRefreshBackFooterNoMoreDataText" = "더이상 데이터 없음"; + +"MJRefreshHeaderLastTimeText" = "마지막 업데이트: "; +"MJRefreshHeaderDateTodayText" = "오늘"; +"MJRefreshHeaderNoneLastDateText" = "기록 없음"; diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ru.lproj/Localizable.strings b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/ru.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..7890e7b7a63373dbcb97bde0e4fcb9b3a572c82a GIT binary patch literal 1502 zcmcgs+fKqz5S)j7^35lo(Ap0$DpUxy)YcnF5o7oP;yofw02BRrb+%QhdfE^{)9l%W zrf1IV&Y9O28y%eB99Ou;i0c@)XfpS4$#sMl^MF;4@q`I%SnwD&)}$e!bj6bzvm+Lc znH#btZPuDS{@PC7MqUk*5lKb!*_n>&WGId0{1g^zF5h> z>97fZUTrVx9Dg%u6XXAwbk?gPPJK*0_2?fDxt<<8m0|&lg z05Abb{J>TqxqS{80Ox<{927#u zM&MxI7+5yugpn}lHwrBf2Xi1=Kn=(gZ>TCl1)&7f=7mC`S`?BG)(UU9pU$4)V16`O zC>Dtf4-ZF#qY-3^FA{~pV3116NM&V3Hbapb8A9`jPz<5Mzl;1=2k%YwqWFi>{K+9u zj;@C%IgEyb!8nC}jPLuT`TP8=6hhr^i`^iSvw}n+l#oBP*{NEbDE1u1-5n78Tu@1A2=yWw-cMHTqYVKki#CqnbL7a#48>@_Vdv=(k_)r>~F ze%!d~7WJY4_ob=|L2nEit3Ad#HhO)p@~X|mY=7?R9Z^4XY~MMo;89f-mM$qEFfe)Q z%inP}ryDFt{%*IU!}fMrjRw=`H*^}<1wPD3Eo>&l~z{_8ngr%qxi3MS5dqqQW+o##ucziHV7r zgT=%m=~A+%byYQHPv%}#mFv^^0`OcoL7}#$x3?FJzGYEao&kzc?eFiGXBt8X@eGOR zArVU*p`OLyfB<2iR9av5e43M2(G~k?J9Ra+GQhb|jTcXHE=rG^3=r*0CGeg&cXzqa zTBo+Cf~sKW=C&ti`Z8XnqFSyb+j`tsq(cN4CBw5Fwv^XdRHpCgkgc?L}-|EeN;x3qqFnQ!N*~!{BRY(9sFfLH#&d4j7MP${z-CuW25?G-Yr!Xm0_6~ zxDn$a1RF$nfAxUtC9yRaJ!-U4u0K~hdh1?&tw*<39DabmR>+PD-5Y)V`t`rihih}V z2_vZ)I;;2BLthC{?p;wlA^Aof^$_}ASp^Yr>B&V~&mifQ7MZYMtK+99hUED}DT2B) znfIHU(ut&zxhc)eY0cRwVQNyZLvu?DF7jh%(hh^cpwGYERz9kyZdjmp+aA=eI9#(Z zQoRtMYJ$FgYPFW%y{wxC!M^DF^C*2~g%V7dERod9q&1peym%4eVd3lA7+@mWH}2

ZOS=ntAATLSwy>~BS%P&TBxIdD%b!{M z<1A4IWo7EiLWd+S)4ch{6brl!O=Eov~8L-!aN|qTKg6*?2P27TP5* zs8@{Az+!pZYPf1*+mc_o)i-9)>7RaoE=)dkq+0F(`>Fp8fJ@%@jxy=}R%=B0kgUMy-NYHV5)GlU1q@DYZBU*0nF&NjxT{I3 z(g5LfjCDocC@2(VdUf~c{&jTMJW39&b6K=&=~8dT6`YHMF)N6gvj*>S?mVf^KkuXZ zx@^7q1~;-)Et$c^`XXi7ipQlQv$gJX3t#KNPb`8~s(71qMq_-3dc9VWxXHW=jxL=; zpBqY(VPf+bI*-%&m2kC}+dPruFWR9`g=kZaA>&N1$89!NRv$xD1W9LQTS0xsiP(_k z4?8@b#zJcb;`mG?VT*5obtd*^;?RkbVvK%uKzw+cavaF+Y z%MDkrq+HcPM!@unxZz>1Y>A!QkqLuGKx@SyrEC^Qs{#ORD67-jYmM<<_j}BF`_7gm)&u2jv6rgf_zY@%O`cqnU*~6riA$t8%eaq4o&|aY$vI8UgF2p`0z#XAH2aUt@ts4N zLX@}GEK^;iDL3rrzh-4+74mB)&yV|&tif`z4@I;FUQgklSH4{qd*ch;mawl+M*9wY zUS3>GtwXP4LbPSu>xLHwBN>lGSXu4u?Ng65w@_kfXQm7X&wvg`T^_2Pir`}u;(Zat ztWb@+rgN{+YVB z+?&n5^&9=~hsp-f+gw2mh(NtwNr!vaW()=I`zrCI*0q*p?P9vduKIWz2$~`vmQmD! Q<~$6H&zj?_^xfnB0ZPQ>CIA2c literal 0 HcmV?d00001 diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/uk.lproj/Localizable.strings b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/uk.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..3557940c6338e9273311993d3db45579c467cdd7 GIT binary patch literal 1534 zcmchX%}xSA5QOW{CvST3gs%Gl1{9TuyM#pz7*Jz~cjA9UNB|RkdG*@`1z{jW(U6{L zhA`FDT~qIGzG^zrg>H1K4r^EUDzi6q&Dv3gy-8LlUeuE>PXXa;-9n4(%(gACOR}nY z%37WiPa$WaZSie~Ea1#nUQ7IIHrlzKL2K$kE!{aVS3t^I!Ae#HaZ#w>*-yh>wKR;< zu!&fAznE<*{`C2|85UvHQ(MPGn{0MpQ`{a|4u-?NrY%E1Jrx{1uW**(x4p6Ya>*^8 zDpWeX`>xs+*ALgcU5KajrAEXGJVbjvVp4I-OgxXy$}mEOtOszelV{ljdUiBm>YhWy ztyg-Sa}F+j|E||A{GTa)@pb&|%w5d?XXc|`R%QNOv{lDno}8YxmiS7nr6AGOq>t?< z-Zzhz^>rLOXB!V~=+&X<4b&XspdqdnzxL_xbd*Qjxfb<*@);tHdvt2#jl}*?NPML< G!1(|X0Ogzj literal 0 HcmV?d00001 diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hans.lproj/Localizable.strings b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..1066e3daa0f9cc2abdafa3cc3c387f0f8cc05cd1 GIT binary patch literal 1368 zcmezWPl>^o!HXe?A(bJGp$JG8Gh{G$0O>@A6d+l|;0dI2fUFQ8u3#u(P-0MEumxfz z25!HTN$-Q7`k4o9NL6C6X5a#f;WsOQp%iFV4nrnG9z!}76YJ6$;!jr<2NQ21s=INS zo1Co?4l=VKH7{A$PmcivAuh)5<`AI26M?P-`5RvdT+CY$^faBj{9jmm>a*^n3AjT6 z)kH$!aB8AmDyF&E-RcMo(-MY!1~(wi2eR&DcyP zKD=S(x0HcG9XZUgr4np*`2qdo3&fyQ=>m+85+KG*g`Z;2*JT90m;kb`C;DnOzIb&4 znvl$pO=MVsLJ5?FDL* NgVYV(q45wm0suqlA>;r6 literal 0 HcmV?d00001 diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings new file mode 100644 index 0000000..17417b5 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings @@ -0,0 +1,19 @@ +"MJRefreshHeaderIdleText" = "下拉可以刷新"; +"MJRefreshHeaderPullingText" = "鬆開立即刷新"; +"MJRefreshHeaderRefreshingText" = "正在刷新數據中..."; + +"MJRefreshTrailerIdleText" = "滑動查看圖文詳情"; +"MJRefreshTrailerPullingText" = "釋放查看圖文詳情"; + +"MJRefreshAutoFooterIdleText" = "點擊或上拉加載更多"; +"MJRefreshAutoFooterRefreshingText" = "正在加載更多的數據..."; +"MJRefreshAutoFooterNoMoreDataText" = "已經全部加載完畢"; + +"MJRefreshBackFooterIdleText" = "上拉可以加載更多"; +"MJRefreshBackFooterPullingText" = "鬆開立即加載更多"; +"MJRefreshBackFooterRefreshingText" = "正在加載更多的數據..."; +"MJRefreshBackFooterNoMoreDataText" = "已經全部加載完畢"; + +"MJRefreshHeaderLastTimeText" = "最後更新:"; +"MJRefreshHeaderDateTodayText" = "今天"; +"MJRefreshHeaderNoneLastDateText" = "無記錄"; diff --git a/Pods/MJRefresh/MJRefresh/MJRefresh.h b/Pods/MJRefresh/MJRefresh/MJRefresh.h new file mode 100644 index 0000000..d878212 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/MJRefresh.h @@ -0,0 +1,42 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh + +#import + +#if __has_include() +FOUNDATION_EXPORT double MJRefreshVersionNumber; +FOUNDATION_EXPORT const unsigned char MJRefreshVersionString[]; + +#import +#import +#import + +#import +#import + +#import +#import +#import +#import + +#import +#import +#import +#import +#else +#import "UIScrollView+MJRefresh.h" +#import "UIScrollView+MJExtension.h" +#import "UIView+MJExtension.h" + +#import "MJRefreshNormalHeader.h" +#import "MJRefreshGifHeader.h" + +#import "MJRefreshBackNormalFooter.h" +#import "MJRefreshBackGifFooter.h" +#import "MJRefreshAutoNormalFooter.h" +#import "MJRefreshAutoGifFooter.h" + +#import "MJRefreshNormalTrailer.h" +#import "MJRefreshConfig.h" +#import "NSBundle+MJRefresh.h" +#import "MJRefreshConst.h" +#endif diff --git a/Pods/MJRefresh/MJRefresh/MJRefreshConfig.h b/Pods/MJRefresh/MJRefresh/MJRefreshConfig.h new file mode 100644 index 0000000..b2c808f --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/MJRefreshConfig.h @@ -0,0 +1,36 @@ +// +// MJRefreshConfig.h +// +// Created by Frank on 2018/11/27. +// Copyright © 2018 小码哥. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface MJRefreshConfig : NSObject + +/** 默认使用的语言版本, 默认为 nil. 将随系统的语言自动改变 */ +@property (copy, nonatomic, nullable) NSString *languageCode; + +/** 默认使用的语言资源文件名, 默认为 nil, 即默认的 Localizable.strings. + + - Attention: 文件名不包含后缀.strings + */ +@property (copy, nonatomic, nullable) NSString *i18nFilename; +/** i18n 多语言资源加载自定义 Bundle. + + - Attention: 默认为 nil 采用内置逻辑. 这里设置后将忽略内置逻辑的多语言模式, 采用自定义的多语言 bundle + */ +@property (nonatomic, nullable) NSBundle *i18nBundle; + +/** Singleton Config instance */ +@property (class, nonatomic, readonly) MJRefreshConfig *defaultConfig; + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/MJRefreshConfig.m b/Pods/MJRefresh/MJRefresh/MJRefreshConfig.m new file mode 100644 index 0000000..680b95a --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/MJRefreshConfig.m @@ -0,0 +1,42 @@ +// +// MJRefreshConfig.m +// +// Created by Frank on 2018/11/27. +// Copyright © 2018 小码哥. All rights reserved. +// + +#import "MJRefreshConfig.h" +#import "MJRefreshConst.h" +#import "NSBundle+MJRefresh.h" + +@interface MJRefreshConfig (Bundle) + ++ (void)resetLanguageResourceCache; + +@end + +@implementation MJRefreshConfig + +static MJRefreshConfig *mj_RefreshConfig = nil; + ++ (instancetype)defaultConfig { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + mj_RefreshConfig = [[self alloc] init]; + }); + return mj_RefreshConfig; +} + +- (void)setLanguageCode:(NSString *)languageCode { + if ([languageCode isEqualToString:_languageCode]) { + return; + } + + _languageCode = languageCode; + // 重置语言资源 + [MJRefreshConfig resetLanguageResourceCache]; + [NSNotificationCenter.defaultCenter + postNotificationName:MJRefreshDidChangeLanguageNotification object:self]; +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/MJRefreshConst.h b/Pods/MJRefresh/MJRefresh/MJRefreshConst.h new file mode 100644 index 0000000..6881115 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/MJRefreshConst.h @@ -0,0 +1,115 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +#import +#import +#import + +// 弱引用 +#define MJWeakSelf __weak typeof(self) weakSelf = self; + +// 日志输出 +#ifdef DEBUG +#define MJRefreshLog(...) NSLog(__VA_ARGS__) +#else +#define MJRefreshLog(...) +#endif + +// 过期提醒 +#define MJRefreshDeprecated(DESCRIPTION) __attribute__((deprecated(DESCRIPTION))) + +// 运行时objc_msgSend +#define MJRefreshMsgSend(...) ((void (*)(void *, SEL, UIView *))objc_msgSend)(__VA_ARGS__) +#define MJRefreshMsgTarget(target) (__bridge void *)(target) + +// RGB颜色 +#define MJRefreshColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] + +// 文字颜色 +#define MJRefreshLabelTextColor MJRefreshColor(90, 90, 90) + +// 字体大小 +#define MJRefreshLabelFont [UIFont boldSystemFontOfSize:14] + +// 常量 +UIKIT_EXTERN const CGFloat MJRefreshLabelLeftInset; +UIKIT_EXTERN const CGFloat MJRefreshHeaderHeight; +UIKIT_EXTERN const CGFloat MJRefreshFooterHeight; +UIKIT_EXTERN const CGFloat MJRefreshTrailWidth; +UIKIT_EXTERN const CGFloat MJRefreshFastAnimationDuration; +UIKIT_EXTERN const CGFloat MJRefreshSlowAnimationDuration; + + +UIKIT_EXTERN NSString *const MJRefreshKeyPathContentOffset; +UIKIT_EXTERN NSString *const MJRefreshKeyPathContentSize; +UIKIT_EXTERN NSString *const MJRefreshKeyPathContentInset; +UIKIT_EXTERN NSString *const MJRefreshKeyPathPanState; + +UIKIT_EXTERN NSString *const MJRefreshHeaderLastUpdatedTimeKey; + +UIKIT_EXTERN NSString *const MJRefreshHeaderIdleText; +UIKIT_EXTERN NSString *const MJRefreshHeaderPullingText; +UIKIT_EXTERN NSString *const MJRefreshHeaderRefreshingText; + +UIKIT_EXTERN NSString *const MJRefreshTrailerIdleText; +UIKIT_EXTERN NSString *const MJRefreshTrailerPullingText; + +UIKIT_EXTERN NSString *const MJRefreshAutoFooterIdleText; +UIKIT_EXTERN NSString *const MJRefreshAutoFooterRefreshingText; +UIKIT_EXTERN NSString *const MJRefreshAutoFooterNoMoreDataText; + +UIKIT_EXTERN NSString *const MJRefreshBackFooterIdleText; +UIKIT_EXTERN NSString *const MJRefreshBackFooterPullingText; +UIKIT_EXTERN NSString *const MJRefreshBackFooterRefreshingText; +UIKIT_EXTERN NSString *const MJRefreshBackFooterNoMoreDataText; + +UIKIT_EXTERN NSString *const MJRefreshHeaderLastTimeText; +UIKIT_EXTERN NSString *const MJRefreshHeaderDateTodayText; +UIKIT_EXTERN NSString *const MJRefreshHeaderNoneLastDateText; + +UIKIT_EXTERN NSString *const MJRefreshDidChangeLanguageNotification; + +// 状态检查 +#define MJRefreshCheckState \ +MJRefreshState oldState = self.state; \ +if (state == oldState) return; \ +[super setState:state]; + +// 异步主线程执行,不强持有Self +#define MJRefreshDispatchAsyncOnMainQueue(x) \ +__weak typeof(self) weakSelf = self; \ +dispatch_async(dispatch_get_main_queue(), ^{ \ +typeof(weakSelf) self = weakSelf; \ +{x} \ +}); + +/// 替换方法实现 +/// @param _fromClass 源类 +/// @param _originSelector 源类的 Selector +/// @param _toClass 目标类 +/// @param _newSelector 目标类的 Selector +CG_INLINE BOOL MJRefreshExchangeImplementations( + Class _fromClass, SEL _originSelector, + Class _toClass, SEL _newSelector) { + if (!_fromClass || !_toClass) { + return NO; + } + + Method oriMethod = class_getInstanceMethod(_fromClass, _originSelector); + Method newMethod = class_getInstanceMethod(_toClass, _newSelector); + if (!newMethod) { + return NO; + } + + BOOL isAddedMethod = class_addMethod(_fromClass, _originSelector, + method_getImplementation(newMethod), + method_getTypeEncoding(newMethod)); + if (isAddedMethod) { + // 如果 class_addMethod 成功了,说明之前 fromClass 里并不存在 originSelector,所以要用一个空的方法代替它,以避免 class_replaceMethod 后,后续 toClass 的这个方法被调用时可能会 crash + IMP emptyIMP = imp_implementationWithBlock(^(id selfObject) {}); + IMP oriMethodIMP = method_getImplementation(oriMethod) ?: emptyIMP; + const char *oriMethodTypeEncoding = method_getTypeEncoding(oriMethod) ?: "v@:"; + class_replaceMethod(_toClass, _newSelector, oriMethodIMP, oriMethodTypeEncoding); + } else { + method_exchangeImplementations(oriMethod, newMethod); + } + return YES; +} diff --git a/Pods/MJRefresh/MJRefresh/MJRefreshConst.m b/Pods/MJRefresh/MJRefresh/MJRefreshConst.m new file mode 100644 index 0000000..704d4c7 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/MJRefreshConst.m @@ -0,0 +1,39 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +#import + +const CGFloat MJRefreshLabelLeftInset = 25; +const CGFloat MJRefreshHeaderHeight = 54.0; +const CGFloat MJRefreshFooterHeight = 44.0; +const CGFloat MJRefreshTrailWidth = 60.0; +const CGFloat MJRefreshFastAnimationDuration = 0.25; +const CGFloat MJRefreshSlowAnimationDuration = 0.4; + + +NSString *const MJRefreshKeyPathContentOffset = @"contentOffset"; +NSString *const MJRefreshKeyPathContentInset = @"contentInset"; +NSString *const MJRefreshKeyPathContentSize = @"contentSize"; +NSString *const MJRefreshKeyPathPanState = @"state"; + +NSString *const MJRefreshHeaderLastUpdatedTimeKey = @"MJRefreshHeaderLastUpdatedTimeKey"; + +NSString *const MJRefreshHeaderIdleText = @"MJRefreshHeaderIdleText"; +NSString *const MJRefreshHeaderPullingText = @"MJRefreshHeaderPullingText"; +NSString *const MJRefreshHeaderRefreshingText = @"MJRefreshHeaderRefreshingText"; + +NSString *const MJRefreshTrailerIdleText = @"MJRefreshTrailerIdleText"; +NSString *const MJRefreshTrailerPullingText = @"MJRefreshTrailerPullingText"; + +NSString *const MJRefreshAutoFooterIdleText = @"MJRefreshAutoFooterIdleText"; +NSString *const MJRefreshAutoFooterRefreshingText = @"MJRefreshAutoFooterRefreshingText"; +NSString *const MJRefreshAutoFooterNoMoreDataText = @"MJRefreshAutoFooterNoMoreDataText"; + +NSString *const MJRefreshBackFooterIdleText = @"MJRefreshBackFooterIdleText"; +NSString *const MJRefreshBackFooterPullingText = @"MJRefreshBackFooterPullingText"; +NSString *const MJRefreshBackFooterRefreshingText = @"MJRefreshBackFooterRefreshingText"; +NSString *const MJRefreshBackFooterNoMoreDataText = @"MJRefreshBackFooterNoMoreDataText"; + +NSString *const MJRefreshHeaderLastTimeText = @"MJRefreshHeaderLastTimeText"; +NSString *const MJRefreshHeaderDateTodayText = @"MJRefreshHeaderDateTodayText"; +NSString *const MJRefreshHeaderNoneLastDateText = @"MJRefreshHeaderNoneLastDateText"; + +NSString *const MJRefreshDidChangeLanguageNotification = @"MJRefreshDidChangeLanguageNotification"; diff --git a/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.h b/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.h new file mode 100644 index 0000000..a1f56f4 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.h @@ -0,0 +1,21 @@ +// +// NSBundle+MJRefresh.h +// MJRefresh +// +// Created by MJ Lee on 16/6/13. +// Copyright © 2016年 小码哥. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSBundle (MJRefresh) ++ (instancetype)mj_refreshBundle; ++ (UIImage *)mj_arrowImage; ++ (UIImage *)mj_trailArrowImage; ++ (NSString *)mj_localizedStringForKey:(NSString *)key value:(nullable NSString *)value; ++ (NSString *)mj_localizedStringForKey:(NSString *)key; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.m b/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.m new file mode 100644 index 0000000..c19cbe8 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.m @@ -0,0 +1,116 @@ +// +// NSBundle+MJRefresh.m +// MJRefresh +// +// Created by MJ Lee on 16/6/13. +// Copyright © 2016年 小码哥. All rights reserved. +// + +#import "NSBundle+MJRefresh.h" +#import "MJRefreshComponent.h" +#import "MJRefreshConfig.h" + +static NSBundle *mj_defaultI18nBundle = nil; +static NSBundle *mj_systemI18nBundle = nil; + +@implementation NSBundle (MJRefresh) ++ (instancetype)mj_refreshBundle +{ + static NSBundle *refreshBundle = nil; + if (refreshBundle == nil) { +#ifdef SWIFT_PACKAGE + NSBundle *containnerBundle = SWIFTPM_MODULE_BUNDLE; +#else + NSBundle *containnerBundle = [NSBundle bundleForClass:[MJRefreshComponent class]]; +#endif + refreshBundle = [NSBundle bundleWithPath:[containnerBundle pathForResource:@"MJRefresh" ofType:@"bundle"]]; + } + return refreshBundle; +} + ++ (UIImage *)mj_arrowImage +{ + static UIImage *arrowImage = nil; + if (arrowImage == nil) { + arrowImage = [[UIImage imageWithContentsOfFile:[[self mj_refreshBundle] pathForResource:@"arrow@2x" ofType:@"png"]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } + return arrowImage; +} + ++ (UIImage *)mj_trailArrowImage { + static UIImage *arrowImage = nil; + if (arrowImage == nil) { + arrowImage = [[UIImage imageWithContentsOfFile:[[self mj_refreshBundle] pathForResource:@"trail_arrow@2x" ofType:@"png"]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } + return arrowImage; +} + ++ (NSString *)mj_localizedStringForKey:(NSString *)key +{ + return [self mj_localizedStringForKey:key value:nil]; +} + ++ (NSString *)mj_localizedStringForKey:(NSString *)key value:(NSString *)value +{ + NSString *table = MJRefreshConfig.defaultConfig.i18nFilename; + + // 如果没有缓存, 则走初始化逻辑 + if (mj_defaultI18nBundle == nil) { + NSString *language = MJRefreshConfig.defaultConfig.languageCode; + // 如果配置中没有配置语言 + if (!language) { + language = [NSLocale preferredLanguages].firstObject; + } + NSBundle *bundle = MJRefreshConfig.defaultConfig.i18nBundle; + // 首先优先使用公共配置中的 i18nBundle, 如果为空则使用 mainBundle + bundle = bundle ? bundle : NSBundle.mainBundle; + // 按语言选取语言包 + NSString *i18nFolderPath = [bundle pathForResource:language ofType:@"lproj"]; + mj_defaultI18nBundle = [NSBundle bundleWithPath:i18nFolderPath]; + // 检查语言包, 如果没有查找到, 则默认使用 mainBundle + mj_defaultI18nBundle = mj_defaultI18nBundle ? mj_defaultI18nBundle : NSBundle.mainBundle; + + // 获取 MJRefresh 自有的语言包 + if (mj_systemI18nBundle == nil) { + mj_systemI18nBundle = [self mj_defaultI18nBundleWithLanguage:language]; + } + } + // 首先在 MJRefresh 内置语言文件中寻找 + value = [mj_systemI18nBundle localizedStringForKey:key value:value table:nil]; + // 然后在 MainBundle 对应语言文件中寻找 + value = [mj_defaultI18nBundle localizedStringForKey:key value:value table:table]; + return value; +} + ++ (NSBundle *)mj_defaultI18nBundleWithLanguage:(NSString *)language { + if ([language hasPrefix:@"en"]) { + language = @"en"; + } else if ([language hasPrefix:@"zh"]) { + if ([language rangeOfString:@"Hans"].location != NSNotFound) { + language = @"zh-Hans"; // 简体中文 + } else { // zh-Hant\zh-HK\zh-TW + language = @"zh-Hant"; // 繁體中文 + } + } else if ([language hasPrefix:@"ko"]) { + language = @"ko"; + } else if ([language hasPrefix:@"ru"]) { + language = @"ru"; + } else if ([language hasPrefix:@"uk"]) { + language = @"uk"; + } else { + language = @"en"; + } + + // 从MJRefresh.bundle中查找资源 + return [NSBundle bundleWithPath:[[NSBundle mj_refreshBundle] pathForResource:language ofType:@"lproj"]]; +} +@end + +@implementation MJRefreshConfig (Bundle) + ++ (void)resetLanguageResourceCache { + mj_defaultI18nBundle = nil; + mj_systemI18nBundle = nil; +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/PrivacyInfo.xcprivacy b/Pods/MJRefresh/MJRefresh/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..2d55cfe --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/PrivacyInfo.xcprivacy @@ -0,0 +1,23 @@ + + + + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyCollectedDataTypes + + + diff --git a/Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.h b/Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.h new file mode 100644 index 0000000..df0423d --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.h @@ -0,0 +1,20 @@ +// +// UICollectionViewLayout+MJRefresh.h +// +// 该类是用来解决 Footer 在底端加载完成后, 仍停留在原处的 bug. +// 此问题出现在 iOS 14 及以下系统上. +// Reference: https://github.com/CoderMJLee/MJRefresh/issues/1552 +// +// Created by jiasong on 2021/11/15. +// Copyright © 2021 小码哥. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UICollectionViewLayout (MJRefresh) + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.m b/Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.m new file mode 100644 index 0000000..00d030e --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UICollectionViewLayout+MJRefresh.m @@ -0,0 +1,45 @@ +// +// UICollectionViewLayout+MJRefresh.m +// +// 该类是用来解决 Footer 在底端加载完成后, 仍停留在原处的 bug. +// 此问题出现在 iOS 14 及以下系统上. +// Reference: https://github.com/CoderMJLee/MJRefresh/issues/1552 +// +// Created by jiasong on 2021/11/15. +// Copyright © 2021 小码哥. All rights reserved. +// + +#import "UICollectionViewLayout+MJRefresh.h" +#import "MJRefreshConst.h" +#import "MJRefreshFooter.h" +#import "UIScrollView+MJRefresh.h" + +@implementation UICollectionViewLayout (MJRefresh) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + MJRefreshExchangeImplementations(self.class, @selector(finalizeCollectionViewUpdates), + self.class, @selector(mj_finalizeCollectionViewUpdates)); + }); +} + +- (void)mj_finalizeCollectionViewUpdates { + [self mj_finalizeCollectionViewUpdates]; + + __kindof MJRefreshFooter *footer = self.collectionView.mj_footer; + CGSize newSize = self.collectionViewContentSize; + CGSize oldSize = self.collectionView.contentSize; + if (footer != nil && !CGSizeEqualToSize(newSize, oldSize)) { + NSDictionary *changed = @{ + NSKeyValueChangeNewKey: [NSValue valueWithCGSize:newSize], + NSKeyValueChangeOldKey: [NSValue valueWithCGSize:oldSize], + }; + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + [footer scrollViewContentSizeDidChange:changed]; + [CATransaction commit]; + } +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.h b/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.h new file mode 100644 index 0000000..1b46d59 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.h @@ -0,0 +1,28 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// UIScrollView+Extension.h +// MJRefresh +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 小码哥. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIScrollView (MJExtension) +@property (readonly, nonatomic) UIEdgeInsets mj_inset; + +@property (assign, nonatomic) CGFloat mj_insetT; +@property (assign, nonatomic) CGFloat mj_insetB; +@property (assign, nonatomic) CGFloat mj_insetL; +@property (assign, nonatomic) CGFloat mj_insetR; + +@property (assign, nonatomic) CGFloat mj_offsetX; +@property (assign, nonatomic) CGFloat mj_offsetY; + +@property (assign, nonatomic) CGFloat mj_contentW; +@property (assign, nonatomic) CGFloat mj_contentH; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m b/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m new file mode 100644 index 0000000..1c43721 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m @@ -0,0 +1,153 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// UIScrollView+Extension.m +// MJRefresh +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 小码哥. All rights reserved. +// + +#import "UIScrollView+MJExtension.h" +#import + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" + +@implementation UIScrollView (MJExtension) + +static BOOL respondsToAdjustedContentInset_; + ++ (void)load +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + respondsToAdjustedContentInset_ = [self instancesRespondToSelector:@selector(adjustedContentInset)]; + }); +} + +- (UIEdgeInsets)mj_inset +{ +#ifdef __IPHONE_11_0 + if (respondsToAdjustedContentInset_) { + return self.adjustedContentInset; + } +#endif + return self.contentInset; +} + +- (void)setMj_insetT:(CGFloat)mj_insetT +{ + UIEdgeInsets inset = self.contentInset; + inset.top = mj_insetT; +#ifdef __IPHONE_11_0 + if (respondsToAdjustedContentInset_) { + inset.top -= (self.adjustedContentInset.top - self.contentInset.top); + } +#endif + self.contentInset = inset; +} + +- (CGFloat)mj_insetT +{ + return self.mj_inset.top; +} + +- (void)setMj_insetB:(CGFloat)mj_insetB +{ + UIEdgeInsets inset = self.contentInset; + inset.bottom = mj_insetB; +#ifdef __IPHONE_11_0 + if (respondsToAdjustedContentInset_) { + inset.bottom -= (self.adjustedContentInset.bottom - self.contentInset.bottom); + } +#endif + self.contentInset = inset; +} + +- (CGFloat)mj_insetB +{ + return self.mj_inset.bottom; +} + +- (void)setMj_insetL:(CGFloat)mj_insetL +{ + UIEdgeInsets inset = self.contentInset; + inset.left = mj_insetL; +#ifdef __IPHONE_11_0 + if (respondsToAdjustedContentInset_) { + inset.left -= (self.adjustedContentInset.left - self.contentInset.left); + } +#endif + self.contentInset = inset; +} + +- (CGFloat)mj_insetL +{ + return self.mj_inset.left; +} + +- (void)setMj_insetR:(CGFloat)mj_insetR +{ + UIEdgeInsets inset = self.contentInset; + inset.right = mj_insetR; +#ifdef __IPHONE_11_0 + if (respondsToAdjustedContentInset_) { + inset.right -= (self.adjustedContentInset.right - self.contentInset.right); + } +#endif + self.contentInset = inset; +} + +- (CGFloat)mj_insetR +{ + return self.mj_inset.right; +} + +- (void)setMj_offsetX:(CGFloat)mj_offsetX +{ + CGPoint offset = self.contentOffset; + offset.x = mj_offsetX; + self.contentOffset = offset; +} + +- (CGFloat)mj_offsetX +{ + return self.contentOffset.x; +} + +- (void)setMj_offsetY:(CGFloat)mj_offsetY +{ + CGPoint offset = self.contentOffset; + offset.y = mj_offsetY; + self.contentOffset = offset; +} + +- (CGFloat)mj_offsetY +{ + return self.contentOffset.y; +} + +- (void)setMj_contentW:(CGFloat)mj_contentW +{ + CGSize size = self.contentSize; + size.width = mj_contentW; + self.contentSize = size; +} + +- (CGFloat)mj_contentW +{ + return self.contentSize.width; +} + +- (void)setMj_contentH:(CGFloat)mj_contentH +{ + CGSize size = self.contentSize; + size.height = mj_contentH; + self.contentSize = size; +} + +- (CGFloat)mj_contentH +{ + return self.contentSize.height; +} +@end +#pragma clang diagnostic pop diff --git a/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.h b/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.h new file mode 100644 index 0000000..8ce3282 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.h @@ -0,0 +1,36 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// UIScrollView+MJRefresh.h +// MJRefresh +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 给ScrollView增加下拉刷新、上拉刷新、 左滑刷新的功能 + +#import +#if __has_include() +#import +#else +#import "MJRefreshConst.h" +#endif + +@class MJRefreshHeader, MJRefreshFooter, MJRefreshTrailer; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIScrollView (MJRefresh) +/** 下拉刷新控件 */ +@property (strong, nonatomic, nullable) MJRefreshHeader *mj_header; +@property (strong, nonatomic, nullable) MJRefreshHeader *header MJRefreshDeprecated("使用mj_header"); +/** 上拉刷新控件 */ +@property (strong, nonatomic, nullable) MJRefreshFooter *mj_footer; +@property (strong, nonatomic, nullable) MJRefreshFooter *footer MJRefreshDeprecated("使用mj_footer"); + +/** 左滑刷新控件 */ +@property (strong, nonatomic, nullable) MJRefreshTrailer *mj_trailer; + +#pragma mark - other +- (NSInteger)mj_totalDataCount; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m b/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m new file mode 100644 index 0000000..3bb85da --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m @@ -0,0 +1,120 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// UIScrollView+MJRefresh.m +// MJRefresh +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "UIScrollView+MJRefresh.h" +#import "MJRefreshHeader.h" +#import "MJRefreshFooter.h" +#import "MJRefreshTrailer.h" +#import + +@implementation UIScrollView (MJRefresh) + +#pragma mark - header +static const char MJRefreshHeaderKey = '\0'; +- (void)setMj_header:(MJRefreshHeader *)mj_header +{ + if (mj_header != self.mj_header) { + // 删除旧的,添加新的 + [self.mj_header removeFromSuperview]; + + if (mj_header) { + [self insertSubview:mj_header atIndex:0]; + } + // 存储新的 + objc_setAssociatedObject(self, &MJRefreshHeaderKey, + mj_header, OBJC_ASSOCIATION_RETAIN); + } +} + +- (MJRefreshHeader *)mj_header +{ + return objc_getAssociatedObject(self, &MJRefreshHeaderKey); +} + +#pragma mark - footer +static const char MJRefreshFooterKey = '\0'; +- (void)setMj_footer:(MJRefreshFooter *)mj_footer +{ + if (mj_footer != self.mj_footer) { + // 删除旧的,添加新的 + [self.mj_footer removeFromSuperview]; + if (mj_footer) { + [self insertSubview:mj_footer atIndex:0]; + } + // 存储新的 + objc_setAssociatedObject(self, &MJRefreshFooterKey, + mj_footer, OBJC_ASSOCIATION_RETAIN); + } +} + +- (MJRefreshFooter *)mj_footer +{ + return objc_getAssociatedObject(self, &MJRefreshFooterKey); +} + +#pragma mark - footer +static const char MJRefreshTrailerKey = '\0'; +- (void)setMj_trailer:(MJRefreshTrailer *)mj_trailer { + if (mj_trailer != self.mj_trailer) { + // 删除旧的,添加新的 + [self.mj_trailer removeFromSuperview]; + if (mj_trailer) { + [self insertSubview:mj_trailer atIndex:0]; + } + // 存储新的 + objc_setAssociatedObject(self, &MJRefreshTrailerKey, + mj_trailer, OBJC_ASSOCIATION_RETAIN); + } +} + +- (MJRefreshTrailer *)mj_trailer { + return objc_getAssociatedObject(self, &MJRefreshTrailerKey); +} + +#pragma mark - 过期 +- (void)setFooter:(MJRefreshFooter *)footer +{ + self.mj_footer = footer; +} + +- (MJRefreshFooter *)footer +{ + return self.mj_footer; +} + +- (void)setHeader:(MJRefreshHeader *)header +{ + self.mj_header = header; +} + +- (MJRefreshHeader *)header +{ + return self.mj_header; +} + +#pragma mark - other +- (NSInteger)mj_totalDataCount +{ + NSInteger totalCount = 0; + if ([self isKindOfClass:[UITableView class]]) { + UITableView *tableView = (UITableView *)self; + + for (NSInteger section = 0; section < tableView.numberOfSections; section++) { + totalCount += [tableView numberOfRowsInSection:section]; + } + } else if ([self isKindOfClass:[UICollectionView class]]) { + UICollectionView *collectionView = (UICollectionView *)self; + + for (NSInteger section = 0; section < collectionView.numberOfSections; section++) { + totalCount += [collectionView numberOfItemsInSection:section]; + } + } + return totalCount; +} + +@end diff --git a/Pods/MJRefresh/MJRefresh/UIView+MJExtension.h b/Pods/MJRefresh/MJRefresh/UIView+MJExtension.h new file mode 100644 index 0000000..0ac0968 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UIView+MJExtension.h @@ -0,0 +1,22 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// UIView+Extension.h +// MJRefresh +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 小码哥. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIView (MJExtension) +@property (assign, nonatomic) CGFloat mj_x; +@property (assign, nonatomic) CGFloat mj_y; +@property (assign, nonatomic) CGFloat mj_w; +@property (assign, nonatomic) CGFloat mj_h; +@property (assign, nonatomic) CGSize mj_size; +@property (assign, nonatomic) CGPoint mj_origin; +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/MJRefresh/MJRefresh/UIView+MJExtension.m b/Pods/MJRefresh/MJRefresh/UIView+MJExtension.m new file mode 100644 index 0000000..f4dcf44 --- /dev/null +++ b/Pods/MJRefresh/MJRefresh/UIView+MJExtension.m @@ -0,0 +1,83 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// UIView+Extension.m +// MJRefresh +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 小码哥. All rights reserved. +// + +#import "UIView+MJExtension.h" + +@implementation UIView (MJExtension) +- (void)setMj_x:(CGFloat)mj_x +{ + CGRect frame = self.frame; + frame.origin.x = mj_x; + self.frame = frame; +} + +- (CGFloat)mj_x +{ + return self.frame.origin.x; +} + +- (void)setMj_y:(CGFloat)mj_y +{ + CGRect frame = self.frame; + frame.origin.y = mj_y; + self.frame = frame; +} + +- (CGFloat)mj_y +{ + return self.frame.origin.y; +} + +- (void)setMj_w:(CGFloat)mj_w +{ + CGRect frame = self.frame; + frame.size.width = mj_w; + self.frame = frame; +} + +- (CGFloat)mj_w +{ + return self.frame.size.width; +} + +- (void)setMj_h:(CGFloat)mj_h +{ + CGRect frame = self.frame; + frame.size.height = mj_h; + self.frame = frame; +} + +- (CGFloat)mj_h +{ + return self.frame.size.height; +} + +- (void)setMj_size:(CGSize)mj_size +{ + CGRect frame = self.frame; + frame.size = mj_size; + self.frame = frame; +} + +- (CGSize)mj_size +{ + return self.frame.size; +} + +- (void)setMj_origin:(CGPoint)mj_origin +{ + CGRect frame = self.frame; + frame.origin = mj_origin; + self.frame = frame; +} + +- (CGPoint)mj_origin +{ + return self.frame.origin; +} +@end diff --git a/Pods/MJRefresh/README.md b/Pods/MJRefresh/README.md new file mode 100644 index 0000000..0746fbe --- /dev/null +++ b/Pods/MJRefresh/README.md @@ -0,0 +1,457 @@ +## MJRefresh +[![SPM supported](https://img.shields.io/badge/SPM-supported-4BC51D.svg?style=flat)](https://github.com/apple/swift-package-manager) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![podversion](https://img.shields.io/cocoapods/v/MJRefresh.svg)](https://cocoapods.org/pods/MJRefresh) + +* An easy way to use pull-to-refresh + +[📜✍🏻**Release Notes**: more details](https://github.com/CoderMJLee/MJRefresh/releases) + +## Contents + +- New Features + - [Dynamic i18n Switching](#dynamic_i18n_switching) + - [SPM Supported](#spm_supported) + - [Swift Chaining Grammar Supported](#swift_chaining_grammar_supported) + +* Getting Started + * [Features【Support what kinds of controls to refresh】](#Support_what_kinds_of_controls_to_refresh) + * [Installation【How to use MJRefresh】](#How_to_use_MJRefresh) + * [Who's using【More than hundreds of Apps are using MJRefresh】](#More_than_hundreds_of_Apps_are_using_MJRefresh) + * [Classes【The Class Structure Chart of MJRefresh】](#The_Class_Structure_Chart_of_MJRefresh) +* Comment API + * [MJRefreshComponent.h](#MJRefreshComponent.h) + * [MJRefreshHeader.h](#MJRefreshHeader.h) + * [MJRefreshFooter.h](#MJRefreshFooter.h) + * [MJRefreshAutoFooter.h](#MJRefreshAutoFooter.h) + * [MJRefreshTrailer.h](#MJRefreshTrailer.h) +* Examples + * [Reference](#Reference) + * [The drop-down refresh 01-Default](#The_drop-down_refresh_01-Default) + * [The drop-down refresh 02-Animation image](#The_drop-down_refresh_02-Animation_image) + * [The drop-down refresh 03-Hide the time](#The_drop-down_refresh_03-Hide_the_time) + * [The drop-down refresh 04-Hide status and time](#The_drop-down_refresh_04-Hide_status_and_time) + * [The drop-down refresh 05-DIY title](#The_drop-down_refresh_05-DIY_title) + * [The drop-down refresh 06-DIY the control of refresh](#The_drop-down_refresh_06-DIY_the_control_of_refresh) + * [The pull to refresh 01-Default](#The_pull_to_refresh_01-Default) + * [The pull to refresh 02-Animation image](#The_pull_to_refresh_02-Animation_image) + * [The pull to refresh 03-Hide the title of refresh status](#The_pull_to_refresh_03-Hide_the_title_of_refresh_status) + * [The pull to refresh 04-All loaded](#The_pull_to_refresh_04-All_loaded) + * [The pull to refresh 05-DIY title](#The_pull_to_refresh_05-DIY_title) + * [The pull to refresh 06-Hidden After loaded](#The_pull_to_refresh_06-Hidden_After_loaded) + * [The pull to refresh 07-Automatic back of the pull01](#The_pull_to_refresh_07-Automatic_back_of_the_pull01) + * [The pull to refresh 08-Automatic back of the pull02](#The_pull_to_refresh_08-Automatic_back_of_the_pull02) + * [The pull to refresh 09-DIY the control of refresh(Automatic refresh)](#The_pull_to_refresh_09-DIY_the_control_of_refresh(Automatic_refresh)) + * [The pull to refresh 10-DIY the control of refresh(Automatic back)](#The_pull_to_refresh_10-DIY_the_control_of_refresh(Automatic_back)) + * [UICollectionView01-The pull and drop-down refresh](#UICollectionView01-The_pull_and_drop-down_refresh) + * [UICollectionView02-The trailer refresh](#UICollectionView02-The_trailer_refresh) + * [WKWebView01-The drop-down refresh](#WKWebView01-The_drop-down_refresh) +* [Hope](#Hope) + +## New Features +### Dynamic i18n Switching + +Now `MJRefresh components` will be rerendered automatically with `MJRefreshConfig.default.language` setting. + +#### Example + +Go `i18n` folder and see lots of cases. Simulator example is behind `i18n tab` in right-top corner. + +#### Setting language + +```swift +MJRefreshConfig.default.language = "zh-hans" +``` + +#### Setting i18n file name + +```swift +MJRefreshConfig.default.i18nFilename = "i18n File Name(not include type<.strings>)" +``` + +#### Setting i18n language bundle + +```swift +MJRefreshConfig.default.i18nBundle = +``` + +#### Adopting the feature in your DIY component + +1. Just override `i18nDidChange` function and reset texts. + +```swift +// must use this localization methods +Bundle.mj_localizedString(forKey: "") +// or +Bundle.mj_localizedString(forKey: "", value:"") + +override func i18nDidChange() { + // Reset texts function + setupTexts() + // Make sure to call super after resetting texts. It will call placeSubViews for applying new layout. + super.i18nDidChange() +} +``` + +2. Receiving `MJRefreshDidChangeLanguageNotification` notification. + +### SPM Supported + +Released from [`3.7.1`](https://github.com/CoderMJLee/MJRefresh/releases/tag/3.7.1) + +### Swift Chaining Grammar Supported + +```swift + // Example as MJRefreshNormalHeader + func addRefreshHeader() { + MJRefreshNormalHeader { [weak self] in + // load some data + }.autoChangeTransparency(true) + .link(to: tableView) + } +``` + +## Support what kinds of controls to refresh + +* `UIScrollView`、`UITableView`、`UICollectionView`、`WKWebView` + +## How to use MJRefresh +* Installation with CocoaPods:`pod 'MJRefresh'` +* Installation with [Carthage](https://github.com/Carthage/Carthage):`github "CoderMJLee/MJRefresh"` +* Manual import: + * Drag All files in the `MJRefresh` folder to project + * Import the main file:`#import "MJRefresh.h"` + +```objc +Base Custom +MJRefresh.bundle MJRefresh.h +MJRefreshConst.h MJRefreshConst.m +UIScrollView+MJExtension.h UIScrollView+MJExtension.m +UIScrollView+MJRefresh.h UIScrollView+MJRefresh.m +UIView+MJExtension.h UIView+MJExtension.m +``` + +## More than hundreds of Apps are using MJRefresh + +* More information of App can focus on:[M了个J-博客园](http://www.cnblogs.com/mjios/p/4409853.html) + +## The Class Structure Chart of MJRefresh +![](http://images0.cnblogs.com/blog2015/497279/201506/132232456139177.png) +- `The class of red text` in the chart:You can use them directly + - The drop-down refresh control types + - Normal:`MJRefreshNormalHeader` + - Gif:`MJRefreshGifHeader` + - The pull to refresh control types + - Auto refresh + - Normal:`MJRefreshAutoNormalFooter` + - Gif:`MJRefreshAutoGifFooter` + - Auto Back + - Normal:`MJRefreshBackNormalFooter` + - Gif:`MJRefreshBackGifFooter` + +- `The class of non-red text` in the chart:For inheritance,to use DIY the control of refresh + +- About how to DIY the control of refresh,You can refer the Class in below Chart
+ + + +## MJRefreshComponent.h +```objc +/** The Base Class of refresh control */ +@interface MJRefreshComponent : UIView +#pragma mark - Control the state of Refresh + +/** BeginRefreshing */ +- (void)beginRefreshing; +/** EndRefreshing */ +- (void)endRefreshing; +/** IsRefreshing */ +- (BOOL)isRefreshing; + +#pragma mark - Other +/** According to the drag ratio to change alpha automatically */ +@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha; +@end +``` + +## MJRefreshHeader.h +```objc +@interface MJRefreshHeader : MJRefreshComponent +/** Creat header */ ++ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock; +/** Creat header */ ++ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** This key is used to storage the time that the last time of drown-down successfully */ +@property (copy, nonatomic) NSString *lastUpdatedTimeKey; +/** The last time of drown-down successfully */ +@property (strong, nonatomic, readonly) NSDate *lastUpdatedTime; + +/** Ignored scrollView contentInset top */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop; +@end +``` + +## MJRefreshFooter.h +```objc +@interface MJRefreshFooter : MJRefreshComponent +/** Creat footer */ ++ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock; +/** Creat footer */ ++ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** NoticeNoMoreData */ +- (void)noticeNoMoreData; +/** ResetNoMoreData(Clear the status of NoMoreData ) */ +- (void)resetNoMoreData; + +/** Ignored scrollView contentInset bottom */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom; +@end +``` + +## MJRefreshAutoFooter.h +```objc +@interface MJRefreshAutoFooter : MJRefreshFooter +/** Is Automatically Refresh(Default is Yes) */ +@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh; + +/** When there is much at the bottom of the control is automatically refresh(Default is 1.0,Is at the bottom of the control appears in full, will refresh automatically) */ +@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent; +@end +``` + +## MJRefreshTrailer.h +```objc +@interface MJRefreshTrailer : MJRefreshComponent + +/** 创建trailer */ ++ (instancetype)trailerWithRefreshingBlock:(MJRefreshComponentAction)refreshingBlock; +/** 创建trailer */ ++ (instancetype)trailerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** 忽略多少scrollView的contentInset的right */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetRight; + +@end +``` + +## Reference +```objc +* Due to there are more functions of this framework,Don't write specific text describe its usage +* You can directly reference examples MJTableViewController、MJCollectionViewController、MJWebViewController,More intuitive and fast. +``` + + +## The drop-down refresh 01-Default + +```objc +self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ + //Call this Block When enter the refresh status automatically +}]; +或 +// Set the callback(Once you enter the refresh status,then call the action of target,that is call [self loadNewData]) +self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; + +// Enter the refresh status immediately +[self.tableView.mj_header beginRefreshing]; +``` +![(下拉刷新01-普通)](http://images0.cnblogs.com/blog2015/497279/201506/141204343486151.gif) + +## The drop-down refresh 02-Animation image +```objc +// Set the callback(一Once you enter the refresh status,then call the action of target,that is call [self loadNewData]) +MJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; +// Set the ordinary state of animated images +[header setImages:idleImages forState:MJRefreshStateIdle]; +// Set the pulling state of animated images(Enter the status of refreshing as soon as loosen) +[header setImages:pullingImages forState:MJRefreshStatePulling]; +// Set the refreshing state of animated images +[header setImages:refreshingImages forState:MJRefreshStateRefreshing]; +// Set header +self.tableView.mj_header = header; +``` +![(下拉刷新02-动画图片)](http://images0.cnblogs.com/blog2015/497279/201506/141204402238389.gif) + +## The drop-down refresh 03-Hide the time +```objc +// Hide the time +header.lastUpdatedTimeLabel.hidden = YES; +``` +![(下拉刷新03-隐藏时间)](http://images0.cnblogs.com/blog2015/497279/201506/141204456132944.gif) + +## The drop-down refresh 04-Hide status and time +```objc +// Hide the time +header.lastUpdatedTimeLabel.hidden = YES; + +// Hide the status +header.stateLabel.hidden = YES; +``` +![(下拉刷新04-隐藏状态和时间0)](http://images0.cnblogs.com/blog2015/497279/201506/141204508639539.gif) + +## The drop-down refresh 05-DIY title +```objc +// Set title +[header setTitle:@"Pull down to refresh" forState:MJRefreshStateIdle]; +[header setTitle:@"Release to refresh" forState:MJRefreshStatePulling]; +[header setTitle:@"Loading ..." forState:MJRefreshStateRefreshing]; + +// Set font +header.stateLabel.font = [UIFont systemFontOfSize:15]; +header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14]; + +// Set textColor +header.stateLabel.textColor = [UIColor redColor]; +header.lastUpdatedTimeLabel.textColor = [UIColor blueColor]; +``` +![(下拉刷新05-自定义文字)](http://images0.cnblogs.com/blog2015/497279/201506/141204563633593.gif) + +## The drop-down refresh 06-DIY the control of refresh +```objc +self.tableView.mj_header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; +// Implementation reference to MJDIYHeader.h和MJDIYHeader.m +``` +![(下拉刷新06-自定义刷新控件)](http://images0.cnblogs.com/blog2015/497279/201506/141205019261159.gif) + +## The pull to refresh 01-Default +```objc +self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ + //Call this Block When enter the refresh status automatically +}]; +或 +// Set the callback(Once you enter the refresh status,then call the action of target,that is call [self loadMoreData]) +self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; +``` +![(上拉刷新01-默认)](http://images0.cnblogs.com/blog2015/497279/201506/141205090047696.gif) + +## The pull to refresh 02-Animation image +```objc +// Set the callback(Once you enter the refresh status,then call the action of target,that is call [self loadMoreData]) +MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; + +// Set the refresh image +[footer setImages:refreshingImages forState:MJRefreshStateRefreshing]; + +// Set footer +self.tableView.mj_footer = footer; +``` +![(上拉刷新02-动画图片)](http://images0.cnblogs.com/blog2015/497279/201506/141205141445793.gif) + +## The pull to refresh 03-Hide the title of refresh status +```objc +// Hide the title of refresh status +footer.refreshingTitleHidden = YES; +// If does have not above method,then use footer.stateLabel.hidden = YES; +``` +![(上拉刷新03-隐藏刷新状态的文字)](http://images0.cnblogs.com/blog2015/497279/201506/141205200985774.gif) + +## The pull to refresh 04-All loaded +```objc +//Become the status of NoMoreData +[footer noticeNoMoreData]; +``` +![(上拉刷新04-全部加载完毕)](http://images0.cnblogs.com/blog2015/497279/201506/141205248634686.gif) + +## The pull to refresh 05-DIY title +```objc +// Set title +[footer setTitle:@"Click or drag up to refresh" forState:MJRefreshStateIdle]; +[footer setTitle:@"Loading more ..." forState:MJRefreshStateRefreshing]; +[footer setTitle:@"No more data" forState:MJRefreshStateNoMoreData]; + +// Set font +footer.stateLabel.font = [UIFont systemFontOfSize:17]; + +// Set textColor +footer.stateLabel.textColor = [UIColor blueColor]; +``` +![(上拉刷新05-自定义文字)](http://images0.cnblogs.com/blog2015/497279/201506/141205295511153.gif) + +## The pull to refresh 06-Hidden After loaded +```objc +//Hidden current control of the pull to refresh +self.tableView.mj_footer.hidden = YES; +``` +![(上拉刷新06-加载后隐藏)](http://images0.cnblogs.com/blog2015/497279/201506/141205343481821.gif) + +## The pull to refresh 07-Automatic back of the pull01 +```objc +self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; +``` +![(上拉刷新07-自动回弹的上拉01)](http://images0.cnblogs.com/blog2015/497279/201506/141205392239231.gif) + +## The pull to refresh 08-Automatic back of the pull02 +```objc +MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; + +// Set the normal state of the animated image +[footer setImages:idleImages forState:MJRefreshStateIdle]; +// Set the pulling state of animated images(Enter the status of refreshing as soon as loosen) +[footer setImages:pullingImages forState:MJRefreshStatePulling]; +// Set the refreshing state of animated images +[footer setImages:refreshingImages forState:MJRefreshStateRefreshing]; + +// Set footer +self.tableView.mj_footer = footer; +``` +![(上拉刷新07-自动回弹的上拉02)](http://images0.cnblogs.com/blog2015/497279/201506/141205441443628.gif) + +## The pull to refresh 09-DIY the control of refresh(Automatic refresh) +```objc +self.tableView.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; +// Implementation reference to MJDIYAutoFooter.h和MJDIYAutoFooter.m +``` +![(上拉刷新09-自定义刷新控件(自动刷新))](http://images0.cnblogs.com/blog2015/497279/201506/141205500195866.gif) + +## The pull to refresh 10-DIY the control of refresh(Automatic back) +```objc +self.tableView.mj_footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; +// Implementation reference to MJDIYBackFooter.h和MJDIYBackFooter.m +``` +![(上拉刷新10-自定义刷新控件(自动回弹))](http://images0.cnblogs.com/blog2015/497279/201506/141205560666819.gif) + +## UICollectionView01-The pull and drop-down refresh +```objc +// The drop-down refresh +self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ + //Call this Block When enter the refresh status automatically +}]; + +// The pull to refresh +self.collectionView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ + //Call this Block When enter the refresh status automatically +}]; +``` +![(UICollectionView01-上下拉刷新)](http://images0.cnblogs.com/blog2015/497279/201506/141206021603758.gif) + +## UICollectionView02-The trailer refresh +```objc +// The trailer refresh +self.collectionView.mj_trailer = [MJRefreshNormalTrailer trailerWithRefreshingBlock:^{ + //Call this Block When enter the refresh status automatically +}]; + +``` +![(UICollectionView02-左拉刷新)](Gif/trailer_refresh.gif) + +## WKWebView01-The drop-down refresh +```objc +//Add the control of The drop-down refresh +self.webView.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ + //Call this Block When enter the refresh status automatically +}]; +``` +![(UICollectionView01-上下拉刷新)](http://images0.cnblogs.com/blog2015/497279/201506/141206080514524.gif) + +## Remind +* ARC +* iOS>=9.0 +* iPhone \ iPad screen anyway + +## 寻求志同道合的小伙伴 + +- 因本人工作忙,没有太多时间去维护MJRefresh,在此向广大框架使用者说声:非常抱歉!😞 +- 现寻求志同道合的小伙伴一起维护此框架,有兴趣的小伙伴可以[发邮件](mailto:richermj123go@vip.qq.com)给我,非常感谢😊 +- 如果一切OK,我将开放框架维护权限(github、pod等) +- 目前已经找到3位小伙伴(^-^)V diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index db846d1..1b87510 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -6,11 +6,13 @@ PODS: - AMapFoundation-NO-IDFA (>= 1.8.7) - AMapSearch-NO-IDFA (9.7.5): - AMapFoundation-NO-IDFA (>= 1.8.0) + - MJRefresh (3.7.9) DEPENDENCIES: - AMap3DMap-NO-IDFA (~> 11.1) - AMapLocation-NO-IDFA (~> 2.11) - AMapSearch-NO-IDFA (~> 9.7) + - MJRefresh (~> 3.7) SPEC REPOS: trunk: @@ -18,13 +20,15 @@ SPEC REPOS: - AMapFoundation-NO-IDFA - AMapLocation-NO-IDFA - AMapSearch-NO-IDFA + - MJRefresh SPEC CHECKSUMS: AMap3DMap-NO-IDFA: 393a24abb0451fed2daa4316c8d3d356a395f2be AMapFoundation-NO-IDFA: f48acbf6e74913dc6744581053f7d984f2432850 AMapLocation-NO-IDFA: 0fa6e7d5e42e10253f4437424d98966f53760862 AMapSearch-NO-IDFA: 8e9d104032990a3b0cab66afb535299887c61047 + MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 -PODFILE CHECKSUM: baa972253fcebc312545f7592c48cbba632f1907 +PODFILE CHECKSUM: dd39a238c7d1f1de8b61bcb07e20911bedae96b7 COCOAPODS: 1.16.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index f98de1b..a4b29bb 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -13,7 +13,7 @@ buildPhases = ( ); dependencies = ( - 6C65DF00B250F024B4E6B6F4330093DA /* PBXTargetDependency */, + 14AF565C4637B73BC2584C61CC7EC677 /* PBXTargetDependency */, ); name = "AMapLocation-NO-IDFA"; }; @@ -23,13 +23,13 @@ buildPhases = ( ); dependencies = ( - 770B6209BD1D6EEACDEC08C4F8D15368 /* PBXTargetDependency */, + 2D0AD056C34FAA29284DF2D03917892C /* PBXTargetDependency */, ); name = "AMapSearch-NO-IDFA"; }; 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */ = { isa = PBXAggregateTarget; - buildConfigurationList = C2E882BA611C08B99AFF453B387FB2C2 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */; + buildConfigurationList = A1A94DBC4284DCAFF692A764EFF209C7 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */; buildPhases = ( ); dependencies = ( @@ -42,223 +42,369 @@ buildPhases = ( ); dependencies = ( - 5CA482D3FDDBAD1FBF45810BFB30868D /* PBXTargetDependency */, + 27F685E292172B93505CBABC9D049072 /* PBXTargetDependency */, ); name = "AMap3DMap-NO-IDFA"; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */; }; + 08719ABCE689ED74FE7486B1E49DAA6C /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = D0FE45307E1589134990F6D62D5D51D7 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0EF10747EF2A02413E84BD5EF7C87A4B /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 950F5DF4CC9F1990F496C1FA1B51A3EB /* MJRefreshNormalHeader.m */; }; + 11C929E6BFB46F981685446F26DCE605 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 995A1FE995BF8A3BB47436F3D05C8251 /* MJRefreshAutoFooter.m */; }; + 186B573F1BEB8A23419A02814A7741DB /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 981AA3A188835E8705A105A86799212E /* MJRefreshFooter.m */; }; + 1B4E84392BCAE40B8D02294001544906 /* Pods-suixinkanTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 22516EA77E7120000632C30BD9A03927 /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D251D37879678420C2E21DB2DA7CDD1 /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24E963C1D6245F98BAC8A0ACCB7DE987 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = D03AEB9827714C23A990AEDD1B44E00E /* NSBundle+MJRefresh.m */; }; + 28BA9702905AA2B4C1E9E4878032D4E4 /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 434092C132A5B63621FAD580FF82D0A7 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2DC44A09A6C9D6DC7D1BDA2DFCF99EE3 /* MJRefreshConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 655C7084A60741488C18B8F24B3D97B8 /* MJRefreshConfig.m */; }; + 325CA20B9271F3E008234E1518B79061 /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D911B8DB93AFACCBF68114FC04A060E1 /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 327BA3DDA513422E632D3DA4A8FC60EC /* MJRefresh-MJRefresh.Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 7E3097CFEFDA621E9FB0E62009FF87FC /* MJRefresh-MJRefresh.Privacy */; }; + 3A2FCB914F6EADED828FF05F7E9132AE /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 925902FC9C669D9561854D1667C48580 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 442F468E261A1106C291BF52BDBF9DB7 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = DB458DF9FE4C818BDA198678A04781AF /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 452C940762F65B125C216F73B369F583 /* MJRefreshStateTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B423EED53D5FCECC2E3EBDE3C439A1 /* MJRefreshStateTrailer.m */; }; + 45E1583D7EF53489B82C4CA2AD1AD0CF /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B04E1C6538D1C855BDAFD2C7F1CBCD1 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 475B4F3E71C293065AAFDB1888696CF6 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FE5CE5609C08A51C59D0BC7714A4D47 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DCA75BFE1558CE59DFC56607E49B3D2 /* MJRefreshConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AB5B52027B67AC28237EBB53E108905 /* MJRefreshConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5163FC6D715F6881B1FA1AB13DCEF870 /* UICollectionViewLayout+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 47C9D7D67F0E2980F8FEA947D9E74227 /* UICollectionViewLayout+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 523235228A1C021C67F2E3776A922DC5 /* MJRefreshTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D878ED047D33FA3082CE6DB77514966 /* MJRefreshTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 54E268C32915CF908E7AA776909B45EB /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 03388D61B1D3E062A4B713B0C5D98736 /* MJRefreshConst.m */; }; + 561420A20DC0A84258A902E9EB69A15A /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 30521482B763363B7C1BB8B78D626408 /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5BB6B99986FD7111B3AEBE931C7F507B /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E888C9D7D01770B0F1DE720E44ABC3B /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5BD5D9B8F61C124A62C75D9AC36A07BD /* MJRefreshTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = F5338D394E610BCD3F8C72B229FB1A7F /* MJRefreshTrailer.m */; }; + 5DFCBADAC7D0FAC82C84A6C8E7BF1DA6 /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 52A5A70614325B9002E369D7B735C716 /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5FDC4239F7B651092BF582D0F460BAD4 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 71BA37E3DD83CB95CA0B8347B095F829 /* UIView+MJExtension.m */; }; + 61461B0D9D7B81C3F8D24066D9A19DCE /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = BD29D57952BA6E6CF04E3C2A45E8C616 /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69345CBCB31076EBF8A2C5885AF973AB /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EC4984D77C13565AB9A20E002F820B8 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69E353C99C6EEA3C93CCF2E526460B9D /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 569BD1C3159DE167886F2963AF89348E /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6DE6C7F0FA965828E4FCE687BF75FBBE /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = F4DFB7CBF31FD9C7711987D012F18593 /* MJRefreshAutoNormalFooter.m */; }; + 7902D28FC9EF5AFEB452F508C7F266B1 /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E126C7322D94BBD217EB1D1A973FDB9 /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7989A6E79BFA78440C39F568D972305C /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 511A44384A21156E702371258C38641A /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 80F3B2F81449FE093C334EACB25832F9 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 62CCE9A31EA86B6AA69227E0E25AC09D /* PrivacyInfo.xcprivacy */; }; + 81A5635CEA2AD9623E30CAE9AFC3BF65 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 57629F1D48C217EF6EBB75B1630298DC /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83A4F2816C1B3F072E1A26A34C3BC4AC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; + 85AB23275E9D19394969235E5DC2300E /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 50DFF895D10A3B267303D82E51B50E81 /* MJRefreshHeader.m */; }; + 8872BEB0954C0254A792469F4DBC9891 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B2EAA3B807B65EFEDA370EB765D6FC8 /* MJRefreshAutoStateFooter.m */; }; + 8AA66BD0572CCDC71153FEA95C7AB666 /* Pods-suixinkanTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */; }; 914AE43A691016D126083E13CFD8919F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; - 991C56154D625F2C902B960C2F8EA27F /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA1E1655DA5C4F62F66ADA15925A59E3 /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */; }; - FE0C74C01E8F98ADE1ECDE8206972D03 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; + 955B87902E039163281C4F47C95DB851 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = DA9B3B6A9284B28E0FC77B0BFC8486A4 /* MJRefreshBackNormalFooter.m */; }; + 9A7FB1E975A5955C896E6B195C521804 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = FFCE7657A94B976454ACDE4B4AAC05EC /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A078A275FFFA48D620074790DA3CA6CE /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 490B69B5C348D4367AF5F227FA482776 /* MJRefreshStateHeader.m */; }; + A1E44277704AD68E867FD7C955A6632D /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = B309EBEA8D93176A9924EEF9714CA1C0 /* MJRefreshBackGifFooter.m */; }; + A86CC1AFDFDD692DC4EE66F57C0F39E6 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 5545A81EF57444268EE3EA581C8CCECB /* UIScrollView+MJRefresh.m */; }; + B09F08548ACA8379445F6525011EE219 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7031EEC5F08BCA8AD8D81E1275787D67 /* MJRefreshBackStateFooter.m */; }; + B334090388C245FABE5077F228965657 /* Pods-suixinkan-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A60233C7119F0105DB6C68E30CCC216F /* Pods-suixinkan-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B7CC9AE896BFAB94775EAA25D7442422 /* Pods-suixinkan-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A6A3ABC34D5CA51948F7619021EEC414 /* Pods-suixinkan-dummy.m */; }; + BC2F9B1D6986FEB23B4FB1288B512538 /* MJRefreshNormalTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 97BAD9E47B49248B2119D1C3F6250FE7 /* MJRefreshNormalTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD30193C1E3D7B1F17B1B1F3F08BE655 /* UICollectionViewLayout+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4086AD383BE916A71549746D7E5B1F /* UICollectionViewLayout+MJRefresh.m */; }; + C60DB44F719853DE3B7157960DAF9270 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 033A496A62413DF226ADC1719939E4DC /* MJRefreshComponent.m */; }; + C7D17875E874285B6ACB1C9AE2BA5FFD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */; }; + D90607B4E56247B19B14462E487BA86E /* MJRefreshNormalTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 73013CAB4D167A786A6554B05F0AB2E1 /* MJRefreshNormalTrailer.m */; }; + D90DED0F5638B1C44F4B6C62D600D240 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 41654620E68E97EF25361CA3CA3EEE06 /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D90DF1376DF5E2EA644313BCD2E03058 /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8001677E7E32E68BEBCE0CFDEE3B84B6 /* MJRefresh.bundle */; }; + DE98ECCCA7106A4EA575EF34830D41FF /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1CF8E839440EBA2ED0ED264FE13D5827 /* MJRefresh-dummy.m */; }; + E1DE69F6BB6235A6EDB6C99A184BEDB4 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = AC399AE9AF1014D507A51FFA131483A4 /* UIScrollView+MJExtension.m */; }; + E5B057BC87284367918B2DB9CA084B4E /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 08BEFA5D20896D889C60B1BB73C348C4 /* MJRefreshAutoGifFooter.m */; }; + EC8E84A8FFADDCA562A8608D141D9027 /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = C32F77F7675473EFFE4AAA8D0E7965BF /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE6E8FE636D2C02E3D2FC1E8555B4612 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = CE08AE5F88748CDF0F1496822B015138 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3AECEF6D3BB919B3E7392942E1BC58B /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 281D756A5D80919F92DC593748BFF12D /* MJRefreshBackFooter.m */; }; + F60F90EAF35CFF40DF1C33557965787D /* MJRefreshStateTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2030C0A1678DD735DE5A068524C428D0 /* MJRefreshStateTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FEE883575278D5BE8F185437AB5DB3BB /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = C5294A108B71ADD7C9A4D6C3B5EEE037 /* MJRefreshGifHeader.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 09D400E62C865DFB3552C9FF55DFBF14 /* PBXContainerItemProxy */ = { + 07CE15427FBD194439F72813F1E79F5D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 1DE17B7C77CD95CB67DF1197965B76AB; - remoteInfo = "Pods-suixinkan"; + remoteGlobalIDString = 6868056D761E163D10FDAF8CF1C4D9B8; + remoteInfo = MJRefresh; }; - 10773E84BB082E09D8E276432A257D58 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C; - remoteInfo = "AMapLocation-NO-IDFA"; - }; - 2B4CA41C0FEC2F8A31D4426133DAE413 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - 47D4666849C29F0443F98043012741E4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - 589E9D53A0A18E62241CDC1546C39754 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - 70FAFD022EBDF3AF6FA6D56FD062BC00 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; - remoteInfo = "AMapFoundation-NO-IDFA"; - }; - 7F46567B2D4C2C2D6B168DB1D6C4B959 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B44FB02BD2D3FEAD1F36808AD405A543; - remoteInfo = "AMap3DMap-NO-IDFA"; - }; - AEBE04EE6A5B130F5ABA3ADAA7541F3D /* PBXContainerItemProxy */ = { + 0ED508B124853B684DDAEE58F0371D71 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 4F1379598302C9160590B3650C10E1A5; remoteInfo = "AMapSearch-NO-IDFA"; }; + 36D052FD95B687E1F36CEDFEEA13AFD6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; + 39E814A976E263DBFB8C20B560CA29E2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4BD4E22D3419D68A85BDD6119CB37C6C; + remoteInfo = "AMapLocation-NO-IDFA"; + }; + 58ACB14B669F8CD6C4362DD783E388FC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; + 5FF2C31B96AE85013B4BEBC8B641E3C6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; + 809D27ABC18E19451394228BE9D4AA86 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B26054DF1DEA11585A231AF6D1D80D5E; + remoteInfo = "MJRefresh-MJRefresh.Privacy"; + }; + A3A7B10AC9A70CD988084F9A0559EFEE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B44FB02BD2D3FEAD1F36808AD405A543; + remoteInfo = "AMap3DMap-NO-IDFA"; + }; + B93D696C9911155C9CFB043E22AF9B10 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1DE17B7C77CD95CB67DF1197965B76AB; + remoteInfo = "Pods-suixinkan"; + }; + E0B1E07063BAB873511674BF967B3596 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9B182CB4E1716E9070813D3C59736001; + remoteInfo = "AMapFoundation-NO-IDFA"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 02217EE365C32EE179ED6B3604311FA6 /* MAMapSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapSnapshot.h; path = MAMapKit.framework/Headers/MAMapSnapshot.h; sourceTree = ""; }; - 0249ED7AD58489423B69253BB3F68C77 /* AMap3DMap-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 03FD8F08A7E902C8304769A760AE03F8 /* MAPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolylineRenderer.h; path = MAMapKit.framework/Headers/MAPolylineRenderer.h; sourceTree = ""; }; - 0468C9EDD81C0FA55A1E114FD4F50888 /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; }; - 0560C72601DFB7648983A59E3A8630CF /* Pods-suixinkanTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-Info.plist"; sourceTree = ""; }; - 069E056FF5EF11FB955BE3C9637228BF /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; }; - 07893D47C6D034DEDA35BF43ECFA4F51 /* MALineDrawType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MALineDrawType.h; path = MAMapKit.framework/Headers/MALineDrawType.h; sourceTree = ""; }; - 0AF6857527573BF3900E9CE0D97AB4FB /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; }; - 0D5531D415C0B9769DB23D75594BE144 /* MAConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAConfig.h; path = MAMapKit.framework/Headers/MAConfig.h; sourceTree = ""; }; - 0ECDD3A14AC7808A63FC560ECEFCD281 /* AMapURLSearchConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchConfig.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h; sourceTree = ""; }; - 0ED959CB4F20C5C790E17D06A1B5C712 /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; }; - 12777F62398EA80224A2785DDEC3095A /* MATouchPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATouchPoi.h; path = MAMapKit.framework/Headers/MATouchPoi.h; sourceTree = ""; }; - 13A233A7815D5407B79718473F81E3B9 /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; }; - 179E8DCDE90BB09A93B5A20D14A2AF9F /* MAMapAccessibilityIdentifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapAccessibilityIdentifier.h; path = MAMapKit.framework/Headers/MAMapAccessibilityIdentifier.h; sourceTree = ""; }; - 17AAC989FB56464455A9E8ED437E4E8B /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; }; + 01003F931713782781BF6BB014711F27 /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; }; + 03388D61B1D3E062A4B713B0C5D98736 /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = ""; }; + 033A496A62413DF226ADC1719939E4DC /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = ""; }; + 06135C4E3D8CEE3E6B9606213747F3DD /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; }; + 067553896ECDDC64822E77C0793C8D83 /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; }; + 081A933139371B97D5ABFD37B065516E /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; }; + 08BEFA5D20896D889C60B1BB73C348C4 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = ""; }; + 0AD5AF59E9B5193792BD98D1FCF13958 /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; }; + 0B071FB150EB0F80F1B6DDAADB9F3EA1 /* MABaseOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseOverlay.h; path = MAMapKit.framework/Headers/MABaseOverlay.h; sourceTree = ""; }; + 141DFD00F58AA3D0128125F76718B57F /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = ""; }; + 15559E428759203AE92027639D25DDFB /* AMapSearchError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchError.h; path = AMapSearchKit.framework/Headers/AMapSearchError.h; sourceTree = ""; }; + 16C58D56065DD6020AE907F6CF2A03D3 /* MAGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlay.h; path = MAMapKit.framework/Headers/MAGroundOverlay.h; sourceTree = ""; }; + 1AAFE339FC8FD41F256F39D9921A0DF5 /* MARouteOverlayModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlayModel.h; path = MAMapKit.framework/Headers/MARouteOverlayModel.h; sourceTree = ""; }; + 1AB5B52027B67AC28237EBB53E108905 /* MJRefreshConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConfig.h; path = MJRefresh/MJRefreshConfig.h; sourceTree = ""; }; + 1B4385BFE0439C76FE32000A4D39E09E /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; }; 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkanTests"; path = Pods_suixinkanTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1C389829A9B7304C4C2F81E54D9281D4 /* AMapFoundation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 1DE51701473D3BA56631874E64FC3532 /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; }; - 1E50FFF4B5D963DD2E1C163D0947C39D /* AMapSearchError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchError.h; path = AMapSearchKit.framework/Headers/AMapSearchError.h; sourceTree = ""; }; - 1EA143C71ADA11765E3423D6CB84DFB1 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; }; - 1F1538E70E795808722BB28314B33572 /* MAGroundOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlayRenderer.h; path = MAMapKit.framework/Headers/MAGroundOverlayRenderer.h; sourceTree = ""; }; - 20C221C3FAE6488F4EDEED818C44CDD6 /* AMapSearch-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 21EABC2335DC8A3C9920D03EED819DFD /* AMapFoundation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 22F94D43169697717AD7FD93BCA5C0A5 /* MAMultiPointOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMultiPointOverlayRenderer.h; sourceTree = ""; }; - 25DA44E4FBED19BB0DF9F88A248F3F5E /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; }; - 27A965981C98B78C7BA5DBBACF3F5880 /* MAGeodesicPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeodesicPolyline.h; path = MAMapKit.framework/Headers/MAGeodesicPolyline.h; sourceTree = ""; }; - 28CB70E49423CA534786DD30DDCE03EE /* AMapSearchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapSearchKit.framework; sourceTree = ""; }; - 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.release.xcconfig"; sourceTree = ""; }; - 2EF2D2E9F471DCE665CE4D9D428E1C43 /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; }; - 3111A6CB446BBF0DFF881240B823AB8E /* MAOfflineCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineCity.h; path = MAMapKit.framework/Headers/MAOfflineCity.h; sourceTree = ""; }; - 36F27DFF7FB3BD0B40B252FB6DE17AA4 /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; }; - 37B4827DA9827B3D0B8EC89F522F92B3 /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; }; + 1B930FD4BB265C9B832C63EB6C18A244 /* MAAnimatedAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnimatedAnnotation.h; path = MAMapKit.framework/Headers/MAAnimatedAnnotation.h; sourceTree = ""; }; + 1BDF995E8D7341F565EA215194660CC7 /* MACustomBuildingOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlayRenderer.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlayRenderer.h; sourceTree = ""; }; + 1CF8E839440EBA2ED0ED264FE13D5827 /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = ""; }; + 1D1227D5C439B4A7C6B3CA5B94B6BFE5 /* MJRefresh.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.release.xcconfig; sourceTree = ""; }; + 2030C0A1678DD735DE5A068524C428D0 /* MJRefreshStateTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h; sourceTree = ""; }; + 21397BCD20ECAE0D5DC45E00B1022122 /* Pods-suixinkan-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkan-acknowledgements.markdown"; sourceTree = ""; }; + 2397BECB688E68175A59B667612A8332 /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; }; + 26EA4A1E2F6B0470D7EB7BA9B9874EFE /* MAGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeometry.h; path = MAMapKit.framework/Headers/MAGeometry.h; sourceTree = ""; }; + 2796E91E96174551DBC623E1561F2FFB /* MALineDrawType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MALineDrawType.h; path = MAMapKit.framework/Headers/MALineDrawType.h; sourceTree = ""; }; + 281D756A5D80919F92DC593748BFF12D /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; }; + 2A4086AD383BE916A71549746D7E5B1F /* UICollectionViewLayout+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewLayout+MJRefresh.m"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.m"; sourceTree = ""; }; + 2B58225B825CAD86A961027F68A2994E /* MJRefresh.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.debug.xcconfig; sourceTree = ""; }; + 2B656CB39B267965926C558095D6C5B7 /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 2C3764593873EDDAF8A086E39CA140D4 /* AMapFoundationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationKit.h; path = AMapFoundationKit.framework/Headers/AMapFoundationKit.h; sourceTree = ""; }; + 2C6D3B24B71E8DF66D8D5573228AC038 /* MAMultiPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPolyline.h; path = MAMapKit.framework/Headers/MAMultiPolyline.h; sourceTree = ""; }; + 2C923D199287338D8EF1835690839E9F /* MAMultiColoredPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiColoredPolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiColoredPolylineRenderer.h; sourceTree = ""; }; + 2FAEF46266BFEDD00FC91317EE4C609D /* AMapSearchObjV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObjV1.h; path = AMapSearchKit.framework/Headers/AMapSearchObjV1.h; sourceTree = ""; }; + 303814ECB7988A2E7E6C6C1609D73152 /* AMapURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearch.h; path = AMapFoundationKit.framework/Headers/AMapURLSearch.h; sourceTree = ""; }; + 30521482B763363B7C1BB8B78D626408 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = ""; }; + 3083A912594497E0C9586F53618F7E30 /* MAPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolylineRenderer.h; path = MAMapKit.framework/Headers/MAPolylineRenderer.h; sourceTree = ""; }; + 315F56C3CD0C71F1987D696DA36F06AB /* MAArc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArc.h; path = MAMapKit.framework/Headers/MAArc.h; sourceTree = ""; }; + 3173CBEC8CF7AA8EA006088941718CD5 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; }; + 32FC09D68AB0CA94C02B873431DAA4D8 /* AMapLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationManager.h; path = AMapLocationKit.framework/Headers/AMapLocationManager.h; sourceTree = ""; }; + 356236C33AC42A97A769B6475FC06B82 /* MAMapSnapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapSnapshot.h; path = MAMapKit.framework/Headers/MAMapSnapshot.h; sourceTree = ""; }; + 35E8DA384C088C15B439F26F0A3305FD /* MAPoiFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPoiFilter.h; path = MAMapKit.framework/Headers/MAPoiFilter.h; sourceTree = ""; }; + 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkanTests-dummy.m"; sourceTree = ""; }; 384DDA2CB25005BD6479B5987C619DD4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 38C9B733D70D2C1018E98375FEBB4D3E /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 3957E91240141AA1172DDE08664C2FDE /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; }; - 39C67574DA3D6A9D1EBE4C33C2D924A0 /* MAOfflineProvince.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineProvince.h; path = MAMapKit.framework/Headers/MAOfflineProvince.h; sourceTree = ""; }; - 3C5E590F8C1AFE192720D4655625290C /* MAGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGeometry.h; path = MAMapKit.framework/Headers/MAGeometry.h; sourceTree = ""; }; - 3C987CC8FA3285C057154E3901A1B8C5 /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; }; - 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; }; - 406C62ACD9BC253DEFA23D034208C225 /* AMapNearbyUploadInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbyUploadInfo.h; path = AMapSearchKit.framework/Headers/AMapNearbyUploadInfo.h; sourceTree = ""; }; - 42B7C6D97C0A1D4EE779539A5BDC279E /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; }; - 44674EC1944BB8CC20D1FB811A28DA3F /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; }; - 466460A7D8FB47BEE17DEECC7A31C289 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; }; - 479D2251F56CDCC803178FF0E21FD7B0 /* MAHeatMapTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapTileOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapTileOverlay.h; sourceTree = ""; }; - 4ADB0704B3E2D4A27F9D4A31AE7D5CF0 /* AMapSearch-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 4B15671E344E6FB2D7F1962533AF5BDF /* MABaseOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseOverlay.h; path = MAMapKit.framework/Headers/MABaseOverlay.h; sourceTree = ""; }; - 4C128DCFB0D3BD12C81266660101FEA5 /* MAPathShowRange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPathShowRange.h; path = MAMapKit.framework/Headers/MAPathShowRange.h; sourceTree = ""; }; - 50416CD761E5B67B024889A9055280A1 /* AMapLocation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; - 52C610AF7C0574F9ABF277E8E8FF9F4E /* AMapSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchVersion.h; path = AMapSearchKit.framework/Headers/AMapSearchVersion.h; sourceTree = ""; }; - 5A773D058BB5E3714D3BD8A1316F9CDF /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; }; + 38B439905141423BD2DADBBD5EFC72DE /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; }; + 393F7B38F425E6CC96A1B00592D6DA75 /* MAMapView+Resource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MAMapView+Resource.h"; path = "MAMapKit.framework/Headers/MAMapView+Resource.h"; sourceTree = ""; }; + 3A00DF16F62C279F4A81744AB2C8C5AE /* MATileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlayRenderer.h; path = MAMapKit.framework/Headers/MATileOverlayRenderer.h; sourceTree = ""; }; + 3C78972F4554CA8A9FDD2AA929AC5499 /* MAOfflineProvince.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineProvince.h; path = MAMapKit.framework/Headers/MAOfflineProvince.h; sourceTree = ""; }; + 3D96367E47A366B71AE236D5B0453C6E /* MACircleRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircleRenderer.h; path = MAMapKit.framework/Headers/MACircleRenderer.h; sourceTree = ""; }; + 3FE5CE5609C08A51C59D0BC7714A4D47 /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = ""; }; + 407917BF4692971CEABC71A5FD299787 /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; }; + 41654620E68E97EF25361CA3CA3EEE06 /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = ""; }; + 41912F06D7E7D5A38C37B6E577D9D059 /* Pods-suixinkan-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-frameworks.sh"; sourceTree = ""; }; + 41B423EED53D5FCECC2E3EBDE3C439A1 /* MJRefreshStateTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m; sourceTree = ""; }; + 434092C132A5B63621FAD580FF82D0A7 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = ""; }; + 479F7170D4A47A740EF8675398E5EA41 /* MABaseEngineOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseEngineOverlay.h; path = MAMapKit.framework/Headers/MABaseEngineOverlay.h; sourceTree = ""; }; + 47C9D7D67F0E2980F8FEA947D9E74227 /* UICollectionViewLayout+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewLayout+MJRefresh.h"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.h"; sourceTree = ""; }; + 490B69B5C348D4367AF5F227FA482776 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = ""; }; + 49B5D8DD1CCE793F9D5113114AD2A582 /* MJRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJRefresh.modulemap; sourceTree = ""; }; + 4B59D66E4C28F170072DE77A083824F7 /* MATraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceManager.h; path = MAMapKit.framework/Headers/MATraceManager.h; sourceTree = ""; }; + 4C4FD00BE1123C185F07C1FDA9F1ECC2 /* AMapSearchKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapSearchKit.framework; sourceTree = ""; }; + 4D85A34EC836480372B49DC09BB227EF /* MAMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapView.h; path = MAMapKit.framework/Headers/MAMapView.h; sourceTree = ""; }; + 4DB584A3F93E4FCCDEB06503D0A75616 /* MARouteOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlay.h; path = MAMapKit.framework/Headers/MARouteOverlay.h; sourceTree = ""; }; + 4E6C7D52A6CCCE379049FE947967F441 /* MAHeatMapVectorOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlay.h; sourceTree = ""; }; + 4E888C9D7D01770B0F1DE720E44ABC3B /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; }; + 4F00A70EF77AE057B5D3231D134DDBD2 /* MAUserLocationRepresentation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocationRepresentation.h; path = MAMapKit.framework/Headers/MAUserLocationRepresentation.h; sourceTree = ""; }; + 507A47DAAD6358EECFC2286E971C215E /* MAParticleOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlay.h; path = MAMapKit.framework/Headers/MAParticleOverlay.h; sourceTree = ""; }; + 50DFF895D10A3B267303D82E51B50E81 /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = ""; }; + 511A44384A21156E702371258C38641A /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = ""; }; + 5164D4BBB00D3D7BB82D96A381D2A5C1 /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; }; + 51D0131A45D4EF399ED696EC0E432F17 /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; }; + 52A5A70614325B9002E369D7B735C716 /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = ""; }; + 547E2BB070A41800DA8456A17F7D43D8 /* AMapNearbyUploadInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbyUploadInfo.h; path = AMapSearchKit.framework/Headers/AMapNearbyUploadInfo.h; sourceTree = ""; }; + 5545A81EF57444268EE3EA581C8CCECB /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = ""; }; + 55E496B24E5804D652EE6D1800A07B03 /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; }; + 569BD1C3159DE167886F2963AF89348E /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = ""; }; + 56A7C668AF522770DA05AA61967EB8A3 /* MATraceLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceLocation.h; path = MAMapKit.framework/Headers/MATraceLocation.h; sourceTree = ""; }; + 57629F1D48C217EF6EBB75B1630298DC /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = ""; }; + 5A5D1BE1351215B2227904B08017BC18 /* Pods-suixinkanTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkanTests.modulemap"; sourceTree = ""; }; + 5A9885F9ACFB8863730F6BFF6BB3ED6F /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; }; + 5B6FE1BE92D481044CBF344D181F4EBF /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapLocationKit.framework; sourceTree = ""; }; 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-suixinkan"; path = Pods_suixinkan.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5C9770B675559EB4331810063B73DDC1 /* AMapLocation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; - 5E7675B734E1C6CDF8668372E8F3B84F /* MAOfflineItemNationWide.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemNationWide.h; path = MAMapKit.framework/Headers/MAOfflineItemNationWide.h; sourceTree = ""; }; - 5EB6A65D560051402A68177B80171225 /* MATraceLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATraceLocation.h; path = MAMapKit.framework/Headers/MATraceLocation.h; sourceTree = ""; }; - 60B893CFB4A7C6AD794D9DEE5E9B7547 /* MAParticleOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayRenderer.h; path = MAMapKit.framework/Headers/MAParticleOverlayRenderer.h; sourceTree = ""; }; - 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.debug.xcconfig"; sourceTree = ""; }; - 6489417A165C730B226E5B1D804A9408 /* MAMVTTileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMVTTileOverlayRenderer.h; sourceTree = ""; }; - 64D4B407D067F530EFA572719A87A0CA /* MACircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircle.h; path = MAMapKit.framework/Headers/MACircle.h; sourceTree = ""; }; - 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkanTests-umbrella.h"; sourceTree = ""; }; - 668A9B1E2D7B1954AE52ABE25041CC36 /* Pods-suixinkanTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-suixinkanTests-acknowledgements.markdown"; sourceTree = ""; }; - 670523F1C5175EE89771DB428EBEC517 /* MAMapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MAMapKit.framework; sourceTree = ""; }; - 670E3E43B240B76E406CCCF1D80A5EBF /* MATileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlayRenderer.h; path = MAMapKit.framework/Headers/MATileOverlayRenderer.h; sourceTree = ""; }; - 6913B853941612CA8D01D460A848A478 /* MAHeatMapVectorGridOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlayRenderer.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlayRenderer.h; sourceTree = ""; }; - 6C13C8B921EDBEA42CC647D7F97802BC /* MAUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocation.h; path = MAMapKit.framework/Headers/MAUserLocation.h; sourceTree = ""; }; - 6E0300C9BA0A8C17B614ED5BD96E3E99 /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; }; - 73F6CF8DCA15A7BB80B9BAC94CC46FA8 /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; }; - 79268FE9EDB48B09520AC8C51659656C /* MACustomBuildingOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlayRenderer.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlayRenderer.h; sourceTree = ""; }; - 7E8E07244D480795D3A2A96BD4F4C7E6 /* MAOfflineMapViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMapViewController.h; path = MAMapKit.framework/Headers/MAOfflineMapViewController.h; sourceTree = ""; }; - 8492A7C1AEEA886EA3D51FE5804428A4 /* AMapServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapServices.h; path = AMapFoundationKit.framework/Headers/AMapServices.h; sourceTree = ""; }; - 8954141270608938A38FD68585BFD293 /* Pods-suixinkanTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkanTests.modulemap"; sourceTree = ""; }; - 8B129C7071E638EF8F02A4B3D4DF59EE /* MAUserLocationRepresentation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocationRepresentation.h; path = MAMapKit.framework/Headers/MAUserLocationRepresentation.h; sourceTree = ""; }; - 8C64DEFEB1E7F2C66D9E36F704EB2EDA /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; }; - 930BB613D93B3F0743FE520201572148 /* Pods-suixinkanTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-acknowledgements.plist"; sourceTree = ""; }; - 94BA5B784A95AB959379147117CC2C89 /* MACustomBuildingOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlay.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlay.h; sourceTree = ""; }; - 94F4710F53F0DD7E15BC1E7AA10A2614 /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; }; - 950D600CC053C2715B97DE0CAB30A00C /* MAAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationView.h; path = MAMapKit.framework/Headers/MAAnnotationView.h; sourceTree = ""; }; - 96166C2870775C1FA5506C14594664B3 /* MAOfflineItemCommonCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemCommonCity.h; path = MAMapKit.framework/Headers/MAOfflineItemCommonCity.h; sourceTree = ""; }; - 96AB96D3D117AC51019E2BF9D4826F59 /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; }; - 99C67F83F400D9D89A9FA05B76CFD549 /* AMapURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearch.h; path = AMapFoundationKit.framework/Headers/AMapURLSearch.h; sourceTree = ""; }; - 9D86A178B3EBE1CD7076C6FFA26B5BAC /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; }; + 5CDE8C259BC065E1B0439447B1252C99 /* MACustomCalloutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomCalloutView.h; path = MAMapKit.framework/Headers/MACustomCalloutView.h; sourceTree = ""; }; + 5FC2B9CB24015B1A4E7E51F2A8BF4648 /* MAPathShowRange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPathShowRange.h; path = MAMapKit.framework/Headers/MAPathShowRange.h; sourceTree = ""; }; + 62CCE9A31EA86B6AA69227E0E25AC09D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = MJRefresh/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 641C5C6A474E625CE9316589E2270E66 /* AMapSearchObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObj.h; path = AMapSearchKit.framework/Headers/AMapSearchObj.h; sourceTree = ""; }; + 655C7084A60741488C18B8F24B3D97B8 /* MJRefreshConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConfig.m; path = MJRefresh/MJRefreshConfig.m; sourceTree = ""; }; + 660335F9EEB1C0586BB756A9BB4E574C /* MAHeatMapTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapTileOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapTileOverlay.h; sourceTree = ""; }; + 66FC53FBC5F1CA4B85240B8EE1F77251 /* AMap3DMap-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + 67B7CB4CBC7DAA9DD71077F5EA8A0F03 /* AMapFoundation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + 6B2EAA3B807B65EFEDA370EB765D6FC8 /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = ""; }; + 6B40BC31A39D7D0DF7A22952A74B6D06 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = ""; }; + 6C70E88A48758B567F7C05DDD607C8A6 /* AMapFoundation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapFoundation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 7031EEC5F08BCA8AD8D81E1275787D67 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; }; + 71BA37E3DD83CB95CA0B8347B095F829 /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = ""; }; + 72B5AE3C704A7632DFBFA60F5FCDDBE3 /* AMapLocation-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + 73013CAB4D167A786A6554B05F0AB2E1 /* MJRefreshNormalTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m; sourceTree = ""; }; + 77944CCFDFCB2C611A128B13E8A1AFE7 /* MATileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlay.h; path = MAMapKit.framework/Headers/MATileOverlay.h; sourceTree = ""; }; + 7970E185DCA1CE6D331C00CC66BFEAA3 /* Pods-suixinkan-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-acknowledgements.plist"; sourceTree = ""; }; + 7BC41D8CF2124391F34BE554B973219E /* AMapLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationVersion.h; path = AMapLocationKit.framework/Headers/AMapLocationVersion.h; sourceTree = ""; }; + 7D3A386905C9A65EC03587267B90AD4D /* MAOfflineMapViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMapViewController.h; path = MAMapKit.framework/Headers/MAOfflineMapViewController.h; sourceTree = ""; }; + 7D7B92668EB5A4C1D209F11543FC199F /* AMap3DMap-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMap3DMap-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + 7E3097CFEFDA621E9FB0E62009FF87FC /* MJRefresh-MJRefresh.Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "MJRefresh-MJRefresh.Privacy"; path = MJRefresh.Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + 7EBD886580089648C95FA50BFA2EC4A6 /* MAHeatMapVectorGridOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlayRenderer.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlayRenderer.h; sourceTree = ""; }; + 8001677E7E32E68BEBCE0CFDEE3B84B6 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = ""; }; + 81F4CE7454717F18CAE0AA9E7388A89E /* MAOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlay.h; path = MAMapKit.framework/Headers/MAOverlay.h; sourceTree = ""; }; + 861606D816E41ABB6A9A6A7836702762 /* MAMultiPointOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMultiPointOverlayRenderer.h; sourceTree = ""; }; + 86EACB751BE0EBD6077C386440B17A17 /* MAMultiPointOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlay.h; path = MAMapKit.framework/Headers/MAMultiPointOverlay.h; sourceTree = ""; }; + 878559C369557711FEBFC84F446C3CA0 /* MAOverlayPathRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayPathRenderer.h; path = MAMapKit.framework/Headers/MAOverlayPathRenderer.h; sourceTree = ""; }; + 87E63847BD0EC765700A34191528E16A /* MAOfflineItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItem.h; path = MAMapKit.framework/Headers/MAOfflineItem.h; sourceTree = ""; }; + 8AD77551BBE324D957E93425CDDE1576 /* AMapFoundationConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationConst.h; path = AMapFoundationKit.framework/Headers/AMapFoundationConst.h; sourceTree = ""; }; + 8B04E1C6538D1C855BDAFD2C7F1CBCD1 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = ""; }; + 8B385062BA1E587F382CA327B6C2CB16 /* AMapURLSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchType.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchType.h; sourceTree = ""; }; + 8D878ED047D33FA3082CE6DB77514966 /* MJRefreshTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshTrailer.h; path = MJRefresh/Base/MJRefreshTrailer.h; sourceTree = ""; }; + 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkanTests-umbrella.h"; sourceTree = ""; }; + 8DC1D17AA22E3F30BEC1992D3A9C677B /* Pods-suixinkan.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-suixinkan.modulemap"; sourceTree = ""; }; + 8E126C7322D94BBD217EB1D1A973FDB9 /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = ""; }; + 8FC3A0B6583F5CDEAF30AD5131E7CD26 /* AMapNearbySearchManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapNearbySearchManager.h; path = AMapSearchKit.framework/Headers/AMapNearbySearchManager.h; sourceTree = ""; }; + 925902FC9C669D9561854D1667C48580 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = ""; }; + 9372BF76413CBE841868C3B9BED51F6B /* AMapGeoFenceRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceRegionObj.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceRegionObj.h; sourceTree = ""; }; + 950F5DF4CC9F1990F496C1FA1B51A3EB /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = ""; }; + 9561EF743B1F673632A5C742351AF9B1 /* ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; sourceTree = ""; }; + 964E9456908063A8BBBA753D2ABF534E /* MAAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotation.h; path = MAMapKit.framework/Headers/MAAnnotation.h; sourceTree = ""; }; + 97BAD9E47B49248B2119D1C3F6250FE7 /* MJRefreshNormalTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h; sourceTree = ""; }; + 97BDCFDBC64995B29C6C0E469BF8B9DB /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; }; + 981AA3A188835E8705A105A86799212E /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = ""; }; + 995A1FE995BF8A3BB47436F3D05C8251 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = ""; }; + 9C2BAC00F0740CF525DB7CAC5EA73C62 /* MAMapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = MAMapKit.framework; sourceTree = ""; }; + 9D251D37879678420C2E21DB2DA7CDD1 /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9EABEC92964633D02091EEB81DAC2A28 /* Pods-suixinkan-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-resources.sh"; sourceTree = ""; }; - A1505B28F867C60BE3D9A63585CE1479 /* MAMultiColoredPolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiColoredPolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiColoredPolylineRenderer.h; sourceTree = ""; }; - A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.release.xcconfig"; sourceTree = ""; }; - A6E2E98A47908F30D4B4EE96DE85B3BF /* MAMultiPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPolyline.h; path = MAMapKit.framework/Headers/MAMultiPolyline.h; sourceTree = ""; }; - A823DCD9CB1E9FA604904B2963387CB2 /* AMapLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationVersion.h; path = AMapLocationKit.framework/Headers/AMapLocationVersion.h; sourceTree = ""; }; - AACDB0C84FA62EBA5CD006122428E894 /* MAParticleOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlay.h; path = MAMapKit.framework/Headers/MAParticleOverlay.h; sourceTree = ""; }; - ADFEE7DB708FDF6C57C1799A67FF465E /* AMapSearchAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchAPI.h; path = AMapSearchKit.framework/Headers/AMapSearchAPI.h; sourceTree = ""; }; - AE998C161FD292A69FA3480332FE8E94 /* MAIndoorInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAIndoorInfo.h; path = MAMapKit.framework/Headers/MAIndoorInfo.h; sourceTree = ""; }; - B06D674932EE56F5658143A81D819C4E /* MAHeatMapVectorOverlayRender.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlayRender.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlayRender.h; sourceTree = ""; }; - B40D257CE33940958FDB368C92634D45 /* MAOfflineItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItem.h; path = MAMapKit.framework/Headers/MAOfflineItem.h; sourceTree = ""; }; - B5A81E7F9BCF713C6B40924387EF7A25 /* MAPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPointAnnotation.h; path = MAMapKit.framework/Headers/MAPointAnnotation.h; sourceTree = ""; }; - B7401B852E9ED119C83E93DE45E06560 /* AMapSearchObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObj.h; path = AMapSearchKit.framework/Headers/AMapSearchObj.h; sourceTree = ""; }; - B890308220586EABC27EA0E6CFC1DFD2 /* AMapURLSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchType.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchType.h; sourceTree = ""; }; - BAD44B63C8224A9B7695A6588497FE42 /* MAMultiPointOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPointOverlay.h; path = MAMapKit.framework/Headers/MAMultiPointOverlay.h; sourceTree = ""; }; - BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkanTests-dummy.m"; sourceTree = ""; }; - BD0ECDCE9B3838DE3652729396548862 /* MATileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATileOverlay.h; path = MAMapKit.framework/Headers/MATileOverlay.h; sourceTree = ""; }; - BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkan-dummy.m"; sourceTree = ""; }; - BF5B01EA8038304B63E8140D0E4CEC6E /* MARouteOverlayModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlayModel.h; path = MAMapKit.framework/Headers/MARouteOverlayModel.h; sourceTree = ""; }; - C2E13C3E887C09076D7A7C1A9909F130 /* MAPinAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPinAnnotationView.h; path = MAMapKit.framework/Headers/MAPinAnnotationView.h; sourceTree = ""; }; - CA74F811F64E6F8E4EAE1DF86A23AC55 /* AMapSearchObjV1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchObjV1.h; path = AMapSearchKit.framework/Headers/AMapSearchObjV1.h; sourceTree = ""; }; - CB890D7ECF0331820F5D5B21DA943E35 /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; }; - CD9CA392D76E4DD502C6408386883A69 /* AMapFoundationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationVersion.h; path = AMapFoundationKit.framework/Headers/AMapFoundationVersion.h; sourceTree = ""; }; - CDDE621D2E71DF0D01E579E60EBEACC0 /* AMapLocationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationManager.h; path = AMapLocationKit.framework/Headers/AMapLocationManager.h; sourceTree = ""; }; - CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkan-umbrella.h"; sourceTree = ""; }; - D0CE0BC52229780EEEDAF90A0ECB322E /* AMapGeoFenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceManager.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceManager.h; sourceTree = ""; }; - D1817476C572138439BB2E13E8C45096 /* MAAnnotationMoveAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationMoveAnimation.h; path = MAMapKit.framework/Headers/MAAnnotationMoveAnimation.h; sourceTree = ""; }; - D1C1468F3C5D7069B2AEE5D4CB1FC20A /* MAMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapVersion.h; path = MAMapKit.framework/Headers/MAMapVersion.h; sourceTree = ""; }; - D49628F6F87CD3F4A82F10BBA92C44A3 /* Pods-suixinkan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-Info.plist"; sourceTree = ""; }; - D6116CC1F5E44C61DB36552FC8391D07 /* MABaseEngineOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MABaseEngineOverlay.h; path = MAMapKit.framework/Headers/MABaseEngineOverlay.h; sourceTree = ""; }; - D6E22522A6BBAC1BB10D1D328E2B4D78 /* MAMVTTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlay.h; path = MAMapKit.framework/Headers/MAMVTTileOverlay.h; sourceTree = ""; }; - D713759A92D8BCC29CD7DC3CFD289395 /* MAPoiFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPoiFilter.h; path = MAMapKit.framework/Headers/MAPoiFilter.h; sourceTree = ""; }; - D7AECDC4049F1B7A0627C5CBE9EEB801 /* MAHeatMapVectorOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorOverlay.h; sourceTree = ""; }; - D8FF9D3CA86B49A09EB91B1D8BB3B2E6 /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; }; - DC6E025679FD5E5AA0ECAC4882CC6A4B /* MAMapKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapKit.h; path = MAMapKit.framework/Headers/MAMapKit.h; sourceTree = ""; }; - DD864541CD57A8A888316FAC4E5D07D9 /* AMapLocationRegionObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationRegionObj.h; path = AMapLocationKit.framework/Headers/AMapLocationRegionObj.h; sourceTree = ""; }; - DDC40C79056DF949D26DF6A7E6B6B2B0 /* MAPolygonRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygonRenderer.h; path = MAMapKit.framework/Headers/MAPolygonRenderer.h; sourceTree = ""; }; - E671EF7D12D06CC20EE69DD9DB2529F5 /* MAPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolygon.h; path = MAMapKit.framework/Headers/MAPolygon.h; sourceTree = ""; }; - E6A86446AD4439F02315529F70367138 /* MAOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlay.h; path = MAMapKit.framework/Headers/MAOverlay.h; sourceTree = ""; }; - E93BF19421F945A744EC8B82704CD713 /* MAPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolyline.h; path = MAMapKit.framework/Headers/MAPolyline.h; sourceTree = ""; }; - E97596E60F23912E556FFE9431FEFF16 /* MAOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMap.h; path = MAMapKit.framework/Headers/MAOfflineMap.h; sourceTree = ""; }; - EA2992EF84EEFF605B81D7CEBE1207FF /* MAOfflineItemMunicipality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemMunicipality.h; path = MAMapKit.framework/Headers/MAOfflineItemMunicipality.h; sourceTree = ""; }; - EAEB80D667FF0829CAB9E80A2C05B388 /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; }; - EC4822E11358118DBE26CAC71CE026AC /* AMapLocationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapLocationKit.framework; sourceTree = ""; }; - EC9CB2A859C74253A5649F90F3AD668D /* MARouteOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MARouteOverlay.h; path = MAMapKit.framework/Headers/MARouteOverlay.h; sourceTree = ""; }; - F0BE2E0E4D233B2CAF830194D40CBD6C /* MAMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapStatus.h; path = MAMapKit.framework/Headers/MAMapStatus.h; sourceTree = ""; }; - F0C1BB90FB493C30623689797FC95F72 /* MAGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlay.h; path = MAMapKit.framework/Headers/MAGroundOverlay.h; sourceTree = ""; }; - F0EFD4A4C0F35A4984D086732BC38199 /* AMapLocationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationKit.h; path = AMapLocationKit.framework/Headers/AMapLocationKit.h; sourceTree = ""; }; - F1B8AC0FA0AFA598092BC556A736982F /* MAOverlayPathRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayPathRenderer.h; path = MAMapKit.framework/Headers/MAOverlayPathRenderer.h; sourceTree = ""; }; - F2A22B8C07490BCAE6D234EBD6D65496 /* MACustomCalloutView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomCalloutView.h; path = MAMapKit.framework/Headers/MACustomCalloutView.h; sourceTree = ""; }; - F89BFD8BE9C6DD26936552EE2B1A9507 /* MAAnimatedAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnimatedAnnotation.h; path = MAMapKit.framework/Headers/MAAnimatedAnnotation.h; sourceTree = ""; }; - FAF21049EDA17C2F8A5D890B2C1322FD /* AMapFoundationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapFoundationKit.h; path = AMapFoundationKit.framework/Headers/AMapFoundationKit.h; sourceTree = ""; }; - FD7E4B4F0EC7855FB40B09A2B2D53F92 /* MAHeatMapVectorGridOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlay.h; sourceTree = ""; }; - FFAEB0B8447466ACC4348084500EA7D1 /* MACircleRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircleRenderer.h; path = MAMapKit.framework/Headers/MACircleRenderer.h; sourceTree = ""; }; + 9EC4984D77C13565AB9A20E002F820B8 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = ""; }; + 9EF1A7E1F21502AA06F7F4CCEF91B56B /* AMapURLSearchConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapURLSearchConfig.h; path = AMapFoundationKit.framework/Headers/AMapURLSearchConfig.h; sourceTree = ""; }; + A3F941D7C356098ED7D2C1D3A5A782BC /* AMapLocationKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationKit.h; path = AMapLocationKit.framework/Headers/AMapLocationKit.h; sourceTree = ""; }; + A60233C7119F0105DB6C68E30CCC216F /* Pods-suixinkan-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-suixinkan-umbrella.h"; sourceTree = ""; }; + A6A3ABC34D5CA51948F7619021EEC414 /* Pods-suixinkan-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-suixinkan-dummy.m"; sourceTree = ""; }; + A710CAAD66C0DF6B1581557EAEB364AA /* MATouchPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATouchPoi.h; path = MAMapKit.framework/Headers/MATouchPoi.h; sourceTree = ""; }; + AAC4B7F927E219B1DFD11E5CD917F77E /* AMapCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapCommonObj.h; path = AMapSearchKit.framework/Headers/AMapCommonObj.h; sourceTree = ""; }; + AC399AE9AF1014D507A51FFA131483A4 /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = ""; }; + B1D214337580B2356480AE6AB94F983C /* AMapSearchKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapSearchKit.h; path = AMapSearchKit.framework/Headers/AMapSearchKit.h; sourceTree = ""; }; + B2FC4BD3F2EC2A754F3E917878F6E7EC /* AMapLocationCommonObj.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapLocationCommonObj.h; path = AMapLocationKit.framework/Headers/AMapLocationCommonObj.h; sourceTree = ""; }; + B309EBEA8D93176A9924EEF9714CA1C0 /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = ""; }; + B3A9B2740ED243A88FDF2D9AE77E9392 /* Pods-suixinkan.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkan.debug.xcconfig"; sourceTree = ""; }; + B41C4C6184ED489566C98EDA260CB769 /* AMapFoundationKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AMapFoundationKit.framework; sourceTree = ""; }; + B6C71E0E3B4E9C295BC85DD03D06B5AC /* MAPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPolyline.h; path = MAMapKit.framework/Headers/MAPolyline.h; sourceTree = ""; }; + B709D9CBE52E177D36AA159362770E30 /* AMapGeoFenceError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceError.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceError.h; sourceTree = ""; }; + B78F5016096455E9A46839581544C77B /* MAMultiTexturePolylineRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiTexturePolylineRenderer.h; path = MAMapKit.framework/Headers/MAMultiTexturePolylineRenderer.h; sourceTree = ""; }; + B89D02337433B06608740E65EEE5FAC6 /* MAArcRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAArcRenderer.h; path = MAMapKit.framework/Headers/MAArcRenderer.h; sourceTree = ""; }; + B89ED17C01D05DECBE3EE6CFD0F850EB /* MAOfflineItemMunicipality.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemMunicipality.h; path = MAMapKit.framework/Headers/MAOfflineItemMunicipality.h; sourceTree = ""; }; + BBAE241099C81D8EFB2A062A04F43105 /* Pods-suixinkan-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkan-Info.plist"; sourceTree = ""; }; + BC9ECF596FB5165D98C0F8FC4FE48515 /* AMap.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = AMap.bundle; path = MAMapKit.framework/AMap.bundle; sourceTree = ""; }; + BD29D57952BA6E6CF04E3C2A45E8C616 /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = ""; }; + C0311C83C8A4F175A21D8A662EF13B87 /* Pods-suixinkanTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-suixinkanTests-Info.plist"; sourceTree = ""; }; + C0949D614712DD9900DB683D00EAF68F /* MAOfflineItemCommonCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineItemCommonCity.h; path = MAMapKit.framework/Headers/MAOfflineItemCommonCity.h; sourceTree = ""; }; + C2787645FE031C111F8157CCFA6615A4 /* MAMVTTileOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlay.h; path = MAMapKit.framework/Headers/MAMVTTileOverlay.h; sourceTree = ""; }; + C32F77F7675473EFFE4AAA8D0E7965BF /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = ""; }; + C5294A108B71ADD7C9A4D6C3B5EEE037 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = ""; }; + C63FC48F030AB76607C7C56F31AA58EC /* MAOfflineCity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineCity.h; path = MAMapKit.framework/Headers/MAOfflineCity.h; sourceTree = ""; }; + C7BD48AF75DEE87507967ACAEF174B33 /* MAConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAConfig.h; path = MAMapKit.framework/Headers/MAConfig.h; sourceTree = ""; }; + C98E7DE75AE0A21CFAB5A0646473431F /* AMapServices.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapServices.h; path = AMapFoundationKit.framework/Headers/AMapServices.h; sourceTree = ""; }; + CC03BA4946CDCB9CB09C6B21F6F4E42D /* MJRefresh-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MJRefresh-Info.plist"; sourceTree = ""; }; + CC0D7016D0CD4D0171B1E212F0124A8A /* MAMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapVersion.h; path = MAMapKit.framework/Headers/MAMapVersion.h; sourceTree = ""; }; + CE08AE5F88748CDF0F1496822B015138 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = ""; }; + CF1BCEA3522F8B11C1D48FCB2F13EE6E /* MAMapCustomStyleOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapCustomStyleOptions.h; path = MAMapKit.framework/Headers/MAMapCustomStyleOptions.h; sourceTree = ""; }; + CF9B73BD5A7EF49C515CE054315DBC4E /* Pods-suixinkanTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-suixinkanTests.debug.xcconfig"; sourceTree = ""; }; + D03AEB9827714C23A990AEDD1B44E00E /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = ""; }; + D0FE45307E1589134990F6D62D5D51D7 /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = ""; }; + D25CF9B9058EDB163B425FB48ADE017D /* AMapGeoFenceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapGeoFenceManager.h; path = AMapLocationKit.framework/Headers/AMapGeoFenceManager.h; sourceTree = ""; }; + D44CE51086ED6B496AC2823731959529 /* MAParticleOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayRenderer.h; path = MAMapKit.framework/Headers/MAParticleOverlayRenderer.h; sourceTree = ""; }; + D4C67360D01FD4030DFC9FA7B265964B /* MAGroundOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAGroundOverlayRenderer.h; path = MAMapKit.framework/Headers/MAGroundOverlayRenderer.h; sourceTree = ""; }; + D911B8DB93AFACCBF68114FC04A060E1 /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = ""; }; + DA9B3B6A9284B28E0FC77B0BFC8486A4 /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = ""; }; + DB458DF9FE4C818BDA198678A04781AF /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = ""; }; + DD757A3E6B7C18A13DC9B29F99CD9BED /* MACustomBuildingOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACustomBuildingOverlay.h; path = MAMapKit.framework/Headers/MACustomBuildingOverlay.h; sourceTree = ""; }; + DDBB82BD9D351997FD4929E7A2B6E25F /* MAMapAccessibilityIdentifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMapAccessibilityIdentifier.h; path = MAMapKit.framework/Headers/MAMapAccessibilityIdentifier.h; sourceTree = ""; }; + E0603419C7ED70271FCFAB161D6626C4 /* AMapSearch-NO-IDFA.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapSearch-NO-IDFA.release.xcconfig"; sourceTree = ""; }; + E24739B8C160151071234B9CB14E6F74 /* MAOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOverlayRenderer.h; path = MAMapKit.framework/Headers/MAOverlayRenderer.h; sourceTree = ""; }; + E38B574AE8D4235CEED222AA494F5B27 /* MAMVTTileOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMVTTileOverlayRenderer.h; path = MAMapKit.framework/Headers/MAMVTTileOverlayRenderer.h; sourceTree = ""; }; + E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJRefresh; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E9F04ADFC5DDC9481CE86CBF1CFBEC3B /* AMapLocation-NO-IDFA.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "AMapLocation-NO-IDFA.debug.xcconfig"; sourceTree = ""; }; + EB35D50C93B81507ABEAF0400F6409F7 /* MATerrainOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlay.h; path = MAMapKit.framework/Headers/MATerrainOverlay.h; sourceTree = ""; }; + ED423D7338F18C90E5B7A164ED98FC77 /* MAAnnotationMoveAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAAnnotationMoveAnimation.h; path = MAMapKit.framework/Headers/MAAnnotationMoveAnimation.h; sourceTree = ""; }; + F07E4AA3FC126251D1C103DA4A009663 /* MAOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAOfflineMap.h; path = MAMapKit.framework/Headers/MAOfflineMap.h; sourceTree = ""; }; + F10FEB9A91D6ACC8D51457FE6DAF9F79 /* MAUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAUserLocation.h; path = MAMapKit.framework/Headers/MAUserLocation.h; sourceTree = ""; }; + F1727CB2CB0DE18B0DCD9AA41866666D /* Pods-suixinkan-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-suixinkan-resources.sh"; sourceTree = ""; }; + F2B1FA2D6BC95A8F487B8587014D6F2C /* MAPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPointAnnotation.h; path = MAMapKit.framework/Headers/MAPointAnnotation.h; sourceTree = ""; }; + F3382EDA69E59A9E34944EBBD3D92753 /* MACircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MACircle.h; path = MAMapKit.framework/Headers/MACircle.h; sourceTree = ""; }; + F487C86481F172E7177E505BDEB7A3BB /* MAPinAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAPinAnnotationView.h; path = MAMapKit.framework/Headers/MAPinAnnotationView.h; sourceTree = ""; }; + F4DFB7CBF31FD9C7711987D012F18593 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; }; + F5338D394E610BCD3F8C72B229FB1A7F /* MJRefreshTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshTrailer.m; path = MJRefresh/Base/MJRefreshTrailer.m; sourceTree = ""; }; + F72A9BC98582AE44AB4225346E4882F1 /* MATerrainOverlayRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MATerrainOverlayRenderer.h; path = MAMapKit.framework/Headers/MATerrainOverlayRenderer.h; sourceTree = ""; }; + F73EBF0DB8CE31E9D2F94B878D6B673E /* MAShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAShape.h; path = MAMapKit.framework/Headers/MAShape.h; sourceTree = ""; }; + F8875F775103851947F9747E7152ECCE /* MAHeatMapVectorGridOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAHeatMapVectorGridOverlay.h; path = MAMapKit.framework/Headers/MAHeatMapVectorGridOverlay.h; sourceTree = ""; }; + F92F6571B0D9AF830EC38EC3D3FE21C6 /* MAIndoorInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAIndoorInfo.h; path = MAMapKit.framework/Headers/MAIndoorInfo.h; sourceTree = ""; }; + FABA86169032152A7B6FF54D106192AD /* AMapUtility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AMapUtility.h; path = AMapFoundationKit.framework/Headers/AMapUtility.h; sourceTree = ""; }; + FB82B73F335E8C0C366798262D7A17B6 /* MAParticleOverlayOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAParticleOverlayOptions.h; path = MAMapKit.framework/Headers/MAParticleOverlayOptions.h; sourceTree = ""; }; + FF643440CE0161152CE9F37F727738DF /* MAMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MAMultiPoint.h; path = MAMapKit.framework/Headers/MAMultiPoint.h; sourceTree = ""; }; + FFCE7657A94B976454ACDE4B4AAC05EC /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - F76C05B3CCA2152BC55E3D3995D922D9 /* Frameworks */ = { + 11690A588400BBB164423D5F86311C35 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 83A4F2816C1B3F072E1A26A34C3BC4AC /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5E0D0C50A7A873544D16A5F9C04AB995 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C7D17875E874285B6ACB1C9AE2BA5FFD /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 880E41AE438415E959603EC5884F97CB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FE0C74C01E8F98ADE1ECDE8206972D03 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -273,271 +419,326 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 136B3F60DD26735EE8FF544893CF6CA8 /* AMapLocation-NO-IDFA */ = { + 03B6E08AD4E00EDA816D86E493F33C0A /* Frameworks */ = { isa = PBXGroup; children = ( - 94F4710F53F0DD7E15BC1E7AA10A2614 /* AMapGeoFenceError.h */, - D0CE0BC52229780EEEDAF90A0ECB322E /* AMapGeoFenceManager.h */, - 2EF2D2E9F471DCE665CE4D9D428E1C43 /* AMapGeoFenceRegionObj.h */, - EAEB80D667FF0829CAB9E80A2C05B388 /* AMapLocationCommonObj.h */, - F0EFD4A4C0F35A4984D086732BC38199 /* AMapLocationKit.h */, - CDDE621D2E71DF0D01E579E60EBEACC0 /* AMapLocationManager.h */, - DD864541CD57A8A888316FAC4E5D07D9 /* AMapLocationRegionObj.h */, - A823DCD9CB1E9FA604904B2963387CB2 /* AMapLocationVersion.h */, - 8311A11FC14B9FA4BA1B0EFC4D05CACE /* Frameworks */, - 81C73A1D28B5BFA280DD9E341F4FE010 /* Support Files */, - ); - name = "AMapLocation-NO-IDFA"; - path = "AMapLocation-NO-IDFA"; - sourceTree = ""; - }; - 2650C708B244E6D36B6119EEE0BADFB6 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 466460A7D8FB47BEE17DEECC7A31C289 /* AMapFoundationKit.framework */, + 4C4FD00BE1123C185F07C1FDA9F1ECC2 /* AMapSearchKit.framework */, ); name = Frameworks; sourceTree = ""; }; - 32648DEF59B7C80AEA4FD4F4C56E28E2 /* Support Files */ = { + 06FC11260001589A2237273CF11C079C /* Pods-suixinkanTests */ = { isa = PBXGroup; children = ( - 4ADB0704B3E2D4A27F9D4A31AE7D5CF0 /* AMapSearch-NO-IDFA.debug.xcconfig */, - 20C221C3FAE6488F4EDEED818C44CDD6 /* AMapSearch-NO-IDFA.release.xcconfig */, + 5A5D1BE1351215B2227904B08017BC18 /* Pods-suixinkanTests.modulemap */, + 01003F931713782781BF6BB014711F27 /* Pods-suixinkanTests-acknowledgements.markdown */, + 3173CBEC8CF7AA8EA006088941718CD5 /* Pods-suixinkanTests-acknowledgements.plist */, + 37B17973B8B0E935D23A94470AB95C07 /* Pods-suixinkanTests-dummy.m */, + C0311C83C8A4F175A21D8A662EF13B87 /* Pods-suixinkanTests-Info.plist */, + 8DB9F697E059AD84BBE6DB6241D65A19 /* Pods-suixinkanTests-umbrella.h */, + CF9B73BD5A7EF49C515CE054315DBC4E /* Pods-suixinkanTests.debug.xcconfig */, + 38B439905141423BD2DADBBD5EFC72DE /* Pods-suixinkanTests.release.xcconfig */, + ); + name = "Pods-suixinkanTests"; + path = "Target Support Files/Pods-suixinkanTests"; + sourceTree = ""; + }; + 0F73EBD4BC325D7711C71AD1A412B7B5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9C2BAC00F0740CF525DB7CAC5EA73C62 /* MAMapKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 146B3F310D10D5B3AC61E0E2FBEBD5DE /* Support Files */ = { + isa = PBXGroup; + children = ( + 49B5D8DD1CCE793F9D5113114AD2A582 /* MJRefresh.modulemap */, + 1CF8E839440EBA2ED0ED264FE13D5827 /* MJRefresh-dummy.m */, + CC03BA4946CDCB9CB09C6B21F6F4E42D /* MJRefresh-Info.plist */, + 141DFD00F58AA3D0128125F76718B57F /* MJRefresh-prefix.pch */, + D911B8DB93AFACCBF68114FC04A060E1 /* MJRefresh-umbrella.h */, + 2B58225B825CAD86A961027F68A2994E /* MJRefresh.debug.xcconfig */, + 1D1227D5C439B4A7C6B3CA5B94B6BFE5 /* MJRefresh.release.xcconfig */, + 9561EF743B1F673632A5C742351AF9B1 /* ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/MJRefresh"; + sourceTree = ""; + }; + 18160A91BB2A19B0F666BE748D2F02B7 /* Support Files */ = { + isa = PBXGroup; + children = ( + 6C70E88A48758B567F7C05DDD607C8A6 /* AMapFoundation-NO-IDFA.debug.xcconfig */, + 67B7CB4CBC7DAA9DD71077F5EA8A0F03 /* AMapFoundation-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMapFoundation-NO-IDFA"; + sourceTree = ""; + }; + 33F808A5E11C924EC96AE95B4ABF9CEC /* Support Files */ = { + isa = PBXGroup; + children = ( + 2B656CB39B267965926C558095D6C5B7 /* AMapSearch-NO-IDFA.debug.xcconfig */, + E0603419C7ED70271FCFAB161D6626C4 /* AMapSearch-NO-IDFA.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AMapSearch-NO-IDFA"; sourceTree = ""; }; - 333CCAB4EE816E332FF9A81C63132950 /* AMap3DMap-NO-IDFA */ = { + 3C944850DB08702CECE42926BCAD04B7 /* Support Files */ = { isa = PBXGroup; children = ( - F89BFD8BE9C6DD26936552EE2B1A9507 /* MAAnimatedAnnotation.h */, - 37B4827DA9827B3D0B8EC89F522F92B3 /* MAAnnotation.h */, - D1817476C572138439BB2E13E8C45096 /* MAAnnotationMoveAnimation.h */, - 950D600CC053C2715B97DE0CAB30A00C /* MAAnnotationView.h */, - 0AF6857527573BF3900E9CE0D97AB4FB /* MAArc.h */, - 6E0300C9BA0A8C17B614ED5BD96E3E99 /* MAArcRenderer.h */, - D6116CC1F5E44C61DB36552FC8391D07 /* MABaseEngineOverlay.h */, - 4B15671E344E6FB2D7F1962533AF5BDF /* MABaseOverlay.h */, - 64D4B407D067F530EFA572719A87A0CA /* MACircle.h */, - FFAEB0B8447466ACC4348084500EA7D1 /* MACircleRenderer.h */, - 0D5531D415C0B9769DB23D75594BE144 /* MAConfig.h */, - 94BA5B784A95AB959379147117CC2C89 /* MACustomBuildingOverlay.h */, - 79268FE9EDB48B09520AC8C51659656C /* MACustomBuildingOverlayRenderer.h */, - F2A22B8C07490BCAE6D234EBD6D65496 /* MACustomCalloutView.h */, - 27A965981C98B78C7BA5DBBACF3F5880 /* MAGeodesicPolyline.h */, - 3C5E590F8C1AFE192720D4655625290C /* MAGeometry.h */, - F0C1BB90FB493C30623689797FC95F72 /* MAGroundOverlay.h */, - 1F1538E70E795808722BB28314B33572 /* MAGroundOverlayRenderer.h */, - 479D2251F56CDCC803178FF0E21FD7B0 /* MAHeatMapTileOverlay.h */, - FD7E4B4F0EC7855FB40B09A2B2D53F92 /* MAHeatMapVectorGridOverlay.h */, - 6913B853941612CA8D01D460A848A478 /* MAHeatMapVectorGridOverlayRenderer.h */, - D7AECDC4049F1B7A0627C5CBE9EEB801 /* MAHeatMapVectorOverlay.h */, - B06D674932EE56F5658143A81D819C4E /* MAHeatMapVectorOverlayRender.h */, - AE998C161FD292A69FA3480332FE8E94 /* MAIndoorInfo.h */, - 07893D47C6D034DEDA35BF43ECFA4F51 /* MALineDrawType.h */, - 179E8DCDE90BB09A93B5A20D14A2AF9F /* MAMapAccessibilityIdentifier.h */, - 9D86A178B3EBE1CD7076C6FFA26B5BAC /* MAMapCustomStyleOptions.h */, - DC6E025679FD5E5AA0ECAC4882CC6A4B /* MAMapKit.h */, - 02217EE365C32EE179ED6B3604311FA6 /* MAMapSnapshot.h */, - F0BE2E0E4D233B2CAF830194D40CBD6C /* MAMapStatus.h */, - D1C1468F3C5D7069B2AEE5D4CB1FC20A /* MAMapVersion.h */, - 42B7C6D97C0A1D4EE779539A5BDC279E /* MAMapView.h */, - 1DE51701473D3BA56631874E64FC3532 /* MAMapView+Resource.h */, - A1505B28F867C60BE3D9A63585CE1479 /* MAMultiColoredPolylineRenderer.h */, - D8FF9D3CA86B49A09EB91B1D8BB3B2E6 /* MAMultiPoint.h */, - BAD44B63C8224A9B7695A6588497FE42 /* MAMultiPointOverlay.h */, - 22F94D43169697717AD7FD93BCA5C0A5 /* MAMultiPointOverlayRenderer.h */, - A6E2E98A47908F30D4B4EE96DE85B3BF /* MAMultiPolyline.h */, - 3C987CC8FA3285C057154E3901A1B8C5 /* MAMultiTexturePolylineRenderer.h */, - D6E22522A6BBAC1BB10D1D328E2B4D78 /* MAMVTTileOverlay.h */, - 6489417A165C730B226E5B1D804A9408 /* MAMVTTileOverlayRenderer.h */, - 3111A6CB446BBF0DFF881240B823AB8E /* MAOfflineCity.h */, - B40D257CE33940958FDB368C92634D45 /* MAOfflineItem.h */, - 96166C2870775C1FA5506C14594664B3 /* MAOfflineItemCommonCity.h */, - EA2992EF84EEFF605B81D7CEBE1207FF /* MAOfflineItemMunicipality.h */, - 5E7675B734E1C6CDF8668372E8F3B84F /* MAOfflineItemNationWide.h */, - E97596E60F23912E556FFE9431FEFF16 /* MAOfflineMap.h */, - 7E8E07244D480795D3A2A96BD4F4C7E6 /* MAOfflineMapViewController.h */, - 39C67574DA3D6A9D1EBE4C33C2D924A0 /* MAOfflineProvince.h */, - E6A86446AD4439F02315529F70367138 /* MAOverlay.h */, - F1B8AC0FA0AFA598092BC556A736982F /* MAOverlayPathRenderer.h */, - 5A773D058BB5E3714D3BD8A1316F9CDF /* MAOverlayRenderer.h */, - AACDB0C84FA62EBA5CD006122428E894 /* MAParticleOverlay.h */, - 1EA143C71ADA11765E3423D6CB84DFB1 /* MAParticleOverlayOptions.h */, - 60B893CFB4A7C6AD794D9DEE5E9B7547 /* MAParticleOverlayRenderer.h */, - 4C128DCFB0D3BD12C81266660101FEA5 /* MAPathShowRange.h */, - C2E13C3E887C09076D7A7C1A9909F130 /* MAPinAnnotationView.h */, - D713759A92D8BCC29CD7DC3CFD289395 /* MAPoiFilter.h */, - B5A81E7F9BCF713C6B40924387EF7A25 /* MAPointAnnotation.h */, - E671EF7D12D06CC20EE69DD9DB2529F5 /* MAPolygon.h */, - DDC40C79056DF949D26DF6A7E6B6B2B0 /* MAPolygonRenderer.h */, - E93BF19421F945A744EC8B82704CD713 /* MAPolyline.h */, - 03FD8F08A7E902C8304769A760AE03F8 /* MAPolylineRenderer.h */, - EC9CB2A859C74253A5649F90F3AD668D /* MARouteOverlay.h */, - BF5B01EA8038304B63E8140D0E4CEC6E /* MARouteOverlayModel.h */, - 96AB96D3D117AC51019E2BF9D4826F59 /* MAShape.h */, - CB890D7ECF0331820F5D5B21DA943E35 /* MATerrainOverlay.h */, - 73F6CF8DCA15A7BB80B9BAC94CC46FA8 /* MATerrainOverlayRenderer.h */, - BD0ECDCE9B3838DE3652729396548862 /* MATileOverlay.h */, - 670E3E43B240B76E406CCCF1D80A5EBF /* MATileOverlayRenderer.h */, - 12777F62398EA80224A2785DDEC3095A /* MATouchPoi.h */, - 5EB6A65D560051402A68177B80171225 /* MATraceLocation.h */, - 25DA44E4FBED19BB0DF9F88A248F3F5E /* MATraceManager.h */, - 6C13C8B921EDBEA42CC647D7F97802BC /* MAUserLocation.h */, - 8B129C7071E638EF8F02A4B3D4DF59EE /* MAUserLocationRepresentation.h */, - B7F5668B4968CD3B17D09682FC4F2AD2 /* Frameworks */, - 3E59FADDAAB0D83D0E3D23C38A951972 /* Resources */, - 9650B393E613ED5BAD5D994B76CAE0C4 /* Support Files */, - ); - name = "AMap3DMap-NO-IDFA"; - path = "AMap3DMap-NO-IDFA"; - sourceTree = ""; - }; - 3E59FADDAAB0D83D0E3D23C38A951972 /* Resources */ = { - isa = PBXGroup; - children = ( - 17AAC989FB56464455A9E8ED437E4E8B /* AMap.bundle */, - ); - name = Resources; - sourceTree = ""; - }; - 43D527305AB3C89EF23F79682DBC3C06 /* AMapSearch-NO-IDFA */ = { - isa = PBXGroup; - children = ( - 0468C9EDD81C0FA55A1E114FD4F50888 /* AMapCommonObj.h */, - 3957E91240141AA1172DDE08664C2FDE /* AMapNearbySearchManager.h */, - 406C62ACD9BC253DEFA23D034208C225 /* AMapNearbyUploadInfo.h */, - ADFEE7DB708FDF6C57C1799A67FF465E /* AMapSearchAPI.h */, - 1E50FFF4B5D963DD2E1C163D0947C39D /* AMapSearchError.h */, - 36F27DFF7FB3BD0B40B252FB6DE17AA4 /* AMapSearchKit.h */, - B7401B852E9ED119C83E93DE45E06560 /* AMapSearchObj.h */, - CA74F811F64E6F8E4EAE1DF86A23AC55 /* AMapSearchObjV1.h */, - 52C610AF7C0574F9ABF277E8E8FF9F4E /* AMapSearchVersion.h */, - B88F4DE8D2512159EF3CD40044889B81 /* Frameworks */, - 32648DEF59B7C80AEA4FD4F4C56E28E2 /* Support Files */, - ); - name = "AMapSearch-NO-IDFA"; - path = "AMapSearch-NO-IDFA"; - sourceTree = ""; - }; - 51CE51AEB4DF6A4943765E55178C8CEF /* Pods */ = { - isa = PBXGroup; - children = ( - 333CCAB4EE816E332FF9A81C63132950 /* AMap3DMap-NO-IDFA */, - ADEE5CB6E1ED60AD1D58FE6AB3993F97 /* AMapFoundation-NO-IDFA */, - 136B3F60DD26735EE8FF544893CF6CA8 /* AMapLocation-NO-IDFA */, - 43D527305AB3C89EF23F79682DBC3C06 /* AMapSearch-NO-IDFA */, - ); - name = Pods; - sourceTree = ""; - }; - 81C73A1D28B5BFA280DD9E341F4FE010 /* Support Files */ = { - isa = PBXGroup; - children = ( - 50416CD761E5B67B024889A9055280A1 /* AMapLocation-NO-IDFA.debug.xcconfig */, - 5C9770B675559EB4331810063B73DDC1 /* AMapLocation-NO-IDFA.release.xcconfig */, + E9F04ADFC5DDC9481CE86CBF1CFBEC3B /* AMapLocation-NO-IDFA.debug.xcconfig */, + 72B5AE3C704A7632DFBFA60F5FCDDBE3 /* AMapLocation-NO-IDFA.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AMapLocation-NO-IDFA"; sourceTree = ""; }; - 8311A11FC14B9FA4BA1B0EFC4D05CACE /* Frameworks */ = { + 573E47C06AFD89DDCCD3A0BE08706B89 /* Resources */ = { isa = PBXGroup; children = ( - EC4822E11358118DBE26CAC71CE026AC /* AMapLocationKit.framework */, + BC9ECF596FB5165D98C0F8FC4FE48515 /* AMap.bundle */, ); - name = Frameworks; + name = Resources; sourceTree = ""; }; - 9650B393E613ED5BAD5D994B76CAE0C4 /* Support Files */ = { + 6AF4AB2CD95191F647218D6A24F8669C /* Pods-suixinkan */ = { isa = PBXGroup; children = ( - 38C9B733D70D2C1018E98375FEBB4D3E /* AMap3DMap-NO-IDFA.debug.xcconfig */, - 0249ED7AD58489423B69253BB3F68C77 /* AMap3DMap-NO-IDFA.release.xcconfig */, + 8DC1D17AA22E3F30BEC1992D3A9C677B /* Pods-suixinkan.modulemap */, + 21397BCD20ECAE0D5DC45E00B1022122 /* Pods-suixinkan-acknowledgements.markdown */, + 7970E185DCA1CE6D331C00CC66BFEAA3 /* Pods-suixinkan-acknowledgements.plist */, + A6A3ABC34D5CA51948F7619021EEC414 /* Pods-suixinkan-dummy.m */, + 41912F06D7E7D5A38C37B6E577D9D059 /* Pods-suixinkan-frameworks.sh */, + BBAE241099C81D8EFB2A062A04F43105 /* Pods-suixinkan-Info.plist */, + F1727CB2CB0DE18B0DCD9AA41866666D /* Pods-suixinkan-resources.sh */, + A60233C7119F0105DB6C68E30CCC216F /* Pods-suixinkan-umbrella.h */, + B3A9B2740ED243A88FDF2D9AE77E9392 /* Pods-suixinkan.debug.xcconfig */, + 081A933139371B97D5ABFD37B065516E /* Pods-suixinkan.release.xcconfig */, ); - name = "Support Files"; - path = "../Target Support Files/AMap3DMap-NO-IDFA"; + name = "Pods-suixinkan"; + path = "Target Support Files/Pods-suixinkan"; sourceTree = ""; }; - ADEE5CB6E1ED60AD1D58FE6AB3993F97 /* AMapFoundation-NO-IDFA */ = { + 6E26A8372F0B92FF1B0179EB270E4022 /* Resources */ = { isa = PBXGroup; children = ( - 13A233A7815D5407B79718473F81E3B9 /* AMapFoundationConst.h */, - FAF21049EDA17C2F8A5D890B2C1322FD /* AMapFoundationKit.h */, - CD9CA392D76E4DD502C6408386883A69 /* AMapFoundationVersion.h */, - 8492A7C1AEEA886EA3D51FE5804428A4 /* AMapServices.h */, - 99C67F83F400D9D89A9FA05B76CFD549 /* AMapURLSearch.h */, - 0ECDD3A14AC7808A63FC560ECEFCD281 /* AMapURLSearchConfig.h */, - B890308220586EABC27EA0E6CFC1DFD2 /* AMapURLSearchType.h */, - 0ED959CB4F20C5C790E17D06A1B5C712 /* AMapUtility.h */, - 2650C708B244E6D36B6119EEE0BADFB6 /* Frameworks */, - E210E6B5BC99E3497F97161C0D4897A8 /* Support Files */, + 8001677E7E32E68BEBCE0CFDEE3B84B6 /* MJRefresh.bundle */, + 62CCE9A31EA86B6AA69227E0E25AC09D /* PrivacyInfo.xcprivacy */, + ); + name = Resources; + sourceTree = ""; + }; + 7F3AD2B90B0B80C514A35486BB2A9FEA /* AMapLocation-NO-IDFA */ = { + isa = PBXGroup; + children = ( + B709D9CBE52E177D36AA159362770E30 /* AMapGeoFenceError.h */, + D25CF9B9058EDB163B425FB48ADE017D /* AMapGeoFenceManager.h */, + 9372BF76413CBE841868C3B9BED51F6B /* AMapGeoFenceRegionObj.h */, + B2FC4BD3F2EC2A754F3E917878F6E7EC /* AMapLocationCommonObj.h */, + A3F941D7C356098ED7D2C1D3A5A782BC /* AMapLocationKit.h */, + 32FC09D68AB0CA94C02B873431DAA4D8 /* AMapLocationManager.h */, + 06135C4E3D8CEE3E6B9606213747F3DD /* AMapLocationRegionObj.h */, + 7BC41D8CF2124391F34BE554B973219E /* AMapLocationVersion.h */, + C7AD15EDBDEAED2A18A0CE84F75C9F1D /* Frameworks */, + 3C944850DB08702CECE42926BCAD04B7 /* Support Files */, + ); + name = "AMapLocation-NO-IDFA"; + path = "AMapLocation-NO-IDFA"; + sourceTree = ""; + }; + 818ECC7C7775F8B414791FE64DDD61C2 /* MJRefresh */ = { + isa = PBXGroup; + children = ( + 511A44384A21156E702371258C38641A /* MJRefresh.h */, + 30521482B763363B7C1BB8B78D626408 /* MJRefreshAutoFooter.h */, + 995A1FE995BF8A3BB47436F3D05C8251 /* MJRefreshAutoFooter.m */, + C32F77F7675473EFFE4AAA8D0E7965BF /* MJRefreshAutoGifFooter.h */, + 08BEFA5D20896D889C60B1BB73C348C4 /* MJRefreshAutoGifFooter.m */, + 8E126C7322D94BBD217EB1D1A973FDB9 /* MJRefreshAutoNormalFooter.h */, + F4DFB7CBF31FD9C7711987D012F18593 /* MJRefreshAutoNormalFooter.m */, + 4E888C9D7D01770B0F1DE720E44ABC3B /* MJRefreshAutoStateFooter.h */, + 6B2EAA3B807B65EFEDA370EB765D6FC8 /* MJRefreshAutoStateFooter.m */, + 8B04E1C6538D1C855BDAFD2C7F1CBCD1 /* MJRefreshBackFooter.h */, + 281D756A5D80919F92DC593748BFF12D /* MJRefreshBackFooter.m */, + 3FE5CE5609C08A51C59D0BC7714A4D47 /* MJRefreshBackGifFooter.h */, + B309EBEA8D93176A9924EEF9714CA1C0 /* MJRefreshBackGifFooter.m */, + FFCE7657A94B976454ACDE4B4AAC05EC /* MJRefreshBackNormalFooter.h */, + DA9B3B6A9284B28E0FC77B0BFC8486A4 /* MJRefreshBackNormalFooter.m */, + D0FE45307E1589134990F6D62D5D51D7 /* MJRefreshBackStateFooter.h */, + 7031EEC5F08BCA8AD8D81E1275787D67 /* MJRefreshBackStateFooter.m */, + 9EC4984D77C13565AB9A20E002F820B8 /* MJRefreshComponent.h */, + 033A496A62413DF226ADC1719939E4DC /* MJRefreshComponent.m */, + 1AB5B52027B67AC28237EBB53E108905 /* MJRefreshConfig.h */, + 655C7084A60741488C18B8F24B3D97B8 /* MJRefreshConfig.m */, + 434092C132A5B63621FAD580FF82D0A7 /* MJRefreshConst.h */, + 03388D61B1D3E062A4B713B0C5D98736 /* MJRefreshConst.m */, + 41654620E68E97EF25361CA3CA3EEE06 /* MJRefreshFooter.h */, + 981AA3A188835E8705A105A86799212E /* MJRefreshFooter.m */, + BD29D57952BA6E6CF04E3C2A45E8C616 /* MJRefreshGifHeader.h */, + C5294A108B71ADD7C9A4D6C3B5EEE037 /* MJRefreshGifHeader.m */, + DB458DF9FE4C818BDA198678A04781AF /* MJRefreshHeader.h */, + 50DFF895D10A3B267303D82E51B50E81 /* MJRefreshHeader.m */, + CE08AE5F88748CDF0F1496822B015138 /* MJRefreshNormalHeader.h */, + 950F5DF4CC9F1990F496C1FA1B51A3EB /* MJRefreshNormalHeader.m */, + 97BAD9E47B49248B2119D1C3F6250FE7 /* MJRefreshNormalTrailer.h */, + 73013CAB4D167A786A6554B05F0AB2E1 /* MJRefreshNormalTrailer.m */, + 52A5A70614325B9002E369D7B735C716 /* MJRefreshStateHeader.h */, + 490B69B5C348D4367AF5F227FA482776 /* MJRefreshStateHeader.m */, + 2030C0A1678DD735DE5A068524C428D0 /* MJRefreshStateTrailer.h */, + 41B423EED53D5FCECC2E3EBDE3C439A1 /* MJRefreshStateTrailer.m */, + 8D878ED047D33FA3082CE6DB77514966 /* MJRefreshTrailer.h */, + F5338D394E610BCD3F8C72B229FB1A7F /* MJRefreshTrailer.m */, + 57629F1D48C217EF6EBB75B1630298DC /* NSBundle+MJRefresh.h */, + D03AEB9827714C23A990AEDD1B44E00E /* NSBundle+MJRefresh.m */, + 47C9D7D67F0E2980F8FEA947D9E74227 /* UICollectionViewLayout+MJRefresh.h */, + 2A4086AD383BE916A71549746D7E5B1F /* UICollectionViewLayout+MJRefresh.m */, + 9D251D37879678420C2E21DB2DA7CDD1 /* UIScrollView+MJExtension.h */, + AC399AE9AF1014D507A51FFA131483A4 /* UIScrollView+MJExtension.m */, + 569BD1C3159DE167886F2963AF89348E /* UIScrollView+MJRefresh.h */, + 5545A81EF57444268EE3EA581C8CCECB /* UIScrollView+MJRefresh.m */, + 925902FC9C669D9561854D1667C48580 /* UIView+MJExtension.h */, + 71BA37E3DD83CB95CA0B8347B095F829 /* UIView+MJExtension.m */, + 6E26A8372F0B92FF1B0179EB270E4022 /* Resources */, + 146B3F310D10D5B3AC61E0E2FBEBD5DE /* Support Files */, + ); + name = MJRefresh; + path = MJRefresh; + sourceTree = ""; + }; + 864FE91AA01AC5B2E6FFDA176A681BD2 /* AMap3DMap-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 1B930FD4BB265C9B832C63EB6C18A244 /* MAAnimatedAnnotation.h */, + 964E9456908063A8BBBA753D2ABF534E /* MAAnnotation.h */, + ED423D7338F18C90E5B7A164ED98FC77 /* MAAnnotationMoveAnimation.h */, + 407917BF4692971CEABC71A5FD299787 /* MAAnnotationView.h */, + 315F56C3CD0C71F1987D696DA36F06AB /* MAArc.h */, + B89D02337433B06608740E65EEE5FAC6 /* MAArcRenderer.h */, + 479F7170D4A47A740EF8675398E5EA41 /* MABaseEngineOverlay.h */, + 0B071FB150EB0F80F1B6DDAADB9F3EA1 /* MABaseOverlay.h */, + F3382EDA69E59A9E34944EBBD3D92753 /* MACircle.h */, + 3D96367E47A366B71AE236D5B0453C6E /* MACircleRenderer.h */, + C7BD48AF75DEE87507967ACAEF174B33 /* MAConfig.h */, + DD757A3E6B7C18A13DC9B29F99CD9BED /* MACustomBuildingOverlay.h */, + 1BDF995E8D7341F565EA215194660CC7 /* MACustomBuildingOverlayRenderer.h */, + 5CDE8C259BC065E1B0439447B1252C99 /* MACustomCalloutView.h */, + 1B4385BFE0439C76FE32000A4D39E09E /* MAGeodesicPolyline.h */, + 26EA4A1E2F6B0470D7EB7BA9B9874EFE /* MAGeometry.h */, + 16C58D56065DD6020AE907F6CF2A03D3 /* MAGroundOverlay.h */, + D4C67360D01FD4030DFC9FA7B265964B /* MAGroundOverlayRenderer.h */, + 660335F9EEB1C0586BB756A9BB4E574C /* MAHeatMapTileOverlay.h */, + F8875F775103851947F9747E7152ECCE /* MAHeatMapVectorGridOverlay.h */, + 7EBD886580089648C95FA50BFA2EC4A6 /* MAHeatMapVectorGridOverlayRenderer.h */, + 4E6C7D52A6CCCE379049FE947967F441 /* MAHeatMapVectorOverlay.h */, + 2397BECB688E68175A59B667612A8332 /* MAHeatMapVectorOverlayRender.h */, + F92F6571B0D9AF830EC38EC3D3FE21C6 /* MAIndoorInfo.h */, + 2796E91E96174551DBC623E1561F2FFB /* MALineDrawType.h */, + DDBB82BD9D351997FD4929E7A2B6E25F /* MAMapAccessibilityIdentifier.h */, + CF1BCEA3522F8B11C1D48FCB2F13EE6E /* MAMapCustomStyleOptions.h */, + 5A9885F9ACFB8863730F6BFF6BB3ED6F /* MAMapKit.h */, + 356236C33AC42A97A769B6475FC06B82 /* MAMapSnapshot.h */, + 97BDCFDBC64995B29C6C0E469BF8B9DB /* MAMapStatus.h */, + CC0D7016D0CD4D0171B1E212F0124A8A /* MAMapVersion.h */, + 4D85A34EC836480372B49DC09BB227EF /* MAMapView.h */, + 393F7B38F425E6CC96A1B00592D6DA75 /* MAMapView+Resource.h */, + 2C923D199287338D8EF1835690839E9F /* MAMultiColoredPolylineRenderer.h */, + FF643440CE0161152CE9F37F727738DF /* MAMultiPoint.h */, + 86EACB751BE0EBD6077C386440B17A17 /* MAMultiPointOverlay.h */, + 861606D816E41ABB6A9A6A7836702762 /* MAMultiPointOverlayRenderer.h */, + 2C6D3B24B71E8DF66D8D5573228AC038 /* MAMultiPolyline.h */, + B78F5016096455E9A46839581544C77B /* MAMultiTexturePolylineRenderer.h */, + C2787645FE031C111F8157CCFA6615A4 /* MAMVTTileOverlay.h */, + E38B574AE8D4235CEED222AA494F5B27 /* MAMVTTileOverlayRenderer.h */, + C63FC48F030AB76607C7C56F31AA58EC /* MAOfflineCity.h */, + 87E63847BD0EC765700A34191528E16A /* MAOfflineItem.h */, + C0949D614712DD9900DB683D00EAF68F /* MAOfflineItemCommonCity.h */, + B89ED17C01D05DECBE3EE6CFD0F850EB /* MAOfflineItemMunicipality.h */, + 067553896ECDDC64822E77C0793C8D83 /* MAOfflineItemNationWide.h */, + F07E4AA3FC126251D1C103DA4A009663 /* MAOfflineMap.h */, + 7D3A386905C9A65EC03587267B90AD4D /* MAOfflineMapViewController.h */, + 3C78972F4554CA8A9FDD2AA929AC5499 /* MAOfflineProvince.h */, + 81F4CE7454717F18CAE0AA9E7388A89E /* MAOverlay.h */, + 878559C369557711FEBFC84F446C3CA0 /* MAOverlayPathRenderer.h */, + E24739B8C160151071234B9CB14E6F74 /* MAOverlayRenderer.h */, + 507A47DAAD6358EECFC2286E971C215E /* MAParticleOverlay.h */, + FB82B73F335E8C0C366798262D7A17B6 /* MAParticleOverlayOptions.h */, + D44CE51086ED6B496AC2823731959529 /* MAParticleOverlayRenderer.h */, + 5FC2B9CB24015B1A4E7E51F2A8BF4648 /* MAPathShowRange.h */, + F487C86481F172E7177E505BDEB7A3BB /* MAPinAnnotationView.h */, + 35E8DA384C088C15B439F26F0A3305FD /* MAPoiFilter.h */, + F2B1FA2D6BC95A8F487B8587014D6F2C /* MAPointAnnotation.h */, + 51D0131A45D4EF399ED696EC0E432F17 /* MAPolygon.h */, + 6B40BC31A39D7D0DF7A22952A74B6D06 /* MAPolygonRenderer.h */, + B6C71E0E3B4E9C295BC85DD03D06B5AC /* MAPolyline.h */, + 3083A912594497E0C9586F53618F7E30 /* MAPolylineRenderer.h */, + 4DB584A3F93E4FCCDEB06503D0A75616 /* MARouteOverlay.h */, + 1AAFE339FC8FD41F256F39D9921A0DF5 /* MARouteOverlayModel.h */, + F73EBF0DB8CE31E9D2F94B878D6B673E /* MAShape.h */, + EB35D50C93B81507ABEAF0400F6409F7 /* MATerrainOverlay.h */, + F72A9BC98582AE44AB4225346E4882F1 /* MATerrainOverlayRenderer.h */, + 77944CCFDFCB2C611A128B13E8A1AFE7 /* MATileOverlay.h */, + 3A00DF16F62C279F4A81744AB2C8C5AE /* MATileOverlayRenderer.h */, + A710CAAD66C0DF6B1581557EAEB364AA /* MATouchPoi.h */, + 56A7C668AF522770DA05AA61967EB8A3 /* MATraceLocation.h */, + 4B59D66E4C28F170072DE77A083824F7 /* MATraceManager.h */, + F10FEB9A91D6ACC8D51457FE6DAF9F79 /* MAUserLocation.h */, + 4F00A70EF77AE057B5D3231D134DDBD2 /* MAUserLocationRepresentation.h */, + 0F73EBD4BC325D7711C71AD1A412B7B5 /* Frameworks */, + 573E47C06AFD89DDCCD3A0BE08706B89 /* Resources */, + 9843650ED7AAC655DE285BC63443B4CC /* Support Files */, + ); + name = "AMap3DMap-NO-IDFA"; + path = "AMap3DMap-NO-IDFA"; + sourceTree = ""; + }; + 91072AD823CF91336402ACD01C8E3586 /* AMapFoundation-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 8AD77551BBE324D957E93425CDDE1576 /* AMapFoundationConst.h */, + 2C3764593873EDDAF8A086E39CA140D4 /* AMapFoundationKit.h */, + 5164D4BBB00D3D7BB82D96A381D2A5C1 /* AMapFoundationVersion.h */, + C98E7DE75AE0A21CFAB5A0646473431F /* AMapServices.h */, + 303814ECB7988A2E7E6C6C1609D73152 /* AMapURLSearch.h */, + 9EF1A7E1F21502AA06F7F4CCEF91B56B /* AMapURLSearchConfig.h */, + 8B385062BA1E587F382CA327B6C2CB16 /* AMapURLSearchType.h */, + FABA86169032152A7B6FF54D106192AD /* AMapUtility.h */, + FC12D8C94C9391A7ACB6E34151D98A5B /* Frameworks */, + 18160A91BB2A19B0F666BE748D2F02B7 /* Support Files */, ); name = "AMapFoundation-NO-IDFA"; path = "AMapFoundation-NO-IDFA"; sourceTree = ""; }; - B7F5668B4968CD3B17D09682FC4F2AD2 /* Frameworks */ = { + 9843650ED7AAC655DE285BC63443B4CC /* Support Files */ = { isa = PBXGroup; children = ( - 670523F1C5175EE89771DB428EBEC517 /* MAMapKit.framework */, + 7D7B92668EB5A4C1D209F11543FC199F /* AMap3DMap-NO-IDFA.debug.xcconfig */, + 66FC53FBC5F1CA4B85240B8EE1F77251 /* AMap3DMap-NO-IDFA.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/AMap3DMap-NO-IDFA"; + sourceTree = ""; + }; + C7AD15EDBDEAED2A18A0CE84F75C9F1D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 5B6FE1BE92D481044CBF344D181F4EBF /* AMapLocationKit.framework */, ); name = Frameworks; sourceTree = ""; }; - B88F4DE8D2512159EF3CD40044889B81 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 28CB70E49423CA534786DD30DDCE03EE /* AMapSearchKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - C0A54D8DDA8ED18D016C2F971E3440BD /* Products */ = { - isa = PBXGroup; - children = ( - 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */, - 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */, - ); - name = Products; - sourceTree = ""; - }; - C111D316B9ED9498A7739F61CB9C3958 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - C7D8EE410ED114D2A14E9F97869A8B54 /* Pods-suixinkan */, - DD51156B35FBCA6A32E3B025718A7857 /* Pods-suixinkanTests */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - C7D8EE410ED114D2A14E9F97869A8B54 /* Pods-suixinkan */ = { - isa = PBXGroup; - children = ( - 8C64DEFEB1E7F2C66D9E36F704EB2EDA /* Pods-suixinkan.modulemap */, - 069E056FF5EF11FB955BE3C9637228BF /* Pods-suixinkan-acknowledgements.markdown */, - 44674EC1944BB8CC20D1FB811A28DA3F /* Pods-suixinkan-acknowledgements.plist */, - BF228B17BC7260C40143BD13BD131504 /* Pods-suixinkan-dummy.m */, - D49628F6F87CD3F4A82F10BBA92C44A3 /* Pods-suixinkan-Info.plist */, - 9EABEC92964633D02091EEB81DAC2A28 /* Pods-suixinkan-resources.sh */, - CE36A961B0F78784EC9BFE7F48C84F82 /* Pods-suixinkan-umbrella.h */, - 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */, - 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */, - ); - name = "Pods-suixinkan"; - path = "Target Support Files/Pods-suixinkan"; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - 51CE51AEB4DF6A4943765E55178C8CEF /* Pods */, - C0A54D8DDA8ED18D016C2F971E3440BD /* Products */, - C111D316B9ED9498A7739F61CB9C3958 /* Targets Support Files */, + E956B89C5AB772A5A003448AFC0F1D01 /* Pods */, + F129FB90A985C9A9FFEDDB262773057B /* Products */, + D5B2884487651951A6FC723A46071B1E /* Targets Support Files */, ); sourceTree = ""; }; @@ -549,30 +750,13 @@ name = Frameworks; sourceTree = ""; }; - DD51156B35FBCA6A32E3B025718A7857 /* Pods-suixinkanTests */ = { + D5B2884487651951A6FC723A46071B1E /* Targets Support Files */ = { isa = PBXGroup; children = ( - 8954141270608938A38FD68585BFD293 /* Pods-suixinkanTests.modulemap */, - 668A9B1E2D7B1954AE52ABE25041CC36 /* Pods-suixinkanTests-acknowledgements.markdown */, - 930BB613D93B3F0743FE520201572148 /* Pods-suixinkanTests-acknowledgements.plist */, - BBC4E88072A58FC7DD14D5BC2316725E /* Pods-suixinkanTests-dummy.m */, - 0560C72601DFB7648983A59E3A8630CF /* Pods-suixinkanTests-Info.plist */, - 65EE9CD76EF8BD358253184A5FA8B069 /* Pods-suixinkanTests-umbrella.h */, - 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */, - A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */, + 6AF4AB2CD95191F647218D6A24F8669C /* Pods-suixinkan */, + 06FC11260001589A2237273CF11C079C /* Pods-suixinkanTests */, ); - name = "Pods-suixinkanTests"; - path = "Target Support Files/Pods-suixinkanTests"; - sourceTree = ""; - }; - E210E6B5BC99E3497F97161C0D4897A8 /* Support Files */ = { - isa = PBXGroup; - children = ( - 21EABC2335DC8A3C9920D03EED819DFD /* AMapFoundation-NO-IDFA.debug.xcconfig */, - 1C389829A9B7304C4C2F81E54D9281D4 /* AMapFoundation-NO-IDFA.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/AMapFoundation-NO-IDFA"; + name = "Targets Support Files"; sourceTree = ""; }; E4801F62A6B08CD9B5410329F1A18FDE /* iOS */ = { @@ -583,6 +767,56 @@ name = iOS; sourceTree = ""; }; + E956B89C5AB772A5A003448AFC0F1D01 /* Pods */ = { + isa = PBXGroup; + children = ( + 864FE91AA01AC5B2E6FFDA176A681BD2 /* AMap3DMap-NO-IDFA */, + 91072AD823CF91336402ACD01C8E3586 /* AMapFoundation-NO-IDFA */, + 7F3AD2B90B0B80C514A35486BB2A9FEA /* AMapLocation-NO-IDFA */, + EB8B9545679B07EE2EAD940C398A7674 /* AMapSearch-NO-IDFA */, + 818ECC7C7775F8B414791FE64DDD61C2 /* MJRefresh */, + ); + name = Pods; + sourceTree = ""; + }; + EB8B9545679B07EE2EAD940C398A7674 /* AMapSearch-NO-IDFA */ = { + isa = PBXGroup; + children = ( + AAC4B7F927E219B1DFD11E5CD917F77E /* AMapCommonObj.h */, + 8FC3A0B6583F5CDEAF30AD5131E7CD26 /* AMapNearbySearchManager.h */, + 547E2BB070A41800DA8456A17F7D43D8 /* AMapNearbyUploadInfo.h */, + 55E496B24E5804D652EE6D1800A07B03 /* AMapSearchAPI.h */, + 15559E428759203AE92027639D25DDFB /* AMapSearchError.h */, + B1D214337580B2356480AE6AB94F983C /* AMapSearchKit.h */, + 641C5C6A474E625CE9316589E2270E66 /* AMapSearchObj.h */, + 2FAEF46266BFEDD00FC91317EE4C609D /* AMapSearchObjV1.h */, + 0AD5AF59E9B5193792BD98D1FCF13958 /* AMapSearchVersion.h */, + 03B6E08AD4E00EDA816D86E493F33C0A /* Frameworks */, + 33F808A5E11C924EC96AE95B4ABF9CEC /* Support Files */, + ); + name = "AMapSearch-NO-IDFA"; + path = "AMapSearch-NO-IDFA"; + sourceTree = ""; + }; + F129FB90A985C9A9FFEDDB262773057B /* Products */ = { + isa = PBXGroup; + children = ( + E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */, + 7E3097CFEFDA621E9FB0E62009FF87FC /* MJRefresh-MJRefresh.Privacy */, + 5BD109278933E8C2F269E5DCEC3A5376 /* Pods-suixinkan */, + 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */, + ); + name = Products; + sourceTree = ""; + }; + FC12D8C94C9391A7ACB6E34151D98A5B /* Frameworks */ = { + isa = PBXGroup; + children = ( + B41C4C6184ED489566C98EDA260CB769 /* AMapFoundationKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -594,11 +828,44 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 2DB2D5F8BA4CDF63E3B0B08254688D43 /* Headers */ = { + 209B4093533F7201ADD921788D2E5309 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 991C56154D625F2C902B960C2F8EA27F /* Pods-suixinkan-umbrella.h in Headers */, + B334090388C245FABE5077F228965657 /* Pods-suixinkan-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 22C4F6C2D1258108CF5B6E74F03D0EB2 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7989A6E79BFA78440C39F568D972305C /* MJRefresh.h in Headers */, + 325CA20B9271F3E008234E1518B79061 /* MJRefresh-umbrella.h in Headers */, + 561420A20DC0A84258A902E9EB69A15A /* MJRefreshAutoFooter.h in Headers */, + EC8E84A8FFADDCA562A8608D141D9027 /* MJRefreshAutoGifFooter.h in Headers */, + 7902D28FC9EF5AFEB452F508C7F266B1 /* MJRefreshAutoNormalFooter.h in Headers */, + 5BB6B99986FD7111B3AEBE931C7F507B /* MJRefreshAutoStateFooter.h in Headers */, + 45E1583D7EF53489B82C4CA2AD1AD0CF /* MJRefreshBackFooter.h in Headers */, + 475B4F3E71C293065AAFDB1888696CF6 /* MJRefreshBackGifFooter.h in Headers */, + 9A7FB1E975A5955C896E6B195C521804 /* MJRefreshBackNormalFooter.h in Headers */, + 08719ABCE689ED74FE7486B1E49DAA6C /* MJRefreshBackStateFooter.h in Headers */, + 69345CBCB31076EBF8A2C5885AF973AB /* MJRefreshComponent.h in Headers */, + 4DCA75BFE1558CE59DFC56607E49B3D2 /* MJRefreshConfig.h in Headers */, + 28BA9702905AA2B4C1E9E4878032D4E4 /* MJRefreshConst.h in Headers */, + D90DED0F5638B1C44F4B6C62D600D240 /* MJRefreshFooter.h in Headers */, + 61461B0D9D7B81C3F8D24066D9A19DCE /* MJRefreshGifHeader.h in Headers */, + 442F468E261A1106C291BF52BDBF9DB7 /* MJRefreshHeader.h in Headers */, + EE6E8FE636D2C02E3D2FC1E8555B4612 /* MJRefreshNormalHeader.h in Headers */, + BC2F9B1D6986FEB23B4FB1288B512538 /* MJRefreshNormalTrailer.h in Headers */, + 5DFCBADAC7D0FAC82C84A6C8E7BF1DA6 /* MJRefreshStateHeader.h in Headers */, + F60F90EAF35CFF40DF1C33557965787D /* MJRefreshStateTrailer.h in Headers */, + 523235228A1C021C67F2E3776A922DC5 /* MJRefreshTrailer.h in Headers */, + 81A5635CEA2AD9623E30CAE9AFC3BF65 /* NSBundle+MJRefresh.h in Headers */, + 5163FC6D715F6881B1FA1AB13DCEF870 /* UICollectionViewLayout+MJRefresh.h in Headers */, + 22516EA77E7120000632C30BD9A03927 /* UIScrollView+MJExtension.h in Headers */, + 69E353C99C6EEA3C93CCF2E526460B9D /* UIScrollView+MJRefresh.h in Headers */, + 3A2FCB914F6EADED828FF05F7E9132AE /* UIView+MJExtension.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -607,20 +874,21 @@ /* Begin PBXNativeTarget section */ 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */ = { isa = PBXNativeTarget; - buildConfigurationList = FCDBF877017B428DCC77941BF6BFCE55 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */; + buildConfigurationList = 6487E47B4E9A3B195AA3BE4343D199FE /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */; buildPhases = ( - 2DB2D5F8BA4CDF63E3B0B08254688D43 /* Headers */, - 2ED8C463692520134366F7B67BA81982 /* Sources */, - F76C05B3CCA2152BC55E3D3995D922D9 /* Frameworks */, - 4E5DC3AF9465D1D0D8FCDAA72806EF09 /* Resources */, + 209B4093533F7201ADD921788D2E5309 /* Headers */, + D271084EA70C49C91FD0FF37A626FA8B /* Sources */, + 5E0D0C50A7A873544D16A5F9C04AB995 /* Frameworks */, + 2FD1212D926DC6F1D3DF58F032EA55EF /* Resources */, ); buildRules = ( ); dependencies = ( - 7D028772FF3CCF105B5F47AFE034EFCA /* PBXTargetDependency */, - 6589552B8FD8DBC81A79FDD52A6C9C43 /* PBXTargetDependency */, - 82FE05E1DCD19D00122E30589369E7C4 /* PBXTargetDependency */, - 9218C019561F60337D0D0ED2E6099986 /* PBXTargetDependency */, + 60ABA24337210987D9A79F7D57C0EC00 /* PBXTargetDependency */, + BCAF443D8DFE5A1AFC52E1E2EAF619BA /* PBXTargetDependency */, + 09649301809B98B284C3F1652EFC30AC /* PBXTargetDependency */, + DB01A80A31066FDAD4B23DBA627E4EAA /* PBXTargetDependency */, + FE70A8F2F5586F2DD631E0020DC79776 /* PBXTargetDependency */, ); name = "Pods-suixinkan"; productName = Pods_suixinkan; @@ -639,13 +907,49 @@ buildRules = ( ); dependencies = ( - C5FF37D4205F1FD4B256A0ADD8473126 /* PBXTargetDependency */, + AEC3BCF41FBD1544EE0F0D4CDCECC7B4 /* PBXTargetDependency */, ); name = "Pods-suixinkanTests"; productName = Pods_suixinkanTests; productReference = 1B7465A72120AF417FD5F1F34AD33AD4 /* Pods-suixinkanTests */; productType = "com.apple.product-type.framework"; }; + 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */ = { + isa = PBXNativeTarget; + buildConfigurationList = 29BB59B7B51BC6194771995E3356CF70 /* Build configuration list for PBXNativeTarget "MJRefresh" */; + buildPhases = ( + 22C4F6C2D1258108CF5B6E74F03D0EB2 /* Headers */, + E01EA717D0A0AF8E12D145A5F2252FD2 /* Sources */, + 11690A588400BBB164423D5F86311C35 /* Frameworks */, + 4A4F8947EF95B9D0D1FCFC1296740510 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 47FF838E4866B19860A91B39D64ABCD0 /* PBXTargetDependency */, + ); + name = MJRefresh; + productName = MJRefresh; + productReference = E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */; + productType = "com.apple.product-type.framework"; + }; + B26054DF1DEA11585A231AF6D1D80D5E /* MJRefresh-MJRefresh.Privacy */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9BEED3DD739942FA8862CB57BB02CDE7 /* Build configuration list for PBXNativeTarget "MJRefresh-MJRefresh.Privacy" */; + buildPhases = ( + 44B11D5EDB49AE22C6DAC036C90A13F8 /* Sources */, + 880E41AE438415E959603EC5884F97CB /* Frameworks */, + 1BFD78DA08275E7D04592F194A11BA86 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "MJRefresh-MJRefresh.Privacy"; + productName = MJRefresh.Privacy; + productReference = 7E3097CFEFDA621E9FB0E62009FF87FC /* MJRefresh-MJRefresh.Privacy */; + productType = "com.apple.product-type.bundle"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -666,7 +970,7 @@ mainGroup = CF1408CF629C7361332E53B88F7BD30C; minimizedProjectReferenceProxies = 0; preferredProjectObjectVersion = 77; - productRefGroup = C0A54D8DDA8ED18D016C2F971E3440BD /* Products */; + productRefGroup = F129FB90A985C9A9FFEDDB262773057B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -674,6 +978,8 @@ 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */, 4BD4E22D3419D68A85BDD6119CB37C6C /* AMapLocation-NO-IDFA */, 4F1379598302C9160590B3650C10E1A5 /* AMapSearch-NO-IDFA */, + 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */, + B26054DF1DEA11585A231AF6D1D80D5E /* MJRefresh-MJRefresh.Privacy */, 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */, 508CB5D3E96E222654C51F13079FC2CD /* Pods-suixinkanTests */, ); @@ -681,6 +987,21 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1BFD78DA08275E7D04592F194A11BA86 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 80F3B2F81449FE093C334EACB25832F9 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2FD1212D926DC6F1D3DF58F032EA55EF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4995BF6BC2129E05D351581B0A223B59 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -688,21 +1009,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 4E5DC3AF9465D1D0D8FCDAA72806EF09 /* Resources */ = { + 4A4F8947EF95B9D0D1FCFC1296740510 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + D90DF1376DF5E2EA644313BCD2E03058 /* MJRefresh.bundle in Resources */, + 327BA3DDA513422E632D3DA4A8FC60EC /* MJRefresh-MJRefresh.Privacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 2ED8C463692520134366F7B67BA81982 /* Sources */ = { + 44B11D5EDB49AE22C6DAC036C90A13F8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - EA1E1655DA5C4F62F66ADA15925A59E3 /* Pods-suixinkan-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -714,63 +1036,171 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + D271084EA70C49C91FD0FF37A626FA8B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B7CC9AE896BFAB94775EAA25D7442422 /* Pods-suixinkan-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E01EA717D0A0AF8E12D145A5F2252FD2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DE98ECCCA7106A4EA575EF34830D41FF /* MJRefresh-dummy.m in Sources */, + 11C929E6BFB46F981685446F26DCE605 /* MJRefreshAutoFooter.m in Sources */, + E5B057BC87284367918B2DB9CA084B4E /* MJRefreshAutoGifFooter.m in Sources */, + 6DE6C7F0FA965828E4FCE687BF75FBBE /* MJRefreshAutoNormalFooter.m in Sources */, + 8872BEB0954C0254A792469F4DBC9891 /* MJRefreshAutoStateFooter.m in Sources */, + F3AECEF6D3BB919B3E7392942E1BC58B /* MJRefreshBackFooter.m in Sources */, + A1E44277704AD68E867FD7C955A6632D /* MJRefreshBackGifFooter.m in Sources */, + 955B87902E039163281C4F47C95DB851 /* MJRefreshBackNormalFooter.m in Sources */, + B09F08548ACA8379445F6525011EE219 /* MJRefreshBackStateFooter.m in Sources */, + C60DB44F719853DE3B7157960DAF9270 /* MJRefreshComponent.m in Sources */, + 2DC44A09A6C9D6DC7D1BDA2DFCF99EE3 /* MJRefreshConfig.m in Sources */, + 54E268C32915CF908E7AA776909B45EB /* MJRefreshConst.m in Sources */, + 186B573F1BEB8A23419A02814A7741DB /* MJRefreshFooter.m in Sources */, + FEE883575278D5BE8F185437AB5DB3BB /* MJRefreshGifHeader.m in Sources */, + 85AB23275E9D19394969235E5DC2300E /* MJRefreshHeader.m in Sources */, + 0EF10747EF2A02413E84BD5EF7C87A4B /* MJRefreshNormalHeader.m in Sources */, + D90607B4E56247B19B14462E487BA86E /* MJRefreshNormalTrailer.m in Sources */, + A078A275FFFA48D620074790DA3CA6CE /* MJRefreshStateHeader.m in Sources */, + 452C940762F65B125C216F73B369F583 /* MJRefreshStateTrailer.m in Sources */, + 5BD5D9B8F61C124A62C75D9AC36A07BD /* MJRefreshTrailer.m in Sources */, + 24E963C1D6245F98BAC8A0ACCB7DE987 /* NSBundle+MJRefresh.m in Sources */, + BD30193C1E3D7B1F17B1B1F3F08BE655 /* UICollectionViewLayout+MJRefresh.m in Sources */, + E1DE69F6BB6235A6EDB6C99A184BEDB4 /* UIScrollView+MJExtension.m in Sources */, + A86CC1AFDFDD692DC4EE66F57C0F39E6 /* UIScrollView+MJRefresh.m in Sources */, + 5FDC4239F7B651092BF582D0F460BAD4 /* UIView+MJExtension.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 5CA482D3FDDBAD1FBF45810BFB30868D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 589E9D53A0A18E62241CDC1546C39754 /* PBXContainerItemProxy */; - }; - 6589552B8FD8DBC81A79FDD52A6C9C43 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 70FAFD022EBDF3AF6FA6D56FD062BC00 /* PBXContainerItemProxy */; - }; - 6C65DF00B250F024B4E6B6F4330093DA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 2B4CA41C0FEC2F8A31D4426133DAE413 /* PBXContainerItemProxy */; - }; - 770B6209BD1D6EEACDEC08C4F8D15368 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMapFoundation-NO-IDFA"; - target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; - targetProxy = 47D4666849C29F0443F98043012741E4 /* PBXContainerItemProxy */; - }; - 7D028772FF3CCF105B5F47AFE034EFCA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "AMap3DMap-NO-IDFA"; - target = B44FB02BD2D3FEAD1F36808AD405A543 /* AMap3DMap-NO-IDFA */; - targetProxy = 7F46567B2D4C2C2D6B168DB1D6C4B959 /* PBXContainerItemProxy */; - }; - 82FE05E1DCD19D00122E30589369E7C4 /* PBXTargetDependency */ = { + 09649301809B98B284C3F1652EFC30AC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "AMapLocation-NO-IDFA"; target = 4BD4E22D3419D68A85BDD6119CB37C6C /* AMapLocation-NO-IDFA */; - targetProxy = 10773E84BB082E09D8E276432A257D58 /* PBXContainerItemProxy */; + targetProxy = 39E814A976E263DBFB8C20B560CA29E2 /* PBXContainerItemProxy */; }; - 9218C019561F60337D0D0ED2E6099986 /* PBXTargetDependency */ = { + 14AF565C4637B73BC2584C61CC7EC677 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "AMapSearch-NO-IDFA"; - target = 4F1379598302C9160590B3650C10E1A5 /* AMapSearch-NO-IDFA */; - targetProxy = AEBE04EE6A5B130F5ABA3ADAA7541F3D /* PBXContainerItemProxy */; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = E0B1E07063BAB873511674BF967B3596 /* PBXContainerItemProxy */; }; - C5FF37D4205F1FD4B256A0ADD8473126 /* PBXTargetDependency */ = { + 27F685E292172B93505CBABC9D049072 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = 58ACB14B669F8CD6C4362DD783E388FC /* PBXContainerItemProxy */; + }; + 2D0AD056C34FAA29284DF2D03917892C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = 5FF2C31B96AE85013B4BEBC8B641E3C6 /* PBXContainerItemProxy */; + }; + 47FF838E4866B19860A91B39D64ABCD0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "MJRefresh-MJRefresh.Privacy"; + target = B26054DF1DEA11585A231AF6D1D80D5E /* MJRefresh-MJRefresh.Privacy */; + targetProxy = 809D27ABC18E19451394228BE9D4AA86 /* PBXContainerItemProxy */; + }; + 60ABA24337210987D9A79F7D57C0EC00 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMap3DMap-NO-IDFA"; + target = B44FB02BD2D3FEAD1F36808AD405A543 /* AMap3DMap-NO-IDFA */; + targetProxy = A3A7B10AC9A70CD988084F9A0559EFEE /* PBXContainerItemProxy */; + }; + AEC3BCF41FBD1544EE0F0D4CDCECC7B4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "Pods-suixinkan"; target = 1DE17B7C77CD95CB67DF1197965B76AB /* Pods-suixinkan */; - targetProxy = 09D400E62C865DFB3552C9FF55DFBF14 /* PBXContainerItemProxy */; + targetProxy = B93D696C9911155C9CFB043E22AF9B10 /* PBXContainerItemProxy */; + }; + BCAF443D8DFE5A1AFC52E1E2EAF619BA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapFoundation-NO-IDFA"; + target = 9B182CB4E1716E9070813D3C59736001 /* AMapFoundation-NO-IDFA */; + targetProxy = 36D052FD95B687E1F36CEDFEEA13AFD6 /* PBXContainerItemProxy */; + }; + DB01A80A31066FDAD4B23DBA627E4EAA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "AMapSearch-NO-IDFA"; + target = 4F1379598302C9160590B3650C10E1A5 /* AMapSearch-NO-IDFA */; + targetProxy = 0ED508B124853B684DDAEE58F0371D71 /* PBXContainerItemProxy */; + }; + FE70A8F2F5586F2DD631E0020DC79776 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MJRefresh; + target = 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */; + targetProxy = 07CE15427FBD194439F72813F1E79F5D /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 059F508CFE102C20A25E012FD4BCDDFF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B3A9B2740ED243A88FDF2D9AE77E9392 /* Pods-suixinkan.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 05B95C83CF623D71146E3A05162DC69D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2B58225B825CAD86A961027F68A2994E /* MJRefresh.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJRefresh"; + IBSC_MODULE = MJRefresh; + INFOPLIST_FILE = "Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + PRODUCT_NAME = MJRefresh.Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; 0606EC124017CF52B54FEB3096BC7E75 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3CE7B2EE0FE95BBD834825FA4D0571C5 /* Pods-suixinkanTests.debug.xcconfig */; + baseConfigurationReference = CF9B73BD5A7EF49C515CE054315DBC4E /* Pods-suixinkanTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -807,6 +1237,25 @@ }; name = Debug; }; + 2B131D06A21388BEC03655FBFA68B198 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 67B7CB4CBC7DAA9DD71077F5EA8A0F03 /* AMapFoundation-NO-IDFA.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 30E0B9EFD9A5C45D0D351231E81B30B3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -869,9 +1318,9 @@ }; name = Release; }; - 33FF65CC939DB2ACD3BF5B4E6E6F56D6 /* Release */ = { + 49EBBE60492138920A951F8BD7CD4013 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1C389829A9B7304C4C2F81E54D9281D4 /* AMapFoundation-NO-IDFA.release.xcconfig */; + baseConfigurationReference = 66FC53FBC5F1CA4B85240B8EE1F77251 /* AMap3DMap-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -888,28 +1337,48 @@ }; name = Release; }; - 49EBBE60492138920A951F8BD7CD4013 /* Release */ = { + 4E3C211534863595B5F43E8250BB4DB1 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0249ED7AD58489423B69253BB3F68C77 /* AMap3DMap-NO-IDFA.release.xcconfig */; + baseConfigurationReference = 2B58225B825CAD86A961027F68A2994E /* MJRefresh.debug.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/MJRefresh/MJRefresh-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", + "@loader_path/Frameworks", ); + MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap"; + PRODUCT_MODULE_NAME = MJRefresh; + PRODUCT_NAME = MJRefresh; SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; 535F4FAD82A3C67D930C230498439B31 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4ADB0704B3E2D4A27F9D4A31AE7D5CF0 /* AMapSearch-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = 2B656CB39B267965926C558095D6C5B7 /* AMapSearch-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -927,7 +1396,7 @@ }; 59C25D381C381A4E53F13543611D1E41 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A1C2AE0D141F894C0C841BDB91EA7784 /* Pods-suixinkanTests.release.xcconfig */; + baseConfigurationReference = 38B439905141423BD2DADBBD5EFC72DE /* Pods-suixinkanTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -965,27 +1434,9 @@ }; name = Release; }; - 7BB3D81AAC9EB818C249626A41588C41 /* Debug */ = { + 639EF0D5A75FE8B164282F89ABBC8A1D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 21EABC2335DC8A3C9920D03EED819DFD /* AMapFoundation-NO-IDFA.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8076472B15CAFA346B2FBF304BD0B32C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 61B7C8006610229F8A3485704A3944CF /* Pods-suixinkan.debug.xcconfig */; + baseConfigurationReference = 081A933139371B97D5ABFD37B065516E /* Pods-suixinkan.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -1017,14 +1468,90 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; + name = Release; + }; + 7312A0B335DF5880FF7B9D3A5F96D1E9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1D1227D5C439B4A7C6B3CA5B94B6BFE5 /* MJRefresh.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJRefresh"; + IBSC_MODULE = MJRefresh; + INFOPLIST_FILE = "Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + PRODUCT_NAME = MJRefresh.Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 8BB1669D2FD16A3634D2142D4CB8AA96 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1D1227D5C439B4A7C6B3CA5B94B6BFE5 /* MJRefresh.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/MJRefresh/MJRefresh-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/MJRefresh/MJRefresh.modulemap"; + PRODUCT_MODULE_NAME = MJRefresh; + PRODUCT_NAME = MJRefresh; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A3003A2D7E7B8B025955B30DE4D4340B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6C70E88A48758B567F7C05DDD607C8A6 /* AMapFoundation-NO-IDFA.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; name = Debug; }; A5889394557E95B280BBA784CBC27862 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 50416CD761E5B67B024889A9055280A1 /* AMapLocation-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = E9F04ADFC5DDC9481CE86CBF1CFBEC3B /* AMapLocation-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1042,7 +1569,7 @@ }; CA5F2D3465D7CF173F604FC5D9E07ED5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 20C221C3FAE6488F4EDEED818C44CDD6 /* AMapSearch-NO-IDFA.release.xcconfig */; + baseConfigurationReference = E0603419C7ED70271FCFAB161D6626C4 /* AMapSearch-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1061,7 +1588,7 @@ }; D80C09B5C3E12110BB1B81C6C2F5466A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5C9770B675559EB4331810063B73DDC1 /* AMapLocation-NO-IDFA.release.xcconfig */; + baseConfigurationReference = 72B5AE3C704A7632DFBFA60F5FCDDBE3 /* AMapLocation-NO-IDFA.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1080,7 +1607,7 @@ }; DD7C8FFCC688D270EB22589A35ABBC73 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 38C9B733D70D2C1018E98375FEBB4D3E /* AMap3DMap-NO-IDFA.debug.xcconfig */; + baseConfigurationReference = 7D7B92668EB5A4C1D209F11543FC199F /* AMap3DMap-NO-IDFA.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1096,46 +1623,6 @@ }; name = Debug; }; - EB4999FBC2DB974780AA976726FD20A2 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2D9188A08F7F86FBF3EBB3CD93699D53 /* Pods-suixinkan.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - INFOPLIST_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-suixinkan/Pods-suixinkan.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; F4FF6A0D1970CA9705974E3CB2134802 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1205,6 +1692,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 29BB59B7B51BC6194771995E3356CF70 /* Build configuration list for PBXNativeTarget "MJRefresh" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4E3C211534863595B5F43E8250BB4DB1 /* Debug */, + 8BB1669D2FD16A3634D2142D4CB8AA96 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1223,6 +1719,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 6487E47B4E9A3B195AA3BE4343D199FE /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 059F508CFE102C20A25E012FD4BCDDFF /* Debug */, + 639EF0D5A75FE8B164282F89ABBC8A1D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 74F8BC6869B879C9A4487377E57EA717 /* Build configuration list for PBXAggregateTarget "AMapSearch-NO-IDFA" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1232,6 +1737,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 9BEED3DD739942FA8862CB57BB02CDE7 /* Build configuration list for PBXNativeTarget "MJRefresh-MJRefresh.Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 05B95C83CF623D71146E3A05162DC69D /* Debug */, + 7312A0B335DF5880FF7B9D3A5F96D1E9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 9CA117AC0BCD26718BF9BD3A972FB596 /* Build configuration list for PBXAggregateTarget "AMap3DMap-NO-IDFA" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1250,20 +1764,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C2E882BA611C08B99AFF453B387FB2C2 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */ = { + A1A94DBC4284DCAFF692A764EFF209C7 /* Build configuration list for PBXAggregateTarget "AMapFoundation-NO-IDFA" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7BB3D81AAC9EB818C249626A41588C41 /* Debug */, - 33FF65CC939DB2ACD3BF5B4E6E6F56D6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - FCDBF877017B428DCC77941BF6BFCE55 /* Build configuration list for PBXNativeTarget "Pods-suixinkan" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8076472B15CAFA346B2FBF304BD0B32C /* Debug */, - EB4999FBC2DB974780AA976726FD20A2 /* Release */, + A3003A2D7E7B8B025955B30DE4D4340B /* Debug */, + 2B131D06A21388BEC03655FBFA68B198 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh-Info.plist b/Pods/Target Support Files/MJRefresh/MJRefresh-Info.plist new file mode 100644 index 0000000..1b9a556 --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/MJRefresh-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.7.9 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh-dummy.m b/Pods/Target Support Files/MJRefresh/MJRefresh-dummy.m new file mode 100644 index 0000000..d43259d --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/MJRefresh-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_MJRefresh : NSObject +@end +@implementation PodsDummy_MJRefresh +@end diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch b/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh-umbrella.h b/Pods/Target Support Files/MJRefresh/MJRefresh-umbrella.h new file mode 100644 index 0000000..7168200 --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/MJRefresh-umbrella.h @@ -0,0 +1,41 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "MJRefreshAutoFooter.h" +#import "MJRefreshBackFooter.h" +#import "MJRefreshComponent.h" +#import "MJRefreshFooter.h" +#import "MJRefreshHeader.h" +#import "MJRefreshTrailer.h" +#import "MJRefreshAutoGifFooter.h" +#import "MJRefreshAutoNormalFooter.h" +#import "MJRefreshAutoStateFooter.h" +#import "MJRefreshBackGifFooter.h" +#import "MJRefreshBackNormalFooter.h" +#import "MJRefreshBackStateFooter.h" +#import "MJRefreshGifHeader.h" +#import "MJRefreshNormalHeader.h" +#import "MJRefreshStateHeader.h" +#import "MJRefreshNormalTrailer.h" +#import "MJRefreshStateTrailer.h" +#import "MJRefresh.h" +#import "MJRefreshConfig.h" +#import "MJRefreshConst.h" +#import "NSBundle+MJRefresh.h" +#import "UICollectionViewLayout+MJRefresh.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" +#import "UIView+MJExtension.h" + +FOUNDATION_EXPORT double MJRefreshVersionNumber; +FOUNDATION_EXPORT const unsigned char MJRefreshVersionString[]; + diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh.debug.xcconfig b/Pods/Target Support Files/MJRefresh/MJRefresh.debug.xcconfig new file mode 100644 index 0000000..68622eb --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/MJRefresh.debug.xcconfig @@ -0,0 +1,12 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MJRefresh +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh.modulemap b/Pods/Target Support Files/MJRefresh/MJRefresh.modulemap new file mode 100644 index 0000000..ec3d85e --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/MJRefresh.modulemap @@ -0,0 +1,6 @@ +framework module MJRefresh { + umbrella header "MJRefresh-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh.release.xcconfig b/Pods/Target Support Files/MJRefresh/MJRefresh.release.xcconfig new file mode 100644 index 0000000..68622eb --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/MJRefresh.release.xcconfig @@ -0,0 +1,12 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MJRefresh +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist b/Pods/Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist new file mode 100644 index 0000000..84806d0 --- /dev/null +++ b/Pods/Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleShortVersionString + 3.7.9 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown index 9030f88..dfa2184 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.markdown @@ -20,4 +20,27 @@ Copyright © 2014 AutoNavi. All Rights Reserved. Copyright © 2014 AutoNavi. All Rights Reserved. + +## MJRefresh + +Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist index fea738c..4f30d35 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-acknowledgements.plist @@ -56,6 +56,35 @@ Type PSGroupSpecifier + + FooterText + Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + License + MIT + Title + MJRefresh + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..0bc165c --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh +${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..8f7f440 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..0bc165c --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,2 @@ +${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh +${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..8f7f440 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-Release-output-files.xcfilelist @@ -0,0 +1 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh new file mode 100755 index 0000000..deb6687 --- /dev/null +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh @@ -0,0 +1,186 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink -f "${source}")" + fi + + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures from the dSYM. + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=1 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=0 +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig index 2854f5c..2f7ca54 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.debug.xcconfig @@ -1,10 +1,11 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "MJRefresh" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig index 2854f5c..2f7ca54 100644 --- a/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkan/Pods-suixinkan.release.xcconfig @@ -1,10 +1,11 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AMapFoundationKit" -framework "AMapLocationKit" -framework "AMapSearchKit" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MAMapKit" -framework "MJRefresh" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AMap3DMap-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapFoundation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapLocation-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/AMapSearch-NO-IDFA" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig index 4caf83c..fa45b76 100644 --- a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.debug.xcconfig @@ -1,8 +1,9 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" +OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MJRefresh" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig index 4caf83c..fa45b76 100644 --- a/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-suixinkanTests/Pods-suixinkanTests.release.xcconfig @@ -1,8 +1,9 @@ ARCHS = $(ARCHS_STANDARD) CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_ROOT}/AMap3DMap-NO-IDFA" "${PODS_ROOT}/AMapFoundation-NO-IDFA" "${PODS_ROOT}/AMapLocation-NO-IDFA" "${PODS_ROOT}/AMapSearch-NO-IDFA" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" +OTHER_LDFLAGS = $(inherited) -l"c++" -l"z" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "CoreText" -framework "ExternalAccessory" -framework "GLKit" -framework "MJRefresh" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/suixinkan.xcodeproj/project.pbxproj b/suixinkan.xcodeproj/project.pbxproj index 1af304d..0959727 100644 --- a/suixinkan.xcodeproj/project.pbxproj +++ b/suixinkan.xcodeproj/project.pbxproj @@ -64,15 +64,11 @@ }; A00000022FE9000000000002 /* suixinkanTests */ = { isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - ); path = suixinkanTests; sourceTree = ""; }; B00000022FEF000000000002 /* suixinkanUITests */ = { isa = PBXFileSystemSynchronizedRootGroup; - exceptions = ( - ); path = suixinkanUITests; sourceTree = ""; }; @@ -162,6 +158,7 @@ 939AC7932FE3F832004B22E4 /* Frameworks */, 939AC7942FE3F832004B22E4 /* Resources */, 6F866A031F8EAF0CA7CF0E12 /* [CP] Copy Pods Resources */, + 68DE7BABFCA72C541E0F1F82 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -319,6 +316,27 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + 68DE7BABFCA72C541E0F1F82 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; 6F866A031F8EAF0CA7CF0E12 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -327,10 +345,14 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-input-files.xcfilelist", ); + inputPaths = ( + ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources-${CONFIGURATION}-output-files.xcfilelist", ); + outputPaths = ( + ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-suixinkan/Pods-suixinkan-resources.sh\"\n"; diff --git a/suixinkan/App/Navigation/AppTab.swift b/suixinkan/App/Navigation/AppTab.swift index 52fad57..ba5a6df 100644 --- a/suixinkan/App/Navigation/AppTab.swift +++ b/suixinkan/App/Navigation/AppTab.swift @@ -42,6 +42,34 @@ enum AppTab: String, CaseIterable, Identifiable, Hashable { } } + /// 当前 Tab 处于选中状态时使用的本地图片资源名。 + var selectedImageName: String { + switch self { + case .home: + "tab_home_selected" + case .orders: + "tab_order_selected" + case .statistics: + "tab_data_selected" + case .profile: + "tab_profile_selected" + } + } + + /// 当前 Tab 处于未选中状态时使用的本地图片资源名。 + var unselectedImageName: String { + switch self { + case .home: + "tab_home_unselected" + case .orders: + "tab_order_unselected" + case .statistics: + "tab_data_unselected" + case .profile: + "tab_profile_unselected" + } + } + @ViewBuilder var rootView: some View { switch self { diff --git a/suixinkan/App/suixinkanApp.swift b/suixinkan/App/suixinkanApp.swift index cc91b63..c17f864 100644 --- a/suixinkan/App/suixinkanApp.swift +++ b/suixinkan/App/suixinkanApp.swift @@ -14,6 +14,7 @@ struct suixinkanApp: App { init() { AppUITestLaunchState.resetIfNeeded() + MJRefreshSupport.configure() } var body: some Scene { diff --git a/suixinkan/Assets.xcassets/TabDataSelected.imageset/tab_data_selected.png b/suixinkan/Assets.xcassets/TabDataSelected.imageset/tab_data_selected.png deleted file mode 100644 index 25a61ceeb9c1a53cd60c153e46582d5b5a81f78e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2008 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 diff --git a/suixinkan/Assets.xcassets/TabProfileUnselected.imageset/tab_profile_unselected.png b/suixinkan/Assets.xcassets/TabProfileUnselected.imageset/tab_profile_unselected.png deleted file mode 100644 index 9c24f0628e0fe9deb2c55757bc70aa40faaa1762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1922 zcmV-|2YvX7P)wmZo#cxywa$i6HOHV3+W$hR;U8fH<8mTpG@<%U8=d0pti?Dh;FAluIY zKclMFBjQX1m`dA8WEp@k0TAXQU{SXZ`KAC5RMa#+-q7&9@F6#6nxlZGoX0Zcum=E3 z$)*8-i_EH#50Wpg$ z(rLo7$>+ma@e1`eUJD@8h)f3#IlTqc@g3(dhk6ppYJlxs4XV~v~ef{tLy z0oBlgNsH%v9mz)5-fIjEv6TY~1Dx$Oc?Z4> zci~CZVUz>fRFwZM0B=*BsI?w%%Q8BDwf3{;p&Zb)@F?ySUfXo&FI|%zE-6{wt~#6+ zK*(U1>O?K{I$Vai&B7<9ZY_XJ2p>g+Z(_#1i>DWQnWZKsvj<7!q@gqdK`=sIjpaqb~Ge8UG z)rjk5T0D=@=LnhV77^N=6vN|jUr{aIqo)m!2oNZF?r#=0U!?5=WGW#Etph?^#2{^L zO)DUgbyZ2;DGZyh(7DkO@mYn@%sDPJg|-U4Xd2o90j&*HYnJ|2?a7#DUk+{p%xSr>V4yWL>lioupqzzN77p z!bkYFre5^<3*A48BP4zASaTFmPgQkv)Tu7YKU?L=JLvc16;~Iz=aEgU_P8_2hWI`1 zY5tq4J+gUzkLlFqmo ze8muU(|J(+Z4LN;`otK6v15>8{2{c2W<_mi)w1(&{$rLf86&h=wazJH)T~j-T z-?xSh9k$bqz}HmRR=Uo929*Aoh*?6DP8_$IXdHH3y|TS4{r;6AHYk261JwQGD(yCm znR^+7jg;rpWJAexw+uSjTuieufGo1x8*Eyw@`>2E0g2~wyur|{?DouklqBsMFp-Ej z`XnmF6Kxm*P61%`sfbPGHBArre4o>gt)eS-iwn@JTec)m{?p8*%Y-IMp${Hdps2kx zx=dLD2K%%#t#z5t_g-AHI4(fx;nAfC>>WUu0R8NR0QVrm=B|v?H4w)uCO~55R0La! zC~hTL23db?cYq0%v;?ddImeQuZ9rnbPU{+#OABK~ECKsyOkrAhV?xpw864 zrUIgPAiO`%oLf0$AZPwb=OVUGGHn48hjMfobYp=-sU7kD=u3Aii@Ix(OimgQ=lCRPjwc)F?Jg>M z9_WIcfa>YGZ7XP2X>^$WGV%ScfknSz2*>dYBI8p``8P} z;o)SKK0;=Y6rfHsB6h92WdsL^51p!986}ge6d(rdF%nBA8$^vgB~y$PAOxH)BQ}tH zWNVTF#5s%}NX5(KYI2aez?K38*mqCQ%M=@n52D;ZT?!EAILOu?y0yn4T?VWaAfhcE zf|Ai2Fg{e%ahYW0009I@>j^mHcx^^myD`@aAH0RR78u60oW000I_L_t&o0AhlFuPZV@NB{r;07*qo IM6N<$f_x%^tN;K2 diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/Contents.json b/suixinkan/Assets.xcassets/icon_scan.imageset/Contents.json new file mode 100644 index 0000000..c5d9acc --- /dev/null +++ b/suixinkan/Assets.xcassets/icon_scan.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "icon_scan.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon_scan@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icon_scan@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan.png b/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..a03cfd14b15993881cc0971e20fbfba4391b484c GIT binary patch literal 381 zcmV-@0fPRCP)o? z2bT)>$uzNdq6XZ61@Su( zE#ZXhyckQ*7PQwld)m4Kz}DoPu~bKcth0kS{w zDr9LxN3_Jts09-V4e36hX@U@&*2pwW5M$CiaZ3}7SiGY|3lq#31HNYU>Gnl;2!+2I bJZSR)*otm-In#S@00000NkvXXu0mjfId-8U literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@2x.png b/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1f76573f9ef99c276e427976e45a3a78760c72f3 GIT binary patch literal 675 zcmV;U0$lxxP) zTXMr75Cr8^Zk!w=KC|;hxk?rik6mU3-QP*U&M+V(S!^2s002mMs5?;1&+Aq7_s_>I zYKz&)TCqzBXiA(8d5NAQh#A^Wj21nI&%)@ozG zO5!JsYVJ2+Me!2`wf7mYviONk4cZMr{5Kt1`0s?_lr{qx{hu^yQoplnZ0Pk@|38o4 zmX^eASMHYU62Qp6rc$GCuYM$2MqdO{zpYZ3qdWnO{&Fg`;wnf?*@DqA`j4g{?^w5D z-q(T!nFNTrHh{UmodWGhfEWxAb8Z0BPd^tLk^nInASQ1B(~lh|T9N=U`JEaGuqCrA zCIMnFK+LfLOh5KyG$jFIFhC3jh;ex)eAnl|S9m-~A^~DBKnwd#J?d4GqOT-COx^$%VmnT>BmrVDK+L%TOhf%#Xh;IY zV1Srw1DJ-|;WuLODIeVfKT(iSeyX6m4}~)a2@q3m0Bb=x6GAYV#FqmL0R>pz_^_&5#D?8vJ*{cQ#=_-#N&xZH6@_f0000Gh<|G_wHSSo*lhp+002ov JPDHLkV1kkxB2oYV literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@3x.png b/suixinkan/Assets.xcassets/icon_scan.imageset/icon_scan@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..72e33400b04b796617cf2493492bfb490bbb6742 GIT binary patch literal 1022 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 literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@3x.png b/suixinkan/Assets.xcassets/tab_data_selected.imageset/tab_data_selected@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..50a064009cc0e0003271faa7ca8e54ab9732310a GIT binary patch literal 3015 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 JPDHLkV1kQ(6k7lQ literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/TabDataUnselected.imageset/Contents.json b/suixinkan/Assets.xcassets/tab_data_unselected.imageset/Contents.json similarity index 76% rename from suixinkan/Assets.xcassets/TabDataUnselected.imageset/Contents.json rename to suixinkan/Assets.xcassets/tab_data_unselected.imageset/Contents.json index faa503c..254b4fb 100644 --- a/suixinkan/Assets.xcassets/TabDataUnselected.imageset/Contents.json +++ b/suixinkan/Assets.xcassets/tab_data_unselected.imageset/Contents.json @@ -6,10 +6,12 @@ "scale" : "1x" }, { + "filename" : "tab_data_unselected@2x.png", "idiom" : "universal", "scale" : "2x" }, { + "filename" : "tab_data_unselected@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected.png b/suixinkan/Assets.xcassets/tab_data_unselected.imageset/tab_data_unselected.png new file mode 100644 index 0000000000000000000000000000000000000000..cd2a5597fe84b51ecc7306c2bfe996621fa5ac39 GIT binary patch literal 1169 zcmV;C1aA9@P)P000>X1^@s6#OZ}&000D7Nkl4@s3lhDX%FVs^eCP3f=M-VrrPNBh++00K zy~Q={w%YuVUO?k2Ze#?#h*7^nO>6(S@(SO_$l(tITxLS`Sr) zh(J{URe%UY1Y>H)%d&(>bx+FTo9inVy4!(h3qUzZNWQxHL#NT0i_5Y^QRD)x>p%qP z#C-x(b-W?(JhQRr_n#*>R+c*>dt;DRnwoCAU0uET{rRY|=f^>Rv#LGDRF0Wy4243s zl~@%O5g~{gCfnR>Utei;M|Ov=l;Y0qpx7Jz;(U0b$aA4>005BXB~%s88d$^FP9;$l z?*l6G!5{8v|5TD($^cSsrKtgt=6ixO&WFvS$aEF}0DN-p6uwwKhr=(=qbMs7P4k9{ zxF~XUK3tIbxibK1D@_eIR}WHs!7N$p6rinw5rLT?qKHC|_uqLF$KN=F*Iqq$`qlte0ka0CFl-FC%5tzUt788sGYkNoPRFQHIHYaOAZHPH2USHF z_?b>;d4WMzpsZy2KotN5oleJ0f>eNJBgGA)gQ|jvCR8`_l^`Pc_=C6c`KL=bFuw=Y zBoT-}q=VY-5QK=72u3Xv^!kM^QvJ!|+ri+BxKot*xx|?vbS?ffA9uXA7UUuZ-D);FHPG7lqGF3W;Mt2+SDTU;B7PbrRX2gTm#SLegyd7dc~@no+u zhPQf`Gce54z05L1P&x0p$Ore`)Bbx&=TZiuT6nFr%Sm#1Krq*gb;QI9MHL3FPRTf3 zZk!?jm^>G$yRfy609;Fw%Y#<8%cIl-n4Tw5G#5)%B7cE-;+$t|EjBlI&Xci(lY}IW zW4^Jn+{yaS+LcuIobwzt8YXHqjPrqU&a<C}6%z%;7=nf%4sx+l2m=%>khZjQ&R%PMKI}QC=Q1-rXQop$;Y;?M z%v$UJ_y6s+{>xr#1MlL03tX3W=0KvJ$K!6YamdWcT zvJ(j|V2GGyAds74?buD$*_&ew5+DLgiYkLbKqNq8EPV*KRSs>)frnzXnrprwFt1Tr z23D(##rm-;T;gtyit$vE0006;fTChdoZA!DzkWrvT8-rco_BmVM1a_tJ+L8Nmp<&0 zWV`o1o=OrO)&S8tXM9mS>x;%G?%cIwrs-fEf5yhf2mmhimpPl9?Td!U#j@Kxwm3A)%Taj|Ak-v{%-@5nA1!W!5CvGT`KAOBm>%#_3`OZ zSqWr&Yo|l}fFueUY+aFvF=BXCiZe$}LySUE1jHz8+He|@#4V8sAc%^hAujs*cYc2Q zahprDh-7nRc*FWFfX)lP0GHsRP1PYr7(-ZVU<{W`pa}wu(F5Q)t_Wwf+uT84G{4LTRjlHRzp;Jtv*-PR_ZH-{Y>%%s6U zmdP(G}f=_<dN* z+TGk6D-CB>dgszw!mzaiR^Hb1`?es+*jKt+dx%K>#Z$Why95Nkzq_e-X$AMJ6afub z!k+>VVu%4UobK-HCE_p>3V+aA%Z`Hoorg%n;Qd>$@nCmni%2!k1pq#=uL63(7+3C; zEr1YX#}#Ae(0IarE!yA10+MwJ0Pd><_fosf9YmTL?e?#H?u{t?gNEV)r94TjTfGX_ z7$nZZ8iO^f)0VH2#G0=D)x&9r{F>nu))-WrE9Hk5tc*$-u-r1G{$AZV@kaTob$s== z=MmLvHA^z=+FN@l#(1S9Lqbgn2{0t;jRHS=@G&@RAqWIA#_6Bu5Vw))>bHoM3|mL!-M13^3j0JYjr>_pq~Mn^)No}Ly! z)PV<0(b(^j$~oQ_Y7dMg(I`9~`Rg+s>&}oE8mfSEL?3-(A7Yzj)))+>NlX5*C;#2i zZ%C{fn*a4dpj?vB7sZRda1S20wSC6AkYzH}D&wAS)ow|W^rl8*HWIzHxiO|gSWw40 zH-=!_h(Y^1i6|yXY8v(Wp4+d#e6nd{hdtdw)f@uAqF%qZQJ;O*xx@&F-Q$+)%>6oh zxn-J|qEUakakzdT09LELL8v#glgcvj&RsiRGKRO69zx7VW~Ct@k}PAV;q7~?SH6~I z;(WXDiySND1THm=b+6~n+CA^&u|n|SmgMmCtw0{j+31@{CwAXct2*m$1_AF+(Ls+* z3;_5LzBzf__)RAgT=eNmVwPoQ^4f{q7yhac{B)9}CMo?!5JI`+mQeweJLM5T5TL{* zrcxO)A^4|#;jembi}EbXj80H8^?Mi!0NQ!i17{A|^lE@#vd(R79fo=j#UKrM7z&BT zT3UPjFw}ehJc%C`_4>Vc?%MHEn+;1p3~e9RemuQ#%zQ%1Y)g33*Zo_qXZ9#c$wn<;Qe#XxfvT92ddY9;Xh5C1Q$Okn|002t}1^@s6I8J)%000i(NklUFw=%m=wDe;6s4{aNd(f& z2+=wywn>9fH~ps|LdZ;nK!94Q6>C&f3PDgx)(|Ih(l~e%2Y;=--ko{xo*#d_nccN_ zW_Nb88?Ph(q|r+6op;}TzdiTdbI(2Z0M~F0*KiG259EV;6$Jze#iAS;7?3?cI1k?9u*0C2UxVAaSX zDfvo8a{wv;_Kf8S0Hu=HO1+~{paQ^=fr>QVQ_kf~L{^2kl_pEd<+6^A!Iet++T0t3 zLOCb_2W~kUjyrDd-ZQi$KOZ?^P8d3Uv;m3bOzU0RUmakc1==phj{Ez?4AF zQgBMhlMp#3316Yfn-f#xKYX_I*aQF+3Zou4j8dr>fcLL$@0Tnom&=;ZSTz_TIm)@nM{RKE(ua70#Q|kI$sww zgd|Q#c@4CG61Z>t!Efij2LQQp+3gt{W2sbHmfc(yS>Y+rLEX)jXZR!=k{hc}ctNma6?8}$;e<@gU z=X2$caNt{gHJ*J~R33)NeHow8T3j;_1gNV>&SI!*p%{gd&30;BoeltBHVc1Y z>(2k#Q^UjO3WZVMu&?c6NgvZ7YVUz^Ul-&{qWYNg+LOd_I>ZFJ)HYWe1QG$fk0OL5 zT(DpVrv%R&+Lu4w_?~v#(sl(41!^Uq50CFJug{9?1>{jx=}F=^CP@e!))-L$Ab=;y zB#vWM?NODzS<2og{^a?Mm3%%le6=>)S{#J}wO9m;2P+$^VvjlTUlgF%%z~sOT@@fL zIQ7nmi4g3M(cus7fAp766$+;9ILqy@D!^gQS1OtaAM)b%In`ccNUkQL06;`tU`U+P zUhnlW)RKpCgz(q^5es}&+5Fw%MNDe|ev!eAwz52K@_3yv1Q(9OX? z02uW#-u=AKWbdd=UnE3yHI%BESH@Kgx)9X3HjOCC-h?E4>XDI=?_iOoP)p5vuu$+r zLqkcj?!-?)T%7Xa+8R;Lu?iW_wTP!;raWwCkVx|!d`-fmm3Zm59L1aN~|G_}EA9#0}dw&)lol68yvW z$MC&>f34A{6@7Q({iMcNdat$Zx=$a)pb-zkhl(tTY=f{ zzZ}iTl1ifu&pQbASx9DLPb=HWRKsM3iOV!!()%l{)R*;vVrGCykNW5aAdTfWLlc`t z>=^@dg>nYuF7JIdgn+BuwQ7mfZU#8jt`KbZ$jHA%C&um#0Oj&f^nA@C02Hxf;<%&8 zRu^SJ&~Wv7?2AD_gecnqQC$B&7mj(L*mM@2r&)z!QA(wf6%M}CpCD`!07Bu1mZ~~v z1Py(WWOtQHr7@(6w6JCk3=9YWR4v{^VuOVM%7>dO3WPKe?1@<22>?gxJj}&B%^Dlq zA^@O~--^UKZ5jSe!)P~qay9&=m4KN+1fBGH9RTd9^Dr0lG;4hO(R7)XgzX~INwX!- zgd~szgNi^^pb7wlam6;HR~Dqu30(Ofy$O>eitOi8n62)(5?)z&~A%d2g)p|B0YFwjJy@()~A&!$7wfCxs zyj%A0CMaY8A(O3S=8@HRy1$;xArlr7h_>)9uMh|zBmo`S2s^Lqo0+I5CZ}=s+y#j0 zvL;y-NC*L-oCoIcFbAzSEJSKdbz9cT98Ulsv3X+;?!RX@cJJH+DJO#k04g6qZtJ2D0A@rs^0@o<8}Purw_S37+otvC>B{1z zZ~hC;oWHn?kdjKU018_U!zRm}GbuC1cS90_G~&Nk8Zzs8Y}>K{W`|!H9|HBB9P*o&JQibqXrIfE78K^XM#24I=wj}-$$P2p0X2cbR2-SHAL%AS8D9^%$R)DbO!Ia!(WUZpvBU(D^rOrm zqOaCu;y>#dMAod8mMs?w8lDlvl%!y-y#@^YBfeJPA(z4BNM^<=BZ+nQ`Iz)qz#ays0z&zfKPvU-)EnEWMm|I zZg@CuCf{WJM1Ww#>2s4Uhluy?lK*}PhI8jHqS^jr zno*;dXjcft#N<@Vh->6s`-^Cikj-}L^wi|*!tnP1@al;ZEywnPt&Wb4`WKEKmCcjA z&qlsuIF75Vrv)uK6kDMghYOwZSqb^(a_Qbzl;8K zT)C_}jw91Wep#IRErO0_ay6%S*KHLA8k>bfukFO|0YGJu!<&m~76IVUzWh{(GmAzv)%?t7_v&%7S_H zYY_w!?;>v&CP{nz=nnbXp0O=bDh(~F0PVzI2n<>!|CxY{e<4ZinGkHkiSwi_`84R2 z1c{*Hd@!3x7!G*K3*}tSfWfxTPPY}TDwV_v1=IbHe)<%;*f7l3YOjZxpf@?;CG*{ z{0tF357D0$;VrIF*8zZqBrSXanou~Cqq^+64n#e;2?(63Lp_WH(vT!^0?2DZ`$qx( zc4yDIZx0U-$5*7T!`$c7+A}#e#{QEBD-S4=pNGgT7I2%0Zh>HfbFRbt%uL?-yow=p zHYh?66r{)8q(SGriXrJq-MBW5V0IDY1(NTo$T3s-A!^~_dRftUlHvs4qkxn*h(YW;E)w#5EiWw{f zkOs3kwP=8gLR=&;3Gg%^Z;9&b4B<_I91Yp2|K9)TZ=3=ewP=81aWJez<)f9hAyO`v z^*d+I=*aLR$=r0MT)CXt@z2LySN~1hDN}o>(N+ce8&!@7^hlayy-vk-njr>x9wIe> zlZ`4z0r+1RFfLw>Pm;%aClH!dR2mpSSd&$bn&DdgtoQYvbZ%Uw%4}=eDZYklxQ1)E a68L{o$lLC`P000>X1^@s6#OZ}&0009jNkl_}aH<`*p#{{*sv9Xwmg~mFF zXd*}~gmjwGXu!fWN?`8eoMmy(y}9!+6UV*s4WsOG_e$x8XZ$7ae&2-#SIx zJ%=S4l%40mHwG4c5Z}uTr-hYh_a<4$(s~!w+xeF8j>^2gkr1-`rZlHA)W<3B#n~PH zyOK->9LocGJ~HQs0dgAub~Hk%hoR4Hdc%kD`*xyRo3@;V^=O>P=ghfe&Jlf$l>b5i zrIh*_wIk+TbUdH69?h&EiYdWLv=;N2+IfWoHn(K|b_kR%g)0)Yjw7XJUj*Zji*El?dJ|lkoY=K2ednsm zgGSnYlT21qDU4im$RmzMGoEZgE8N^O`*(^!xM@KPh0G9Dxa+c6ssBfEJD zL#gOivQA}9+nw1BjT_uk<`&pfxEuVW{x2fmLT?vY8yuhxMG4UX$w1+Uh9`d~G$Jn#?=C<;Dsd z;gaxVr;y3s^i*Egc*Rowh`*$JaZv4UgPGl!_@#@p^H$Rc#yDr_ltQWP?vGaJYjBs! zp-!G-t@RD1vO8O?LS=~3x!HNgDVbEv)wpbEQ6{Ez3K9S9R~Oh1~T9{RhXRUyG7>sJs9G002ovPDHLkV1h(EuHXOw literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@2x.png b/suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..50f856bf4d8e05a0e773d5608d67f9def6846dee GIT binary patch literal 1673 zcmV;426p+0P)pWe4LIZf>DOX z3JJ!>j~9Y9XpA2b42c>|jGt(Np+Nac1>~a*EkWkqbCwVH-095ynBHM#$~^E-&coej zpS{+9ueI0SYwgP$*jR{l88tKP8#DGkDI(WJ?wVmH3-a`nGm}NH@7iJQEHaaY*{H#u zd^fJbM{yClctrS>((imdo*epSl~_HInJgCEWlx^3_GN|ZwY+PIglwM55$SH}cDKdR z1vgwJq16#tJfqY3N#SN~7phSityrnh!o0)MUUTuYp|M^AUK^3cv$#9oDSQPtXrZf; z3NdEvR12w8s&u6vVAfnbwZyvXPGs@S?aHf#12);B11gjgjngAkXk*^PYG1NH?j4db zAy!7DFJNz;qqbL?)^@h;3J46N(o*U;Asq0Eo81v7S4w6wB8y#VIxi8vWy+Ph$W@W( zqY_FbD)+1Ga$EdsC9Zb*SU!`5h-^rFTH%*Axl%_ZS}ALJ)^SA zT--g*GQ&jr9e3vr;SQy?ZWAhB52RX4q4Gazr@8pF(2AI@@x z(q%g84MPG#sjF7{kdCdeIOiGVGS{tBy0v=r<7K#Z@YN_H@7u6M`bh5|Y#K#m^BGWO zwRrPj!zd!h*I$oS1+8Bt|57@^}Ri#%l`*Eka4$YAp@k#P7-=(8%+9vN&J zCQ^GyCC8?!uO~vNQFwIl)#$}ud#NF^k({hIxs_vT&kep@ytDU|4lfGNDrgd?je(R3 zgclTE!YQ3CCenAL(sAiof!IJqLN-3~ta-zq83!T^~?*dt;HOwLIWuzjb@O(DZ%Y zP5DDyvuM0wSt*qYl^3);1|D2Wd?}GxNrrPh>V*F)T(C^!3a32xBJiE)*qNIgh?nq_ z<{8FJPMMAQX6i0nl)jC2vuHwZooSB>DoPi96Hw zWaVtPn~h$K-D-KKm3AszuGU{4rF zi^Rg4C%o#g(#4JYEGI04XzIbCWs9(7q?F#RRjMZ}ZuAy9wFh;Yg+4-)5r@WRW4t+@ z6Mmx*>WPmkWfLZAoiR^$VUbRHkCIBEcE4|Xad0DChKN&TmX?D$j%hV9V={zLEc;A; zFH>nNbR5U`MC7<@?`0NPgchyPk$G0YvE<{cDXeUF5J_MQ+I;N>G|ZYyjo!guF!J+k}p?l zpT+9csQpL!D-M{8`xbOq29saCMWk(6dao@yF2be4J8+J0o^+l`ZormGukeg?LO3oR z5&ofY*yEmXDCXDlPX#?}%QIgGUcuiyR_GMjJ9&-!!^~P?U;hlZ(f@q&2FBz6u=3D< TKc{vl00000NkvXXu0mjfG!;Qm literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@3x.png b/suixinkan/Assets.xcassets/tab_home_selected.imageset/tab_home_selected@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c4f2c7d3d9db94b6fa448204b5343685bb8f04 GIT binary patch literal 2910 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 YKUc|{U_eHR%m4rY07*qoM6N<$f{{}C^#A|> literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@3x.png b/suixinkan/Assets.xcassets/tab_home_unselected.imageset/tab_home_unselected@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..95bc97d50cd96059600f6bd65d3fda7bf12f5123 GIT binary patch literal 3892 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 P00000NkvXXu0mjfp0itN literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@2x.png b/suixinkan/Assets.xcassets/tab_order_selected.imageset/tab_order_selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9a189278b34a27b8848f88d56020d8b1e2d6d8ac GIT binary patch literal 1246 zcmV<41R?v0P)2oqA#D{0MR1@KF+%A;5TvC@lR+gQ(sm*$1PAgWN^$V=M$(E2 zh~lh+&T2X+9W;}o6NeQQG#wR66$HOc)V$n#&RHFtb02xn`*H5M*O#FF;Z81lueJVr zeV)Df9@iGq@0kZGh|ihV_+YVkUKsm!fq2bQq{)1c0`UxZe!w!HUCFt zpi(GW$Sn-?P?5q}gNZBGBWpuuhQdg-qEvb!Zc(`t*YBW_8G2b^s6R{H4itt?#6EjG zfMUC97vp6Onh;E_lIk4E3;HmvwPC{>NRT1`?ZWq8!8r(N)Z3e}7v62b)( zE=wL(s#L0`NW_+oo}2ZZvF4!tvF?)p&9)twes;AN+BVHxh#j?OmVwhrT)BEilWpG++bUe*^fnI`BN9Tp z&})OV$T2KNBwtMVHU#6-xE;C^NhtkS@&Q}*zq_PxQ0A7dQo0bSJH}=I)c25~uezz; zfxhb${$$0y1}&=D4$M!aZjA7mKcxT7y?+``#z(SkI$C3XB1z9>B*(19tN76D>1q}# z92S0Nv(Ygp7RiwnJ@<6pKMtkNnbw_1V7N$~8H3c_vx|hpH*smuS>__4mGq@0w!`|< zY8OMRo>s#bhW@7V-V&N(g&Xl}nf=YgFqh0OL<+0=F8RCD>9-yBPsUp0R{h4Ng84q2 zyAa8gNN#m9ek%D$k|{a{MLqn7+&-0`G?gp+=KBbFbLDfF%0E;-mKLZt^|V$B2jmVJ z7=1p>h3?5-3CRJu1D$1DiP)0aDc=^Eev?pk4ymt8t1s$0Vv&XzGWkMt?+A(J_GOnn z66i@vmy|xSoLTFDp1lg4Zlt?Rzm>jB;Vt1YJs;bY%R2g{lI&3$IE3f*-C?Mjw|sP& ze#_>H=pCoiYjf|PhP8M@-yI62IlbH^v_@n6eb(YdyxVm8ZXQWn8S-NsbGe&cU5M24 zRptkJPAqNK$}lwgZl60#7V9H}rp_z}_3>PlK4R;>_NrsivU$zmJ3=H}5MAyxmWXI7 zV&&qrW#fsg$LRmJuPBdK<2^i@8kz9M4%@b2vPUA4p_dJux7xf@gld<6^=07Dc|Cs> zF)=bGhs@|@=<&E)&r5Q*?`nXJ{80F}$|Fvv*QUM4&oHfd5Iqq;a-9cNj^gmrjUI2= z`#2}}7k^Ce&3e_HjR`Tit7u_EyI_e(PF002t}1^@s6I8J)%000K@Nkl{3bs;XINuf1Ollf?7-g}RWd*>rIGxOee?!D>g`-jU6 z!<_S+^PKZM=RD_&Awz}?**t{SB~HYy^EJr5K{OfWYbeo>CTOo`O~k}x$Q_EmFk+Vl zQ5Zme6paWLyy;l@(o()H&}l;mI9)0x_>AqgyKJzgir9jSX0OP%1!_`OtWw~&%=)1D z4fL!`z+2VihgezGf3X2&#bCe0xWof;uUoq?rZM&y#Krb+zWInSanqbM(b8?0wVL0qAnL-A43ZL7%6<>qvpHSc%6AO7;5dh|)P z!Y+&vS8DCdZHP**~(uu zqo*gBHWf0tdj-3$kax9@QC;^-9JRya4#%5KhTKH#TL=BM?P7)(?ZhFe$FM_g0V93n zl8a8-;w$ET8Xpo$7hjdatccEvP6>V__`H=4|7sLw+mq@F<}CP*F~^)X=Y+iUdu!64 z&$?T1AY{H3_lX`6jLP%`-M-Qn75Soh-_!A|+>4$Jm-obQ?*(+}Pc+UVTx`*8k5LDysrRWmRCP ztO^X3Re_exQ8Zn%jJ2eX3HFM1mgT5bUClW7 zAd%W5w}%$ZFi54%No;O3%oXh#HnbR1od%nx*&XSPEW->=V>{GMZ{N3nN~b~E=vnRd zuBuDS6=-q>U#yJ}wgf#m`2cJ3ebSt=Iubp(XhwUzYpafKxm8v>^((8GnD%5|!i#vP z+#G10;5wNHMGs1J>Q-3Y;ZD>M^jyH#9Si@cHUEA%9DgZzRqCdJ56rDX{kFZ>vqrsH zd*1!BU9)}zLWr$>rv*=imqoJ@wL5@%m9;!` z-r+i5ZtJ$z5>p{_Fn&&Pl6sSbJHe>v#}3DD;C#(8Rwo))9C#cnH!e0sxD%wt@yV7} zvINRHV5qDL43$-Z{*{%NCl~&= z2xYzcqJIaUnitKNA~rW+>F2ye-w$c@udK|h;Nmqp>`_0(<>O0~PagEa`erz}G_5=% zc!O3Kikl&pE+ugWXNX}%Jy)dmI3+VvUQ=54GUNM{o>b5?E%A!u;k*-) z_3j$duY*6LxZ*$U1<~`m63R1no5w8U($3F_AbK7r`?+VhNPo(j47uHcr^CN2IBw2w zk?BaKOUG_kzgB)NzamnM5Ojca zdmU*aCQih557ySj{+L#I%V8xO>je`raZc(3LM^YYHN_30VgV;NDc14g(U2iShP>bT Y4`tfWUfeG#%>V!Z07*qoM6N<$f)|C1y8r+H literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/TabOrderUnselected.imageset/Contents.json b/suixinkan/Assets.xcassets/tab_order_unselected.imageset/Contents.json similarity index 76% rename from suixinkan/Assets.xcassets/TabOrderUnselected.imageset/Contents.json rename to suixinkan/Assets.xcassets/tab_order_unselected.imageset/Contents.json index 0241d89..89b0894 100644 --- a/suixinkan/Assets.xcassets/TabOrderUnselected.imageset/Contents.json +++ b/suixinkan/Assets.xcassets/tab_order_unselected.imageset/Contents.json @@ -6,10 +6,12 @@ "scale" : "1x" }, { + "filename" : "tab_order_unselected@2x.png", "idiom" : "universal", "scale" : "2x" }, { + "filename" : "tab_order_unselected@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected.png b/suixinkan/Assets.xcassets/tab_order_unselected.imageset/tab_order_unselected.png new file mode 100644 index 0000000000000000000000000000000000000000..90a3d32da8fd571a0c41199e27bc2cc9458c581a GIT binary patch literal 1026 zcmV+d1pWJoP)P000>X1^@s6#OZ}&000BYNkl+`=4@|pe;feRNuc?*&I3DETUA~E zCgsArE2raX^=4UmNC*l;wZ@rH7T>7KOz)o$ii*-&N9!DXUOu_> z+H>nWybb_nW>&df|C1mzgb+wN6-B9q#Fgq<>!Pzz?I|=7$^t&m1OQ1ggtBx|WDUY8 z0P8!veT_Fn07!xa0BbFcu?(R^D2w6dk%*$$hy;iTx_)GrXAgZMqDs5#Pl$w;gm6a* zOHeTYg;Eqj!DGhoux@86s(k}BG{OL&M5t5}n`iBXZlnkRQ}_(3cw@6{y+|h1T!%6#z4D>9lrU3;&w!q3-B*MPh7eFq zYA2$&dSXlvE{Np&p=|S2AnTs!p06m zQ5FjFJ_4vmeV&3k-1L9T1R{cJGLb}aWeQM?UUS{^!sp1+HaL0}ju9awaTSv>pH;aDF`0;p6oW*`&=-vB1VE#?p?&80qGM_QUOq*0)^S$ zcOz$iL}UV}0I;h4J`MmjHZ~LhM2a80r?1u~;?jGNqi^s?5mmT2Ha<=Bfbe}U?=H#C z+q`)3<7Zr)T#!&sDHJ;9iS7jfB?#->pSjPL-Z}rmm%VTO0D%(QE4_aGy2IKUx_>46 wVGWp_Mf1#=a*$^v=2lj0*XX}M+4b+oKcqt7jG(Dr!~g&Q07*qoM6N<$fark)$b~+|oTLTUTH-Eo94q8dSk)(|e zR%HQ^nLMBxk)#cf#RdRw1FqHT-!!Jx0=BnX*6UGMMx@p1yIzlzS8Ras_l#PVxrPt| z5RUR2sxtRrQ~=g%x651H?k!lSV=@n!*;~tuAPoR6Jo(Fek^1}1Y<>LC2*4r6AdQCa zSB3jfbA9a(!{JWA(F+us%?&@?ee2^%CRg%YzvP^ReV+gT)$8>3r;Cq#`LBm#nS@yr z5~OuH9SJA49(T^21^9l*4O25iBWq$b9A5K?uV;;>l*K3&nax8rq*d4U;r{JnA4xH{Oj>qDdA-wNkY=<%XRMOnE)tWG& zGgAv;uC%`&;Ov5PV=T$pW9Kf2^I=}vtH)AA%*Yy#H-_`DfZf1YN|PnY>9Vrsgdj2eoVQ3L?r_~E1Nzb|e-9p|6vzba0!SK1e{ zU6=?-pAUBd;=%LJTz-+jzd#7)%euEh02mZz_ZaZ8e7Fl9Y`W$|{WC(QE=fPNnrurL z3^7zVwllI1GecFCb#<5s;zn=1C~6x5u+`oh7=W5`U+8vAcjq@3A8S9fu>A~N zc)ITzo9ka4?d${)$s)FO6p>I>fZ6FMo*jJDRpC{pDj_Dd_E!uQoli_8*??9bh#|m$ zh5Mexi4d+VayaKdVj6#I&bM`4-nm#P{~<4SVy-h=wWO6+5qf@mV*oOq0DK;6VOwpEQ#)#Fvf z%#b80LkOc7!|O0e{o+V~P=F_sBweej5_PyN-o^u(q?v@O{IeIFjpkpAVlJxIV&X*T zj4@g~6+`u0nq~KuWvPp{D~or(hL|L&R7JVnd#wG^qV}_J{?g@_eUjZ*6=ekf%R~V4 zMLq-t51hMn`A1N_Mv|n|dqOlNKn3_70uL6WT>$16J##hc2&t+Nk-M@q`=;t@8ekEJ zsw|)yQRk4<&RQ`>i=&Z(;PPEC0fPZ1$6iPFCUkEHvMg@8QeGU(JdfN_`2Qe6;4M=f zzwx+DFc?kMV4Qj1G?7TBV*&uCyfQw_RNS8T;YQHRK!d$}Ft)>(qDU8J#wv0Bsw}T& zjixss8lcDfv6wd2TouZzNt!)xw*P~KTQPOZv|4>P7_{TLOM_2(ksph5TgQ6UZU#_L zh4L?ee&gb!?U!1umKzKP6EBF5h|CDkI#2fB9TI%S)XosRXQe;002t}1^@s6I8J)%000RwNkllCT7n?86P{YC6Kc z`I7>TM&smp#m}0}n@{7^)L*4uuM7GVt}n6TI5yMM)2!F)9)Q2EYl;MM99Pohx6W=P z>r`|UAbHcLrD#mQQg_x|NjM=!(C7v|jL)`L-P?96Osxqk;gGKy?@ z>6JhI7U!JzzOjvwZSA$zZaHxY6;Q&9UohZ{s`^uxA9?88H+}K-IF3z`8g{~(a3b0n zQ+C|@*cpuS8>qS`8X3Qwz=U&7)qC~c9e;@z@12s^TDtf8P zqRVp!a-rF*`%!ION^;||_Kv$;`?*L=jMT<1r{(S-TzBIQKX`akk|YwxanBm`^lIA~ zHZVWgTt7mr#1Z{ z$&XOgc1}kH#2Fh#1ect1cSIxq+OvP(rlmC9E+o4;{hoZ*^mK#uI{mkHKX5f^zYKE1 zi#U=|k9u1*{FtffU7)`|%WF^E`OQxr?Iq!fh`;-@$rbU_b}YIZs#g=}Itn2`z(nF) z9)?lPl3&QP)Bn(H)*o#&;sAi_X18le<2W|SEs4b6Pbd7c++#;ZuFdnz5iHa>C{)JA zPBX2=qw@y(OThe5$-GD&5CLIFgt7%jFCVK-oYz`h5RyGNB>+$rA4a3rW!Zf#oOAu; z{F5sQ0Ce$RT?@Q_dYVumbMAba;9Lv#HJBu5T8l?>8Z#M<)UFMJu&=&QRpFgOo~@v@ zxR{d+3qK1D2o+G@8Aks+KS`3=?P+S8UD9s0mO(rP_Xk0@{OE&=^rpnU+oh|1D=HdZ@lL0040k8n(q<%e;Yr0TGgj`nrG! zL`W2CdMCmFk)^B(KGVznLwaQ>Rsn`$6<{b<0fu4~U?^4rs##Vhp(-mNU!bDzX-!cS ztO5Qa!mO(z|8m7rRU3wMdA6X?>&JZflp76-O=;G^@?sX)&|D4bcdQM^z0VbW%r;I& zsbVPrV=O>3f7{o#|9EDmVfXE86k1?g3)|DC0dVgH2e8XnJMLUwqEsdOECNs!KvCOu z_s=icw=Z$+)wjW1&3fH$IUw6Wj;d`*+^;;O|ITDAh*i2bdH! z7lT;uT#mk$Vmna2gKsY{8xz=V;{7&N4y+lH#@Zl&_Z}TXbA3`#kX0exgCvXzI<8=r zYE>29cU{Bln@S_ns-ilO!1^lfR##bsy5jJCUt!c!mWpeZDtZV6lnE=Gl~g8{0z%Tz zm~y+MPBv8`s#29;m54`A76Nq0FUHhht9xaasVGzA-dP9;BRi`e0TEQnEd>xd5 zxOpW`b1uIMz*UAO(2@l!ce^1n&FWr9QC;nDu{=Km4o`-&=nSb5};Td_p z(pMzvWR%{v+q;3_g4)XAvh(hRi#EwWRFRV`VMo^Slv=Y$!229fopQ^(b?2VuLn_)b zMh4=uEP~qa|1MY3=z8zmDLyv@DI$O|BPx2GfqqDd1;PwOEP;&CU>j*6;@<{yL!jLg z5j4hJSTM4_MzabL@3qS&k$$OcoJD|MM5u#lf&idYmJxhC8C8zp+1}k!p@p{^tk~Ev zU{Qcd=Y}Qw*PbYQAbKp-`79D5qUgLsy<8MD#;_{EDw`Xs>c17{aX^n$VdEs0r&RT$ zBu}qGunIz95nZ0W7E-Ul{7cU?I(yDR0rPXW$Hn!z3m&LFcU>Kz-e){C_ux^+HmzCjlErybZv%jWRZz&0hm`E zTD1&&sG+Ua&MB<=h8Ga=;73nu3{;GMx%i= zO)Weg6)%rO(TE{nq44@Y7@Y8e;?6AViiei7I}r${lxnz5YTRYmg-Dsg)Ew zs-XR8|IRxf-e#=-yeh5)`K~YwqcDv6E6D(GE<>JWiy#lFm#0;;@7;dmXZII9s-SSk zcC3M$_dIa1!qg#nw>3DkeW=B$)LBxs-2x9AV_!7Lo_z1w!SnTc-4_+AZ{j#MX_^jf zV{Msi-=5kcXE_|pnrcBD$L7%H&GxK=Q=Hpy=oG3^$FpJXEXB-5!QL53l5XeL3>h+H c$o~ib0rN7!1RsOpoB#j-07*qoM6N<$f)-kqG5`Po literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/TabProfileSelected.imageset/Contents.json b/suixinkan/Assets.xcassets/tab_profile_selected.imageset/Contents.json similarity index 76% rename from suixinkan/Assets.xcassets/TabProfileSelected.imageset/Contents.json rename to suixinkan/Assets.xcassets/tab_profile_selected.imageset/Contents.json index 3c5e11e..33d4fa6 100644 --- a/suixinkan/Assets.xcassets/TabProfileSelected.imageset/Contents.json +++ b/suixinkan/Assets.xcassets/tab_profile_selected.imageset/Contents.json @@ -6,10 +6,12 @@ "scale" : "1x" }, { + "filename" : "tab_profile_selected@2x.png", "idiom" : "universal", "scale" : "2x" }, { + "filename" : "tab_profile_selected@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected.png b/suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f747733c25df4e9a070b0ed2b082a400716c3e GIT binary patch literal 710 zcmV;%0y+JOP)P000>X1^@s6#OZ}&0007wNklI67%~aG7?0`s!kV)x z)X3=JUw^1w@K*YE8E65dt^FnU3g7EHW8WCvQdQRUjs0!kdDrc=mNDx#zn&unDTJ47 zw1A{9$(^fj-`J+p`d%bO6L(beAv>z}-7_j7Em)UirNC1&ajPJaq!dIFP9cc}Wo_;! z$*Dtet05^2qiAdUtEAR!_dM0@^WSFTRzVI~+>~WWU^Y0~9JAVo%WRgn@K>@&d}PbB zZX;AJEJ+IY;I>cw?s)@o!WL#)+o8Vuy{Yhm!lv9}O1IQLu;sEH_sq(eA)6Yhc?TBX6PpV5O0r5=x2|%b>)UHTOit?KYPBT9 z!g;j}6m9$yUEc;W83*BmbAtE`N=G68| z_Te_+21&wGIHz>Rl0SJc{w1a8M=<&7OirYe3df@cpGzOXJ(7Leigm5`R5+*hJrBlr z*Vq^n6B0>5B!|=W3J+jxGJE!3zyV!>f2ETwJy}2F4_kbK+B4uJf>M4(h6eqJhmMsm&_A=m&PX8%yI> zwDBrOM~FyvxI^inMU_x$_F_UPEvl3bdfuImN4;t39%*cxClWeo#w9<|cDtTBuSRnu zwYJdnTMKS?GXB%AX3bWmx$_U@Uh$mU6yBlg7v9EpRuC!_Zno22uz!;rTL;aF?8!kF zZne#0SEJBXshk7z&CN6?ax5oe<*X%-YvpjpN77QLoVDneV7_@7X-*^}>7=4R z8+lY3O4V@?dAtk{dngukQqi;-_RWliobaDDr|mJb4&+&@StCm-vr1iOTy%$17IIiu zY1R@+NBCwuXVE>n&YDr88aciXBjq8!t<-haqK`Wjm-=(oc%%HJ=aIoEf1|cXw7gw~ zN-ZR5=y28VIkhCT6bkhG&XT*Fhzpa9@Ql4814L~;l}^M3&v>_f!W8Ew>5>)bMet;ooYf)ho%H!o0%E6?RFEsm3X@ zqc9nfl)|wg8%^Kvu(owfnuOSRL^`Qh_iWu)Q(mEEr{0KXOCekoo_2p+T6JykV#e5V z&4~=}?fcTJg`06e*oRjNvud-O_R>&-fh z_bAdO1BJL+6A0(kB$YsO`0CEJ>GzzjZli z<%v*c`J(6V_<{%G`)hn}fX$r_micI!lYAM66sS~rV4RK^o$@qLD%GfcN9m~hFK(eSZ>w_-&o3F=_{wy{+14qBrP9EZpc)!AD^wd^T^hzU8=&F?tIg;MnS0P7# zr?P%fgFf+juhMl!%Wg|5n~BrYN2R5-(eU8TS>y_lS!3{2N_d3a2vLJdj z@?w32$T8gFA6~O6#v!aFG8h6Yw`iHmQqQ#`BA+!&bHZC!#W;kuL>^xjsoyj;C2>;p zwXdY~W~{_GgtbKWEZ=lvo}sQik;te2l(*KNwL~^*h;#Y&IxDl+4w0*7m>YG=dPD{_ z`m`nQ($>Br!8JpXhttRM|7-fl=r`R-g=c+Q>7$YzS0=tKA}mNA^@MLb9gV*``M<)( ndwTj2eEk4C00000NkvXXu0mjfegWvD literal 0 HcmV?d00001 diff --git a/suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@3x.png b/suixinkan/Assets.xcassets/tab_profile_selected.imageset/tab_profile_selected@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b2996b3d9b83cac5727ed0fc033b65dbae6a124d GIT binary patch literal 2264 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 Void)? + var onLoadMore: (() async -> Void)? + var hasMore = false + + /// 判断当前配置是否包含任意刷新能力。 + var isEmpty: Bool { + onRefresh == nil && onLoadMore == nil + } +} + +extension View { + /// 为 SwiftUI `ScrollView` / `List` 绑定 MJRefresh 下拉刷新与上拉加载。 + func mjRefresh( + onRefresh: (() async -> Void)? = nil, + onLoadMore: (() async -> Void)? = nil, + hasMore: Bool = false + ) -> some View { + modifier( + MJRefreshModifier( + configuration: MJRefreshBindingConfiguration( + onRefresh: onRefresh, + onLoadMore: onLoadMore, + hasMore: hasMore + ) + ) + ) + } + + /// 为 SwiftUI 滚动容器仅绑定 MJRefresh 下拉刷新。 + func mjRefreshHeader(_ action: @escaping () async -> Void) -> some View { + mjRefresh(onRefresh: action) + } + + /// 为 SwiftUI 滚动容器仅绑定 MJRefresh 上拉加载更多。 + func mjRefreshFooter(hasMore: Bool, action: @escaping () async -> Void) -> some View { + mjRefresh(onLoadMore: action, hasMore: hasMore) + } +} + +/// SwiftUI 与 MJRefresh 的桥接修饰符,通过锚点视图定位底层 `UIScrollView`。 +private struct MJRefreshModifier: ViewModifier { + let configuration: MJRefreshBindingConfiguration + + func body(content: Content) -> some View { + content.background { + MJRefreshScrollAnchor(configuration: configuration) + .frame(width: 0, height: 0) + } + } +} + +/// 透明锚点视图,用于在 SwiftUI 滚动容器中查找并绑定 MJRefresh。 +private struct MJRefreshScrollAnchor: UIViewRepresentable { + let configuration: MJRefreshBindingConfiguration + + func makeCoordinator() -> Coordinator { + Coordinator() + } + + func makeUIView(context: Context) -> UIView { + let view = UIView(frame: .zero) + view.isUserInteractionEnabled = false + view.backgroundColor = .clear + return view + } + + func updateUIView(_ uiView: UIView, context: Context) { + context.coordinator.scheduleApply(configuration: configuration, from: uiView) + } + + static func dismantleUIView(_ uiView: UIView, coordinator: Coordinator) { + coordinator.unbind(from: uiView) + } + + /// MJRefresh 绑定协调器,负责创建、更新和释放 header/footer。 + final class Coordinator { + private weak var scrollView: UIScrollView? + private var configuration = MJRefreshBindingConfiguration() + private var pendingApply: DispatchWorkItem? + + /// 延迟到下一 runloop 绑定,确保 SwiftUI 已创建底层滚动视图。 + func scheduleApply(configuration: MJRefreshBindingConfiguration, from anchorView: UIView) { + pendingApply?.cancel() + let workItem = DispatchWorkItem { [weak self, weak anchorView] in + guard let self, let anchorView else { return } + guard let scrollView = anchorView.enclosingScrollView else { return } + self.apply(configuration: configuration, to: scrollView) + } + pendingApply = workItem + DispatchQueue.main.async(execute: workItem) + } + + /// 将最新配置应用到指定滚动视图。 + private func apply(configuration: MJRefreshBindingConfiguration, to scrollView: UIScrollView) { + self.scrollView = scrollView + self.configuration = configuration + + if configuration.isEmpty { + scrollView.mj_header = nil + scrollView.mj_footer = nil + return + } + + if let onRefresh = configuration.onRefresh { + if scrollView.mj_header == nil { + scrollView.mj_header = MJRefreshNormalHeader { [weak self] in + self?.performHeaderRefresh(onRefresh) + } + } + } else { + scrollView.mj_header = nil + } + + if let onLoadMore = configuration.onLoadMore { + if scrollView.mj_footer == nil { + scrollView.mj_footer = MJRefreshAutoNormalFooter { [weak self] in + self?.performFooterLoadMore(onLoadMore) + } + } + updateFooterState(hasMore: configuration.hasMore) + } else { + scrollView.mj_footer = nil + } + } + + /// 执行下拉刷新并在完成后结束 MJRefresh 动画。 + private func performHeaderRefresh(_ action: @escaping () async -> Void) { + Task { @MainActor in + await action() + await scrollView?.mj_header?.endRefreshing() + } + } + + /// 执行上拉加载并在完成后结束 MJRefresh 动画。 + private func performFooterLoadMore(_ action: @escaping () async -> Void) { + Task { @MainActor in + await action() + guard let scrollView else { return } + if configuration.hasMore { + await scrollView.mj_footer?.endRefreshing() + } else { + await scrollView.mj_footer?.endRefreshingWithNoMoreData() + } + } + } + + /// 根据是否还有更多数据更新 footer 状态。 + private func updateFooterState(hasMore: Bool) { + guard let footer = scrollView?.mj_footer else { return } + if hasMore { + footer.resetNoMoreData() + footer.isHidden = false + } else { + Task { @MainActor in + await footer.endRefreshingWithNoMoreData() + } + } + } + + /// 释放与锚点关联的 MJRefresh 组件。 + func unbind(from anchorView: UIView) { + pendingApply?.cancel() + pendingApply = nil + guard let scrollView = anchorView.enclosingScrollView, scrollView === self.scrollView else { return } + scrollView.mj_header = nil + scrollView.mj_footer = nil + self.scrollView = nil + } + } +} + +extension UIView { + /// 向上查找最近的 `UIScrollView`,供 SwiftUI 滚动容器桥接 MJRefresh。 + var enclosingScrollView: UIScrollView? { + var current: UIView? = self + while let view = current { + if let scrollView = view as? UIScrollView { + return scrollView + } + current = view.superview + } + return nil + } +} diff --git a/suixinkan/Features/Main/Main.md b/suixinkan/Features/Main/Main.md index caccf7b..30d2281 100644 --- a/suixinkan/Features/Main/Main.md +++ b/suixinkan/Features/Main/Main.md @@ -5,11 +5,12 @@ Main 模块负责登录后的主界面 Tab 容器,以及当前尚未迁移页面的占位入口。 主界面由 `MainTabsView` 承载: -- 根据 `MainTabBarConfiguration.activeStyle` 选择自定义 TabBar 或系统 `TabView`。 -- 默认使用自定义 TabBar;如需切回系统实现,将配置改为 `.system`。 -- 自定义和系统两套外壳都展示首页、订单、数据、我的四个 Tab。 +- 使用系统 `TabView` 展示登录后的底部导航。 +- 底部按顺序展示首页、订单、扫码、数据、我的五个入口。 +- 扫码入口只负责打开扫码页,不属于 `AppTab`,也不持有独立业务导航栈。 - 每个 Tab 内部都包裹独立的 `NavigationStack`,并通过 `TabNavigationStackHost` 复用同一套导航构建逻辑。 - 每个 Tab 的导航路径由 `AppRouter` 单独保存。 +- 订单 Tab 角标由 `MainTabBadgeViewModel` 提供,数量为 0 或获取失败时不显示。 ## Tab 结构 @@ -24,27 +25,21 @@ Main 模块负责登录后的主界面 Tab 容器,以及当前尚未迁移页 ## 导航流程 1. `MainTabsView` 从 Environment 读取 `AppRouter`。 -2. `MainTabsView` 根据 `MainTabBarConfiguration.activeStyle` 选择 `CustomMainTabsView` 或 `SystemMainTabsView`。 -3. 两套外壳都使用 `appRouter.selectedTab` 作为选中状态。 -4. 每个 Tab 通过 `TabNavigationStackHost` 创建自己的 `NavigationStack(path:)`。 +2. `TabView` 使用内部 `MainTabSelection` 作为选择值,普通 Tab 映射到 `AppTab`,扫码映射到 `.scanner`。 +3. 普通 Tab 切换时调用 `AppRouter.select(_:)` 更新当前业务 Tab。 +4. 每个普通 Tab 通过 `TabNavigationStackHost` 创建自己的 `NavigationStack(path:)`。 5. 路径绑定来自 `appRouter.binding(for:)`。 6. Tab 内页面需要进入尚未迁移的子页面时,通过当前 Tab 注入的 `RouterPath` push 一个 `AppRoute.placeholder`。 7. `navigationDestination` 根据 `AppRoute` 展示详情页。 8. 子页面展示时读取 `AppRoute.hidesTabBarWhenPushed`,默认隐藏底部 TabBar。 -## 自定义 TabBar +## 扫码入口 -自定义 TabBar 由 `CustomMainTabsView` 和 `CustomMainTabBar` 组成: -- `CustomMainTabsView` 负责保留已访问 Tab 页面、刷新订单角标、展示扫码页。 -- `CustomTabNavigationStackHost` 会把 `CustomMainTabBar` 拼在每个 Tab 的根页面内容下方。 -- `CustomMainTabBar` 只负责展示 UI,不直接读取账号、订单 API 或业务上下文。 -- `MainTabBadgeViewModel` 通过 `OrdersAPI.writeOffList` 获取待核销数量,失败时静默清空角标。 -- 中间扫码按钮使用订单模块已有的 `OrderScannerPage`。 -- 扫码成功后调用 `AppRouter.routeToOrderVerification(scannedCode:)`,订单页再通过 `consumePendingOrderScanCode()` 一次性消费结果。 -- 自定义 TabBar 只属于 Tab 根页面内容;当前 Tab 的导航栈 push 到二级页面后,目标页面不包含 TabBar,也不会保留底部占位高度。 -- 承载根页面和 `CustomMainTabBar` 的容器需要忽略键盘底部安全区,避免订单搜索框等输入控件唤起键盘时把自定义 TabBar 顶起。 +扫码入口是系统 `TabView` 中的中间入口,只显示 `qrcode.viewfinder` 图标,并通过无障碍标签标记为“扫码核销”。 -系统 `TabView` 外壳由 `SystemMainTabsView` 保留。系统模式不显示中间扫码按钮,但订单页内部的扫码核销入口仍然可用。 +点击扫码入口时,`MainTabsView` 拦截 `.scanner` 选择并展示订单模块已有的 `OrderScannerPage`,不会修改 `AppRouter.selectedTab`。因此用户关闭扫码页后,仍停留在打开扫码前的 Tab。 + +扫码成功后调用 `AppRouter.routeToOrderVerification(scannedCode:)`,订单页再通过 `consumePendingOrderScanCode()` 一次性消费结果。扫码失败时关闭扫码页并展示错误提示。 ## 后续迁移规则 @@ -55,5 +50,5 @@ Main 模块负责登录后的主界面 Tab 容器,以及当前尚未迁移页 - 需要从首页或全局入口进入订单核销时,优先使用 `AppRouter.selectOrders(entry:)` 或 `AppRouter.routeToOrderVerification(scannedCode:)`。 - Tab 内跳转通过当前 Tab 的 `RouterPath.navigate` 或扩展后的 `AppRoute` 处理。 - 普通业务子页面默认隐藏 TabBar;只有确有产品需求时,才在 `AppRoute` 策略中单独放开。 -- 不要把业务状态塞进自定义 TabBar 组件;TabBar 只接收绑定、文案和动作回调。 +- 不要把扫码入口加入 `AppTab`;它不是业务 Tab,只是主界面的全局动作入口。 - 真实业务页面接入后,应同步补充该模块文档和单元测试。 diff --git a/suixinkan/Features/Main/Views/CustomMainTabBar.swift b/suixinkan/Features/Main/Views/CustomMainTabBar.swift deleted file mode 100644 index e8989ed..0000000 --- a/suixinkan/Features/Main/Views/CustomMainTabBar.swift +++ /dev/null @@ -1,157 +0,0 @@ -// -// CustomMainTabBar.swift -// suixinkan -// -// Created by Codex on 2026/6/23. -// - -import SwiftUI - -/// 自定义主 TabBar,展示四个一级入口和中间扫码核销按钮。 -struct CustomMainTabBar: View { - @Binding var selectedTab: AppTab - - let orderBadgeText: String? - let onScanTap: () -> Void - - private let items = CustomMainTabItem.defaultItems - - var body: some View { - HStack(alignment: .center, spacing: 0) { - CustomMainTabBarItem( - item: items[0], - selectedTab: $selectedTab, - badgeText: nil - ) - CustomMainTabBarItem( - item: items[1], - selectedTab: $selectedTab, - badgeText: orderBadgeText - ) - CustomMainTabBarCenterAction(onScanTap: onScanTap) - .frame(width: 74) - CustomMainTabBarItem( - item: items[2], - selectedTab: $selectedTab, - badgeText: nil - ) - CustomMainTabBarItem( - item: items[3], - selectedTab: $selectedTab, - badgeText: nil - ) - } - .frame(maxWidth: .infinity) - .frame(height: 72) - .padding(.horizontal, 22) - .background(.white) - .overlay(alignment: .top) { - Rectangle() - .fill(Color.black.opacity(0.04)) - .frame(height: 0.5) - } - } -} - -/// 自定义 TabBar 单个入口的静态配置。 -private struct CustomMainTabItem { - let tab: AppTab - let title: String - let selectedImage: String - let unselectedImage: String - - static let defaultItems: [CustomMainTabItem] = [ - .init(tab: .home, title: "首页", selectedImage: "TabHomeSelected", unselectedImage: "TabHomeUnselected"), - .init(tab: .orders, title: "订单", selectedImage: "TabOrderSelected", unselectedImage: "TabOrderUnselected"), - .init(tab: .statistics, title: "数据", selectedImage: "TabDataSelected", unselectedImage: "TabDataUnselected"), - .init(tab: .profile, title: "我的", selectedImage: "TabProfileSelected", unselectedImage: "TabProfileUnselected") - ] -} - -/// 自定义 TabBar 的普通入口按钮。 -private struct CustomMainTabBarItem: View { - let item: CustomMainTabItem - @Binding var selectedTab: AppTab - let badgeText: String? - - private var isSelected: Bool { - selectedTab == item.tab - } - - var body: some View { - Button { - selectedTab = item.tab - } label: { - VStack(spacing: 3) { - ZStack(alignment: .topTrailing) { - Image(isSelected ? item.selectedImage : item.unselectedImage) - .renderingMode(.original) - .resizable() - .scaledToFit() - .frame(width: 24, height: 24) - - if let badgeText { - CustomMainTabBadge(text: badgeText) - } - } - Text(item.title) - .font(.system(size: 12, weight: isSelected ? .medium : .regular)) - .foregroundStyle(isSelected ? AppDesign.primary : Color(hex: 0x7D8DA3)) - .lineLimit(1) - .minimumScaleFactor(0.8) - } - .frame(maxWidth: .infinity) - .frame(height: 58) - .contentShape(Rectangle()) - } - .buttonStyle(.plain) - .accessibilityLabel(item.title) - .accessibilityIdentifier("main.tab.\(item.tab.rawValue)") - } -} - -/// 自定义 TabBar 中间的扫码核销按钮。 -private struct CustomMainTabBarCenterAction: View { - let onScanTap: () -> Void - - var body: some View { - Button(action: onScanTap) { - ZStack { - Circle() - .fill(AppDesign.primary) - .frame(width: 58, height: 58) - Image(systemName: "qrcode.viewfinder") - .font(.system(size: 30, weight: .bold)) - .foregroundStyle(.white) - } - .frame(width: 70, height: 64) - .contentShape(Circle()) - } - .buttonStyle(.plain) - .accessibilityLabel("扫码核销") - .accessibilityIdentifier("main.scan") - } -} - -/// 自定义 TabBar 的订单数量角标。 -private struct CustomMainTabBadge: View { - let text: String - - var body: some View { - Text(text) - .font(.system(size: 9, weight: .bold)) - .foregroundStyle(.white) - .frame(minWidth: 15, minHeight: 15) - .padding(.horizontal, 2) - .background(Color(hex: 0xEF4444), in: Capsule()) - .offset(x: 9, y: -7) - } -} - -#Preview { - CustomMainTabBar( - selectedTab: .constant(.orders), - orderBadgeText: "8", - onScanTap: {} - ) -} diff --git a/suixinkan/Features/Main/Views/MainTabsView.swift b/suixinkan/Features/Main/Views/MainTabsView.swift index 68bef32..1a7a4e3 100644 --- a/suixinkan/Features/Main/Views/MainTabsView.swift +++ b/suixinkan/Features/Main/Views/MainTabsView.swift @@ -7,46 +7,11 @@ import SwiftUI -/// 主 TabBar 样式,决定登录后首页使用系统 TabView 还是自定义底部栏。 -enum MainTabBarStyle { - case system - case custom -} - -/// 主 TabBar 配置,后续需要切回系统 TabView 时只修改 activeStyle。 -enum MainTabBarConfiguration { - static let activeStyle: MainTabBarStyle = .custom -} - -/// 主 Tab 容器视图,根据配置选择系统 TabView 或自定义 TabBar 外壳。 +/// 主 Tab 容器视图,使用系统 TabView 承载登录后的一级入口。 struct MainTabsView: View { - var body: some View { - switch MainTabBarConfiguration.activeStyle { - case .system: - SystemMainTabsView() - case .custom: - CustomMainTabsView() - } - } -} + private static let leadingTabs: [AppTab] = [.home, .orders] + private static let trailingTabs: [AppTab] = [.statistics, .profile] -/// 系统 TabView 外壳,保留原生 TabBar 行为以便后续切换回系统实现。 -private struct SystemMainTabsView: View { - @EnvironmentObject private var appRouter: AppRouter - - var body: some View { - TabView(selection: $appRouter.selectedTab) { - ForEach(AppTab.allCases) { tab in - TabNavigationStackHost(tab: tab) - .tabItem { tab.label } - .tag(tab) - } - } - } -} - -/// 自定义 TabBar 外壳,复用每个 Tab 独立 NavigationStack 并保留已访问页面状态。 -private struct CustomMainTabsView: View { @EnvironmentObject private var accountContext: AccountContext @EnvironmentObject private var appRouter: AppRouter @Environment(\.ordersAPI) private var ordersAPI @@ -54,33 +19,34 @@ private struct CustomMainTabsView: View { @StateObject private var badgeViewModel = MainTabBadgeViewModel() @State private var showScanner = false - @State private var loadedTabs: Set = [.home] - - private var orderBadgeText: String? { - guard let count = badgeViewModel.pendingWriteOffCount, count > 0 else { - return nil - } - return "\(count)" - } + @State private var tabSelection: MainTabSelection = .tab(.home) + @State private var selectedBusinessTab: AppTab = .home var body: some View { - ZStack { - ForEach(AppTab.allCases) { tab in - PreservedTabPage( - tab: tab, - selectedTab: appRouter.selectedTab, - isLoaded: loadedTabs.contains(tab) - ) { - CustomTabNavigationStackHost( - tab: tab, - selectedTab: $appRouter.selectedTab, - orderBadgeText: orderBadgeText, - onScanTap: { showScanner = true } - ) + TabView(selection: $tabSelection) { + ForEach(Self.leadingTabs) { tab in + TabNavigationStackHost(tab: tab) + .tabItem { tabItem(for: tab) } + .tag(MainTabSelection.tab(tab)) + .badge(tab == .orders ? badgeViewModel.pendingWriteOffCount ?? 0 : 0) + } + + ScannerTabPlaceholder() + .accessibilityIdentifier("main.scan") + .tabItem { + Image("icon_scan") + .accessibilityIdentifier("main.scan") + .accessibilityLabel("扫码核销") } + .tag(MainTabSelection.scanner) + + ForEach(Self.trailingTabs) { tab in + TabNavigationStackHost(tab: tab) + .tabItem { tabItem(for: tab) } + .tag(MainTabSelection.tab(tab)) + .badge(tab == .orders ? badgeViewModel.pendingWriteOffCount ?? 0 : 0) } } - .ignoresSafeArea(.keyboard, edges: .bottom) .fullScreenCover(isPresented: $showScanner) { OrderScannerPage( onClose: { showScanner = false }, @@ -94,12 +60,17 @@ private struct CustomMainTabsView: View { } ) } + .onAppear { + syncSelection(with: appRouter.selectedTab) + } + .onChange(of: tabSelection) { selection in + handleTabSelection(selection) + } .task { - loadedTabs.insert(appRouter.selectedTab) await refreshOrderBadge() } .onChange(of: appRouter.selectedTab) { selectedTab in - loadedTabs.insert(selectedTab) + syncSelection(with: selectedTab) guard selectedTab == .orders else { return } Task { await refreshOrderBadge() } } @@ -119,41 +90,51 @@ private struct CustomMainTabsView: View { storeId: accountContext.currentStore?.id ) } -} -/// 自定义 TabBar 模式下的单个 Tab 导航栈,TabBar 只属于根页面内容。 -private struct CustomTabNavigationStackHost: View { - @EnvironmentObject private var appRouter: AppRouter - - let tab: AppTab - @Binding var selectedTab: AppTab - let orderBadgeText: String? - let onScanTap: () -> Void - - var body: some View { - NavigationStack(path: appRouter.binding(for: tab)) { - VStack(spacing: 0) { - tab.rootView - .frame(maxWidth: .infinity, maxHeight: .infinity) - - CustomMainTabBar( - selectedTab: $selectedTab, - orderBadgeText: orderBadgeText, - onScanTap: onScanTap - ) - } - .ignoresSafeArea(.keyboard, edges: .bottom) - .navigationTitle(tab.title) - .navigationDestination(for: AppRoute.self) { route in - route.destinationView - .toolbar(route.hidesTabBarWhenPushed ? .hidden : .visible, for: .tabBar) - } + /// 处理系统 TabBar 选择变化,扫码入口只弹出页面并立即恢复之前的业务 Tab 选中态。 + private func handleTabSelection(_ selection: MainTabSelection) { + switch selection { + case .tab(let tab): + selectedBusinessTab = tab + guard appRouter.selectedTab != tab else { return } + appRouter.select(tab) + case .scanner: + showScanner = true + restoreBusinessTabSelection() } - .environmentObject(appRouter.router(for: tab)) + } + + /// 同步外部路由切换到系统 TabView 的可见选中态。 + private func syncSelection(with tab: AppTab) { + selectedBusinessTab = tab + guard tabSelection != .tab(tab) else { return } + tabSelection = .tab(tab) + } + + /// 在下一轮主线程恢复选中态,避免系统 TabBar 在扫码页关闭后仍高亮扫码入口。 + private func restoreBusinessTabSelection() { + let tab = selectedBusinessTab + DispatchQueue.main.async { + tabSelection = .tab(tab) + } + } + + /// 构建普通业务 Tab 的图标与标题。 + @ViewBuilder + private func tabItem(for tab: AppTab) -> some View { + Image(appRouter.selectedTab == tab ? tab.selectedImageName : tab.unselectedImageName) + .renderingMode(.original) + Text(tab.title) } } -/// 单个 Tab 对应的导航栈,供系统和自定义 TabBar 外壳共同复用。 +/// 主 TabView 内部选择项,扫码只用于拦截点击并不进入 AppTab 业务导航。 +private enum MainTabSelection: Hashable { + case tab(AppTab) + case scanner +} + +/// 单个业务 Tab 对应的系统导航栈。 private struct TabNavigationStackHost: View { @EnvironmentObject private var appRouter: AppRouter @@ -172,22 +153,10 @@ private struct TabNavigationStackHost: View { } } -/// 自定义 TabBar 中保持已加载 Tab 页面存活的容器。 -private struct PreservedTabPage: View { - let tab: AppTab - let selectedTab: AppTab - let isLoaded: Bool - @ViewBuilder let content: () -> Content - +/// 扫码 Tab 占位内容,实际点击会被 TabView selection 绑定拦截并展示扫码页。 +private struct ScannerTabPlaceholder: View { var body: some View { - if isLoaded { - content() - .frame(maxWidth: .infinity, maxHeight: .infinity) - .opacity(selectedTab == tab ? 1 : 0) - .zIndex(selectedTab == tab ? 1 : 0) - .allowsHitTesting(selectedTab == tab) - .accessibilityHidden(selectedTab != tab) - } + Color.clear } } diff --git a/suixinkan/Features/OperatingArea/Views/OperatingAreaViews.swift b/suixinkan/Features/OperatingArea/Views/OperatingAreaViews.swift index 534b579..695e35c 100644 --- a/suixinkan/Features/OperatingArea/Views/OperatingAreaViews.swift +++ b/suixinkan/Features/OperatingArea/Views/OperatingAreaViews.swift @@ -327,7 +327,9 @@ private struct OperatingAreaAMapRepresentable: UIViewRepresentable { CLLocationCoordinate2D(latitude: $0.latitude, longitude: $0.longitude) } guard coordinates.count >= 3 else { continue } - let polygon = MAPolygon(coordinates: &coordinates, count: UInt(coordinates.count)) + guard let polygon = MAPolygon(coordinates: &coordinates, count: UInt(coordinates.count)) else { + continue + } context.coordinator.ringsByOverlay[ObjectIdentifier(polygon)] = ring mapView.add(polygon) allCoordinates.append(contentsOf: coordinates) diff --git a/suixinkanTests/MJRefreshSupportTests.swift b/suixinkanTests/MJRefreshSupportTests.swift new file mode 100644 index 0000000..12a1cc1 --- /dev/null +++ b/suixinkanTests/MJRefreshSupportTests.swift @@ -0,0 +1,38 @@ +// +// MJRefreshSupportTests.swift +// suixinkanTests +// +// Created by Codex on 2026/6/26. +// + +import XCTest +@testable import suixinkan + +/// MJRefresh SwiftUI 桥接测试,覆盖滚动视图查找辅助逻辑。 +final class MJRefreshSupportTests: XCTestCase { + /// 测试锚点视图能向上找到最近的 UIScrollView。 + func testEnclosingScrollViewFindsParentScrollView() { + let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 320, height: 480)) + let container = UIView(frame: scrollView.bounds) + let anchor = UIView(frame: .zero) + scrollView.addSubview(container) + container.addSubview(anchor) + + XCTAssertIdentical(anchor.enclosingScrollView, scrollView) + } + + /// 测试没有父级 ScrollView 时返回 nil。 + func testEnclosingScrollViewReturnsNilWithoutScrollView() { + let view = UIView(frame: .zero) + XCTAssertNil(view.enclosingScrollView) + } +} + +extension MJRefreshSupportTests { + /// 断言两个对象引用相同。 + fileprivate func XCTAssertIdentical(_ expression1: AnyObject?, _ expression2: AnyObject?, file: StaticString = #filePath, line: UInt = #line) { + if expression1 !== expression2 { + XCTFail("Expected identical objects", file: file, line: line) + } + } +} diff --git a/suixinkanUITests/Orders/OrdersFlowUITests.swift b/suixinkanUITests/Orders/OrdersFlowUITests.swift index ccb0f5d..5ad26d8 100644 --- a/suixinkanUITests/Orders/OrdersFlowUITests.swift +++ b/suixinkanUITests/Orders/OrdersFlowUITests.swift @@ -59,17 +59,20 @@ final class OrdersFlowUITests: AuthenticatedUITestCase { } } - /// 测试扫码页可打开并关闭。 - func testScannerCanOpenAndClose() { - TabBarNavigator.select(.orders, app: app) + /// 测试全局扫码页可打开关闭,关闭后仍停留在打开前的 Tab。 + func testScannerCanOpenAndCloseWithoutChangingCurrentTab() { + TabBarNavigator.select(.home, app: app) - let scanButton = app.application.buttons["main.scan"] + let scanButton = TabBarNavigator.scannerButton(in: app) XCTAssertTrue(scanButton.waitForExistence(timeout: 6)) scanButton.tap() let closeButton = app.application.buttons["scanner.close"] XCTAssertTrue(closeButton.waitForExistence(timeout: 8)) closeButton.tap() - NavigationAssertions.waitForNavigationTitle("订单", in: app) + XCTAssertTrue( + app.application.staticTexts["常用应用"].waitForExistence(timeout: 8) + || app.application.staticTexts["请选择景区"].exists + ) } } diff --git a/suixinkanUITests/Support/SuixinkanUIApplication.swift b/suixinkanUITests/Support/SuixinkanUIApplication.swift index 7737d85..b915937 100644 --- a/suixinkanUITests/Support/SuixinkanUIApplication.swift +++ b/suixinkanUITests/Support/SuixinkanUIApplication.swift @@ -78,10 +78,7 @@ final class SuixinkanApp { /// 判断主 Tab 是否已出现。 var isOnMainTabs: Bool { - application.buttons[TabBarNavigator.Tab.home.identifier].exists - || application.buttons[TabBarNavigator.Tab.orders.identifier].exists - || application.buttons[TabBarNavigator.Tab.statistics.identifier].exists - || application.buttons[TabBarNavigator.Tab.profile.identifier].exists + TabBarNavigator.isVisible(in: self) } /// 等待冷启动后进入登录页或主 Tab。 diff --git a/suixinkanUITests/Support/TabBarNavigator.swift b/suixinkanUITests/Support/TabBarNavigator.swift index 81b2aa6..5bcc4a5 100644 --- a/suixinkanUITests/Support/TabBarNavigator.swift +++ b/suixinkanUITests/Support/TabBarNavigator.swift @@ -37,7 +37,31 @@ enum TabBarNavigator { app.waitForGlobalLoadingToDisappear() } - /// 在底部自定义 TabBar 中定位唯一可点击的 Tab 按钮。 + /// 获取主界面的扫码入口按钮。 + static func scannerButton(in app: SuixinkanApp) -> XCUIElement { + let identifiedButton = app.application.buttons["main.scan"] + if identifiedButton.exists { + return identifiedButton + } + + let systemTabButton = app.application.tabBars.buttons["扫码核销"] + if systemTabButton.exists { + return systemTabButton + } + + return bottomTabButton(named: "扫码核销", in: app) + } + + /// 判断主 Tab 是否已经出现在界面上。 + static func isVisible(in app: SuixinkanApp) -> Bool { + Tab.allCases.contains { tab in + app.application.tabBars.buttons[tab.rawValue].exists + || app.application.buttons[tab.identifier].exists + || app.application.buttons[tab.rawValue].exists + } + } + + /// 在底部系统 TabBar 或旧自定义 TabBar 中定位唯一可点击的 Tab 按钮。 private static func bottomTabButton(named title: String, in app: SuixinkanApp) -> XCUIElement { if let tab = Tab(rawValue: title) { let identifiedButton = app.application.buttons[tab.identifier] @@ -46,6 +70,11 @@ enum TabBarNavigator { } } + let systemTabButton = app.application.tabBars.buttons[title] + if systemTabButton.exists { + return systemTabButton + } + let candidates = app.application.buttons.matching(NSPredicate(format: "label == %@", title)) let screenHeight = app.application.windows.element(boundBy: 0).frame.height var bestMatch: XCUIElement?