From 69b2658e2cc6157c6087700b1e95a70eba190267 Mon Sep 17 00:00:00 2001 From: zjx Date: Mon, 30 Jun 2025 18:18:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=EF=BC=8C=E9=A6=96=E9=A1=B5=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- BeeReel.xcodeproj/project.pbxproj | 1051 +++++++++++++++++ .../Controller/BRNavigationController.swift | 44 + .../Base/Controller/BRTabBarController.swift | 118 ++ .../Base/Controller/BRViewController.swift | 54 + BeeReel/Base/Define/BRDefine.swift | 47 + BeeReel/Base/Define/BRUserDefaultsKey.swift | 17 + .../Extension/AttributedString+BRAdd.swift | 19 + .../CGMutablePath+BRRoundedCorner.swift | 65 + BeeReel/Base/Extension/String+BRAdd.swift | 12 + BeeReel/Base/Extension/UIColor+BRAdd.swift | 53 + BeeReel/Base/Extension/UIDevice+BRAdd.swift | 71 ++ BeeReel/Base/Extension/UIFont+BRAdd.swift | 24 + .../Base/Extension/UIImageView+BRAdd.swift | 24 + BeeReel/Base/Extension/UIScreen+BRAdd.swift | 49 + .../Base/Extension/UIStackView+BRAdd.swift | 18 + BeeReel/Base/Extension/UIView+BRAdd.swift | 94 ++ .../Base/Extension/UserDefaults+BRAdd.swift | 44 + BeeReel/Base/Model/BRListModel.swift | 22 + BeeReel/Base/Model/BRModel.swift | 15 + BeeReel/Base/Network/API/BRHomeAPI.swift | 32 + BeeReel/Base/Network/API/BRUserAPI.swift | 20 + BeeReel/Base/Network/API/BRVideoAPI.swift | 75 ++ .../Base/Network/Base/BRCryptorService.swift | 102 ++ BeeReel/Base/Network/Base/BRNetwork.swift | 229 ++++ .../Base/Network/Base/BRNetworkTarget.swift | 105 ++ BeeReel/Base/Network/Base/BRURLPath.swift | 39 + BeeReel/Base/View/BRCollectionView.swift | 22 + BeeReel/Base/View/BRCollectionViewCell.swift | 21 + BeeReel/Base/View/BRImageView.swift | 77 ++ BeeReel/Base/View/BRTableView.swift | 49 + BeeReel/Base/View/BRTableViewCell.swift | 49 + BeeReel/Base/View/TabBar/BRTabBar.swift | 224 ++++ BeeReel/Base/View/TabBar/BRTabBarItem.swift | 45 + .../View/TabBar/BRTabBarItemContainer.swift | 56 + .../View/TabBar/BRTabBarItemContentView.swift | 161 +++ .../BRHomeTop10ViewController.swift | 45 + .../Controller/BRHomeViewController.swift | 239 ++++ .../BRSpotlightViewViewController.swift | 71 ++ .../Class/Home/Model/BRHomeModuleItem.swift | 67 ++ .../Home/Model/BRPagerViewTransformer.swift | 61 + BeeReel/Class/Home/Model/BRShortModel.swift | 82 ++ .../Class/Home/Model/BRVideoInfoModel.swift | 29 + .../Home/View/BRHomeHeaderBannerCell.swift | 126 ++ .../Class/Home/View/BRHomeHeaderView.swift | 86 ++ .../View/Spotlight/BRSpotlightHotCell.swift | 163 +++ .../Spotlight/BRSpotlightHotMainCell.swift | 105 ++ .../Spotlight/BRSpotlightMainBaseCell.swift | 77 ++ .../View/Spotlight/BRSpotlightNewCell.swift | 107 ++ .../Spotlight/BRSpotlightNewMainCell.swift | 96 ++ .../Spotlight/BRSpotlightRecommandCell.swift | 79 ++ .../BRSpotlightRecommandMainCell.swift | 79 ++ .../View/Spotlight/BRSpotlightTopCell.swift | 144 +++ .../Spotlight/BRSpotlightTopMainCell.swift | 81 ++ .../Home/ViewModel/BRHomeViewModel.swift | 67 ++ .../BRPlayerListViewController.swift | 156 +++ .../BRVideoDetailViewController.swift | 75 ++ .../Class/Player/Model/BRPlayerProtocol.swift | 42 + .../Player/Model/BRVideoDetailModel.swift | 24 + .../Class/Player/View/BRPlayerListCell.swift | 87 ++ .../Player/ViewModel/BRPlayerViewModel.swift | 26 + .../ViewModel/BRVideoRevolutionManager.swift | 72 ++ BeeReel/Delegate/AppDelegate+BRConfig.swift | 14 + BeeReel/Delegate/AppDelegate.swift | 41 + BeeReel/Delegate/SceneDelegate.swift | 56 + BeeReel/Lib/AppTool/BRAppTool.swift | 55 + BeeReel/Lib/HUD/BRHUD.swift | 21 + BeeReel/Lib/HUD/BRToast.swift | 22 + .../LocalizedManager/BRLocalizedManager.swift | 122 ++ BeeReel/Lib/Login/BRLoginManager.swift | 127 ++ BeeReel/Lib/Login/BRLoginToken.swift | 43 + BeeReel/Lib/Player/BRPlayer.swift | 90 ++ BeeReel/Lib/User/BRUserInfo.swift | 72 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 + BeeReel/Sources/Assets.xcassets/Contents.json | 6 + .../Assets.xcassets/icon/Contents.json | 6 + .../cover_mark_icon_01.imageset/Contents.json | 22 + .../Exclude@2x.png | Bin 0 -> 937 bytes .../Exclude@3x.png | Bin 0 -> 1390 bytes .../Component 2@2x.png | Bin 0 -> 1515 bytes .../Component 2@3x.png | Bin 0 -> 2218 bytes .../favorite_icon_01.imageset/Contents.json | 22 + .../Component 2@2x.png | Bin 0 -> 1567 bytes .../Component 2@3x.png | Bin 0 -> 2290 bytes .../Contents.json | 22 + .../Contents.json | 22 + .../顶部卡片bg@2x.png | Bin 0 -> 80598 bytes .../顶部卡片bg@3x.png | Bin 0 -> 158119 bytes .../icon/hot_icon_01.imageset/Contents.json | 22 + .../icon/hot_icon_01.imageset/hot@2x.png | Bin 0 -> 2717 bytes .../icon/hot_icon_01.imageset/hot@3x.png | Bin 0 -> 4923 bytes .../icon/hot_icon_02.imageset/Contents.json | 22 + .../icon/hot_icon_02.imageset/Frame@2x.png | Bin 0 -> 598 bytes .../icon/hot_icon_02.imageset/Frame@3x.png | Bin 0 -> 810 bytes .../play_icon_01.imageset/Component 1@2x.png | Bin 0 -> 1390 bytes .../play_icon_01.imageset/Component 1@3x.png | Bin 0 -> 1957 bytes .../icon/play_icon_01.imageset/Contents.json | 22 + .../play_icon_02.imageset/Component 1@2x.png | Bin 0 -> 1125 bytes .../play_icon_02.imageset/Component 1@3x.png | Bin 0 -> 1578 bytes .../icon/play_icon_02.imageset/Contents.json | 22 + .../play_icon_03.imageset/Component 11@2x.png | Bin 0 -> 1183 bytes .../play_icon_03.imageset/Component 11@3x.png | Bin 0 -> 1667 bytes .../icon/play_icon_03.imageset/Contents.json | 22 + .../play_icon_04.imageset/Component 1@2x.png | Bin 0 -> 1131 bytes .../play_icon_04.imageset/Component 1@3x.png | Bin 0 -> 1567 bytes .../icon/play_icon_04.imageset/Contents.json | 22 + .../Component 14@2x.png | Bin 0 -> 1985 bytes .../Component 14@3x.png | Bin 0 -> 2897 bytes .../search_button_01.imageset/Contents.json | 22 + .../icon/top_icon_01.imageset/Contents.json | 22 + .../icon/top_icon_01.imageset/奖杯 1@2x.png | Bin 0 -> 2611 bytes .../icon/top_icon_01.imageset/奖杯 1@3x.png | Bin 0 -> 4558 bytes .../Assets.xcassets/image/Contents.json | 6 + .../Contents.json | 50 + .../Frame 11@2x.png | Bin 0 -> 9006 bytes .../Frame 11@3x.png | Bin 0 -> 14780 bytes .../menu_bg_image_01.imageset/Contents.json | 44 + .../menu_bg_image_01.imageset/选中光效@2x.png | Bin 0 -> 3553 bytes .../menu_bg_image_01.imageset/选中光效@3x.png | Bin 0 -> 6529 bytes .../text_bg_image_01.imageset/Contents.json | 22 + .../Rectangle 49@2x.png | Bin 0 -> 1286 bytes .../Rectangle 49@3x.png | Bin 0 -> 2000 bytes .../Assets.xcassets/tabbar/Contents.json | 6 + .../tabbar_icon_01.imageset/Contents.json | 22 + .../Property 1=Default@2x.png | Bin 0 -> 693 bytes .../Property 1=Default@3x.png | Bin 0 -> 968 bytes .../Contents.json | 22 + .../Property 1=Variant2@2x.png | Bin 0 -> 1057 bytes .../Property 1=Variant2@3x.png | Bin 0 -> 1503 bytes .../tabbar_icon_02.imageset/Contents.json | 22 + .../Property 1=Default@2x.png | Bin 0 -> 1262 bytes .../Property 1=Default@3x.png | Bin 0 -> 1715 bytes .../Contents.json | 22 + .../Property 1=Variant2@2x.png | Bin 0 -> 1487 bytes .../Property 1=Variant2@3x.png | Bin 0 -> 2109 bytes .../tabbar_icon_03.imageset/Contents.json | 22 + .../Property 1=Default@2x.png | Bin 0 -> 1186 bytes .../Property 1=Default@3x.png | Bin 0 -> 1712 bytes .../Contents.json | 22 + .../Property 1=Variant2@2x.png | Bin 0 -> 1436 bytes .../Property 1=Variant2@3x.png | Bin 0 -> 2101 bytes .../tabbar_icon_04.imageset/Contents.json | 22 + .../Property 1=Default@2x.png | Bin 0 -> 1264 bytes .../Property 1=Default@3x.png | Bin 0 -> 1819 bytes .../Contents.json | 22 + .../Property 1=Variant2@2x.png | Bin 0 -> 1379 bytes .../Property 1=Variant2@3x.png | Bin 0 -> 2018 bytes .../tabbar_top_icon.imageset/Contents.json | 22 + .../tabbar_top_icon.imageset/选中@2x.png | Bin 0 -> 5202 bytes .../tabbar_top_icon.imageset/选中@3x.png | Bin 0 -> 9786 bytes .../Base.lproj/LaunchScreen.storyboard | 25 + BeeReel/Sources/Bridging-Header.h | 8 + BeeReel/Sources/Info.plist | 23 + BeeReel/Sources/Localizable.xcstrings | 94 ++ BeeReel/Thirdparty/JXUUID/JXUUID.h | 20 + BeeReel/Thirdparty/JXUUID/JXUUID.m | 47 + BeeReel/Thirdparty/JXUUID/PDKeyChain.h | 31 + BeeReel/Thirdparty/JXUUID/PDKeyChain.m | 100 ++ .../Thirdparty/WMZBanner/WMZBannerConfig.h | 109 ++ .../Thirdparty/WMZBanner/WMZBannerControl.h | 26 + .../Thirdparty/WMZBanner/WMZBannerControl.m | 170 +++ .../WMZBanner/WMZBannerFadeLayout.h | 19 + .../WMZBanner/WMZBannerFadeLayout.m | 97 ++ .../WMZBanner/WMZBannerFlowLayout.h | 18 + .../WMZBanner/WMZBannerFlowLayout.m | 227 ++++ .../WMZBanner/WMZBannerOverLayout.h | 18 + .../WMZBanner/WMZBannerOverLayout.m | 158 +++ BeeReel/Thirdparty/WMZBanner/WMZBannerParam.h | 142 +++ BeeReel/Thirdparty/WMZBanner/WMZBannerParam.m | 106 ++ BeeReel/Thirdparty/WMZBanner/WMZBannerView.h | 55 + BeeReel/Thirdparty/WMZBanner/WMZBannerView.m | 701 +++++++++++ Podfile | 32 + 173 files changed, 8973 insertions(+), 1 deletion(-) create mode 100644 BeeReel.xcodeproj/project.pbxproj create mode 100644 BeeReel/Base/Controller/BRNavigationController.swift create mode 100644 BeeReel/Base/Controller/BRTabBarController.swift create mode 100644 BeeReel/Base/Controller/BRViewController.swift create mode 100644 BeeReel/Base/Define/BRDefine.swift create mode 100644 BeeReel/Base/Define/BRUserDefaultsKey.swift create mode 100644 BeeReel/Base/Extension/AttributedString+BRAdd.swift create mode 100644 BeeReel/Base/Extension/CGMutablePath+BRRoundedCorner.swift create mode 100644 BeeReel/Base/Extension/String+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UIColor+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UIDevice+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UIFont+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UIImageView+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UIScreen+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UIStackView+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UIView+BRAdd.swift create mode 100644 BeeReel/Base/Extension/UserDefaults+BRAdd.swift create mode 100644 BeeReel/Base/Model/BRListModel.swift create mode 100644 BeeReel/Base/Model/BRModel.swift create mode 100644 BeeReel/Base/Network/API/BRHomeAPI.swift create mode 100644 BeeReel/Base/Network/API/BRUserAPI.swift create mode 100644 BeeReel/Base/Network/API/BRVideoAPI.swift create mode 100644 BeeReel/Base/Network/Base/BRCryptorService.swift create mode 100644 BeeReel/Base/Network/Base/BRNetwork.swift create mode 100644 BeeReel/Base/Network/Base/BRNetworkTarget.swift create mode 100644 BeeReel/Base/Network/Base/BRURLPath.swift create mode 100644 BeeReel/Base/View/BRCollectionView.swift create mode 100644 BeeReel/Base/View/BRCollectionViewCell.swift create mode 100644 BeeReel/Base/View/BRImageView.swift create mode 100644 BeeReel/Base/View/BRTableView.swift create mode 100644 BeeReel/Base/View/BRTableViewCell.swift create mode 100644 BeeReel/Base/View/TabBar/BRTabBar.swift create mode 100644 BeeReel/Base/View/TabBar/BRTabBarItem.swift create mode 100644 BeeReel/Base/View/TabBar/BRTabBarItemContainer.swift create mode 100644 BeeReel/Base/View/TabBar/BRTabBarItemContentView.swift create mode 100644 BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift create mode 100644 BeeReel/Class/Home/Controller/BRHomeViewController.swift create mode 100644 BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift create mode 100644 BeeReel/Class/Home/Model/BRHomeModuleItem.swift create mode 100644 BeeReel/Class/Home/Model/BRPagerViewTransformer.swift create mode 100644 BeeReel/Class/Home/Model/BRShortModel.swift create mode 100644 BeeReel/Class/Home/Model/BRVideoInfoModel.swift create mode 100644 BeeReel/Class/Home/View/BRHomeHeaderBannerCell.swift create mode 100644 BeeReel/Class/Home/View/BRHomeHeaderView.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightHotCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightHotMainCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightMainBaseCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightNewCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightNewMainCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandMainCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift create mode 100644 BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift create mode 100644 BeeReel/Class/Home/ViewModel/BRHomeViewModel.swift create mode 100644 BeeReel/Class/Player/Controller/BRPlayerListViewController.swift create mode 100644 BeeReel/Class/Player/Controller/BRVideoDetailViewController.swift create mode 100644 BeeReel/Class/Player/Model/BRPlayerProtocol.swift create mode 100644 BeeReel/Class/Player/Model/BRVideoDetailModel.swift create mode 100644 BeeReel/Class/Player/View/BRPlayerListCell.swift create mode 100644 BeeReel/Class/Player/ViewModel/BRPlayerViewModel.swift create mode 100644 BeeReel/Class/Player/ViewModel/BRVideoRevolutionManager.swift create mode 100644 BeeReel/Delegate/AppDelegate+BRConfig.swift create mode 100644 BeeReel/Delegate/AppDelegate.swift create mode 100644 BeeReel/Delegate/SceneDelegate.swift create mode 100644 BeeReel/Lib/AppTool/BRAppTool.swift create mode 100644 BeeReel/Lib/HUD/BRHUD.swift create mode 100644 BeeReel/Lib/HUD/BRToast.swift create mode 100644 BeeReel/Lib/LocalizedManager/BRLocalizedManager.swift create mode 100644 BeeReel/Lib/Login/BRLoginManager.swift create mode 100644 BeeReel/Lib/Login/BRLoginToken.swift create mode 100644 BeeReel/Lib/Player/BRPlayer.swift create mode 100644 BeeReel/Lib/User/BRUserInfo.swift create mode 100644 BeeReel/Sources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Exclude@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Exclude@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Component 2@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Component 2@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Component 2@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Component 2@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/顶部卡片bg@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/顶部卡片bg@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/hot@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/hot@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Frame@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Frame@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_01.imageset/Component 1@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_01.imageset/Component 1@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_02.imageset/Component 1@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_02.imageset/Component 1@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_02.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_03.imageset/Component 11@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_03.imageset/Component 11@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_03.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_04.imageset/Component 1@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_04.imageset/Component 1@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/play_icon_04.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Component 14@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Component 14@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/奖杯 1@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/奖杯 1@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Frame 11@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Frame 11@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/menu_bg_image_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/image/menu_bg_image_01.imageset/选中光效@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/menu_bg_image_01.imageset/选中光效@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/text_bg_image_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/image/text_bg_image_01.imageset/Rectangle 49@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/text_bg_image_01.imageset/Rectangle 49@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Property 1=Default@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Property 1=Default@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01_selected.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01_selected.imageset/Property 1=Variant2@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01_selected.imageset/Property 1=Variant2@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Property 1=Default@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Property 1=Default@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Property 1=Variant2@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Property 1=Variant2@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Property 1=Default@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Property 1=Default@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03_selected.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03_selected.imageset/Property 1=Variant2@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03_selected.imageset/Property 1=Variant2@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Property 1=Default@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Property 1=Default@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Property 1=Variant2@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Property 1=Variant2@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/选中@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/选中@3x.png create mode 100644 BeeReel/Sources/Base.lproj/LaunchScreen.storyboard create mode 100644 BeeReel/Sources/Bridging-Header.h create mode 100644 BeeReel/Sources/Info.plist create mode 100644 BeeReel/Sources/Localizable.xcstrings create mode 100644 BeeReel/Thirdparty/JXUUID/JXUUID.h create mode 100644 BeeReel/Thirdparty/JXUUID/JXUUID.m create mode 100755 BeeReel/Thirdparty/JXUUID/PDKeyChain.h create mode 100755 BeeReel/Thirdparty/JXUUID/PDKeyChain.m create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerConfig.h create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerControl.h create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerControl.m create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerFadeLayout.h create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerFadeLayout.m create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerFlowLayout.h create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerFlowLayout.m create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.h create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.m create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerParam.h create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerParam.m create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerView.h create mode 100644 BeeReel/Thirdparty/WMZBanner/WMZBannerView.m create mode 100644 Podfile diff --git a/.gitignore b/.gitignore index 8a981e9..7f16740 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,9 @@ xcuserdata/ ## Playgrounds timeline.xctimeline playground.xcworkspace +*.xcworkspace +Podfile.lock +Pods/ # Swift Package Manager # @@ -38,7 +41,6 @@ playground.xcworkspace # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # -# Pods/ # # Add this line if you want to avoid checking in source code from the Xcode workspace # *.xcworkspace diff --git a/BeeReel.xcodeproj/project.pbxproj b/BeeReel.xcodeproj/project.pbxproj new file mode 100644 index 0000000..30e0a62 --- /dev/null +++ b/BeeReel.xcodeproj/project.pbxproj @@ -0,0 +1,1051 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 440A41A6E6A22A02807AE759 /* Pods_BeeReel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 899B3015B03D5E1A5A6507EB /* Pods_BeeReel.framework */; }; + BF0DBDD12E0D4E150035F6B4 /* BRTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF0DBDD02E0D4E150035F6B4 /* BRTabBar.swift */; }; + BF692AEB2E0A475D00A5C2DA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692AE12E0A475D00A5C2DA /* AppDelegate.swift */; }; + BF692AEC2E0A475D00A5C2DA /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692AE82E0A475D00A5C2DA /* SceneDelegate.swift */; }; + BF692AEE2E0A475D00A5C2DA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BF692AE22E0A475D00A5C2DA /* Assets.xcassets */; }; + BF692AF02E0A475D00A5C2DA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF692AE52E0A475D00A5C2DA /* LaunchScreen.storyboard */; }; + BF692AFA2E0A6F0900A5C2DA /* BRNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692AF92E0A6EFD00A5C2DA /* BRNetwork.swift */; }; + BF692AFC2E0A6F8000A5C2DA /* BRNetworkTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692AFB2E0A6F1B00A5C2DA /* BRNetworkTarget.swift */; }; + BF692B012E0A74A200A5C2DA /* BRDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B002E0A749C00A5C2DA /* BRDefine.swift */; }; + BF692B042E0A76D200A5C2DA /* BRLoginManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B032E0A76D200A5C2DA /* BRLoginManager.swift */; }; + BF692B072E0A771C00A5C2DA /* BRModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B062E0A771C00A5C2DA /* BRModel.swift */; }; + BF692B092E0A775500A5C2DA /* BRLoginToken.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B082E0A775500A5C2DA /* BRLoginToken.swift */; }; + BF692B0E2E0A7AF300A5C2DA /* UserDefaults+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B0D2E0A7AED00A5C2DA /* UserDefaults+BRAdd.swift */; }; + BF692B102E0A7B4300A5C2DA /* BRUserDefaultsKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B0F2E0A7B3400A5C2DA /* BRUserDefaultsKey.swift */; }; + BF692B132E0A7B9000A5C2DA /* BRUserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B122E0A7B9000A5C2DA /* BRUserInfo.swift */; }; + BF692B162E0A7CD600A5C2DA /* BRHUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B152E0A7CD200A5C2DA /* BRHUD.swift */; }; + BF692B182E0A7D8900A5C2DA /* BRToast.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B172E0A7D8200A5C2DA /* BRToast.swift */; }; + BF692B1C2E0A7DE800A5C2DA /* BRAppTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B1B2E0A7DE200A5C2DA /* BRAppTool.swift */; }; + BF692B1F2E0A804600A5C2DA /* BRLocalizedManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B1E2E0A804100A5C2DA /* BRLocalizedManager.swift */; }; + BF692B222E0A820D00A5C2DA /* String+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B212E0A820C00A5C2DA /* String+BRAdd.swift */; }; + BF692B242E0A825B00A5C2DA /* BRCryptorService.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B232E0A825600A5C2DA /* BRCryptorService.swift */; }; + BF692B2A2E0A84F700A5C2DA /* JXUUID.m in Sources */ = {isa = PBXBuildFile; fileRef = BF692B262E0A84F700A5C2DA /* JXUUID.m */; }; + BF692B2B2E0A84F700A5C2DA /* PDKeyChain.m in Sources */ = {isa = PBXBuildFile; fileRef = BF692B282E0A84F700A5C2DA /* PDKeyChain.m */; }; + BF692B342E0A87C800A5C2DA /* UIDevice+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B332E0A87BD00A5C2DA /* UIDevice+BRAdd.swift */; }; + BF692B3A2E0A8C6000A5C2DA /* BRViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B392E0A8C6000A5C2DA /* BRViewController.swift */; }; + BF692B3C2E0A8D0200A5C2DA /* BRNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B3B2E0A8D0200A5C2DA /* BRNavigationController.swift */; }; + BF692B3E2E0A8D2300A5C2DA /* BRTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B3D2E0A8D2300A5C2DA /* BRTabBarController.swift */; }; + BF692B402E0A8FA100A5C2DA /* UIColor+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B3F2E0A8F9D00A5C2DA /* UIColor+BRAdd.swift */; }; + BF692B422E0A8FB500A5C2DA /* UIFont+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B412E0A8FAE00A5C2DA /* UIFont+BRAdd.swift */; }; + BF692B442E0A910E00A5C2DA /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = BF692B432E0A910E00A5C2DA /* Localizable.xcstrings */; }; + BF692B472E0A9B7900A5C2DA /* BRPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B462E0A9B7400A5C2DA /* BRPlayer.swift */; }; + BF692B492E0A9D0E00A5C2DA /* UIView+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B482E0A9D0800A5C2DA /* UIView+BRAdd.swift */; }; + BF692B512E0AA8C600A5C2DA /* BRPlayerListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B502E0AA8C600A5C2DA /* BRPlayerListViewController.swift */; }; + BF692B542E0AA8FA00A5C2DA /* BRCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B532E0AA8FA00A5C2DA /* BRCollectionView.swift */; }; + BF692B562E0AA92100A5C2DA /* BRCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B552E0AA92100A5C2DA /* BRCollectionViewCell.swift */; }; + BF692B582E0AAA6F00A5C2DA /* UIScreen+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B572E0AAA5F00A5C2DA /* UIScreen+BRAdd.swift */; }; + BF692B5A2E0AAADD00A5C2DA /* BRPlayerListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B592E0AAADD00A5C2DA /* BRPlayerListCell.swift */; }; + BF692B5F2E0B812800A5C2DA /* BRTabBarItemContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B5E2E0B812800A5C2DA /* BRTabBarItemContainer.swift */; }; + BF692B612E0B814F00A5C2DA /* BRTabBarItemContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B602E0B814F00A5C2DA /* BRTabBarItemContentView.swift */; }; + BF692B632E0B9D4800A5C2DA /* BRTabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B622E0B9D4800A5C2DA /* BRTabBarItem.swift */; }; + BF692B652E0BC53900A5C2DA /* CGMutablePath+BRRoundedCorner.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B642E0BC53900A5C2DA /* CGMutablePath+BRRoundedCorner.swift */; }; + BF692B672E0BC6C700A5C2DA /* AppDelegate+BRConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B662E0BC6BC00A5C2DA /* AppDelegate+BRConfig.swift */; }; + BF692B6B2E0BC85300A5C2DA /* BRHomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B6A2E0BC85300A5C2DA /* BRHomeViewController.swift */; }; + BF692B6E2E0BD4CB00A5C2DA /* BRHomeHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B6D2E0BD4CB00A5C2DA /* BRHomeHeaderView.swift */; }; + BF692B732E0D397700A5C2DA /* BRHomeAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B722E0D396800A5C2DA /* BRHomeAPI.swift */; }; + BF692B752E0D39D000A5C2DA /* BRListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B742E0D39D000A5C2DA /* BRListModel.swift */; }; + BF692B782E0D3A1200A5C2DA /* BRHomeModuleItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B772E0D3A1200A5C2DA /* BRHomeModuleItem.swift */; }; + BF692B7A2E0D3BD300A5C2DA /* BRShortModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B792E0D3BD300A5C2DA /* BRShortModel.swift */; }; + BF692B7C2E0D3C1300A5C2DA /* BRVideoInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF692B7B2E0D3C1300A5C2DA /* BRVideoInfoModel.swift */; }; + BF78108B2E0D4EB3007DEEBC /* BRURLPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF78108A2E0D4EB3007DEEBC /* BRURLPath.swift */; }; + BFC676522E0D4EFD006659E5 /* BRHomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676512E0D4EFD006659E5 /* BRHomeViewModel.swift */; }; + BFC676622E0E2C8E006659E5 /* WMZBannerView.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC676602E0E2C8E006659E5 /* WMZBannerView.m */; }; + BFC676632E0E2C8E006659E5 /* WMZBannerOverLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC6765C2E0E2C8E006659E5 /* WMZBannerOverLayout.m */; }; + BFC676642E0E2C8E006659E5 /* WMZBannerFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC6765A2E0E2C8E006659E5 /* WMZBannerFlowLayout.m */; }; + BFC676652E0E2C8E006659E5 /* WMZBannerControl.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC676562E0E2C8E006659E5 /* WMZBannerControl.m */; }; + BFC676662E0E2C8E006659E5 /* WMZBannerFadeLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC676582E0E2C8E006659E5 /* WMZBannerFadeLayout.m */; }; + BFC676672E0E2C8E006659E5 /* WMZBannerParam.m in Sources */ = {isa = PBXBuildFile; fileRef = BFC6765E2E0E2C8E006659E5 /* WMZBannerParam.m */; }; + BFC676692E0E34DA006659E5 /* BRUserAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676682E0E34D9006659E5 /* BRUserAPI.swift */; }; + BFC6766B2E0E395F006659E5 /* BRHomeHeaderBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6766A2E0E395F006659E5 /* BRHomeHeaderBannerCell.swift */; }; + BFC6766D2E0E3A8D006659E5 /* BRImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6766C2E0E3A8D006659E5 /* BRImageView.swift */; }; + BFC6766F2E0E3B5C006659E5 /* UIImageView+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6766E2E0E3B51006659E5 /* UIImageView+BRAdd.swift */; }; + BFC676712E0E9234006659E5 /* BRSpotlightViewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676702E0E9234006659E5 /* BRSpotlightViewViewController.swift */; }; + BFC676732E0E938B006659E5 /* BRTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676722E0E938B006659E5 /* BRTableView.swift */; }; + BFC676752E0E93B3006659E5 /* BRTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676742E0E93B3006659E5 /* BRTableViewCell.swift */; }; + BFC676782E0E9553006659E5 /* BRSpotlightMainBaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676772E0E9553006659E5 /* BRSpotlightMainBaseCell.swift */; }; + BFC6767B2E0E973B006659E5 /* UIStackView+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6767A2E0E9736006659E5 /* UIStackView+BRAdd.swift */; }; + BFC6767D2E0E9809006659E5 /* BRSpotlightHotMainCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6767C2E0E9809006659E5 /* BRSpotlightHotMainCell.swift */; }; + BFC6767F2E121A72006659E5 /* BRSpotlightHotCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6767E2E121A72006659E5 /* BRSpotlightHotCell.swift */; }; + BFC676812E122733006659E5 /* BRPlayerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676802E122733006659E5 /* BRPlayerProtocol.swift */; }; + BFC676832E122CC5006659E5 /* BRPlayerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676822E122CC5006659E5 /* BRPlayerViewModel.swift */; }; + BFC676852E122D9E006659E5 /* BRVideoDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676842E122D9E006659E5 /* BRVideoDetailViewController.swift */; }; + BFC676872E122E36006659E5 /* BRVideoDetailModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676862E122E36006659E5 /* BRVideoDetailModel.swift */; }; + BFC676892E122FDD006659E5 /* BRVideoAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676882E122FDB006659E5 /* BRVideoAPI.swift */; }; + BFC6768B2E123690006659E5 /* BRVideoRevolutionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6768A2E12368C006659E5 /* BRVideoRevolutionManager.swift */; }; + BFC6768D2E123D6E006659E5 /* AttributedString+BRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6768C2E123D67006659E5 /* AttributedString+BRAdd.swift */; }; + BFC6768F2E125D5B006659E5 /* BRSpotlightTopMainCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6768E2E125D5B006659E5 /* BRSpotlightTopMainCell.swift */; }; + BFC676912E126248006659E5 /* BRSpotlightTopCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676902E126248006659E5 /* BRSpotlightTopCell.swift */; }; + BFC676932E126A62006659E5 /* BRSpotlightNewMainCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676922E126A62006659E5 /* BRSpotlightNewMainCell.swift */; }; + BFC676952E126BBF006659E5 /* BRSpotlightNewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676942E126BBF006659E5 /* BRSpotlightNewCell.swift */; }; + BFC676972E127D3C006659E5 /* BRSpotlightRecommandMainCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676962E127D3C006659E5 /* BRSpotlightRecommandMainCell.swift */; }; + BFC676992E1280E3006659E5 /* BRSpotlightRecommandCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676982E1280E3006659E5 /* BRSpotlightRecommandCell.swift */; }; + BFC6769B2E1285C5006659E5 /* BRPagerViewTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6769A2E1285C5006659E5 /* BRPagerViewTransformer.swift */; }; + BFC6769D2E129794006659E5 /* BRHomeTop10ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC6769C2E129794006659E5 /* BRHomeTop10ViewController.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 86290EBFA8B93C91B3BAD835 /* Pods-ShortBox.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShortBox.debug.xcconfig"; path = "Target Support Files/Pods-ShortBox/Pods-ShortBox.debug.xcconfig"; sourceTree = ""; }; + 899B3015B03D5E1A5A6507EB /* Pods_BeeReel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_BeeReel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BF0DBDD02E0D4E150035F6B4 /* BRTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTabBar.swift; sourceTree = ""; }; + BF692AC92E0A475500A5C2DA /* BeeReel.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BeeReel.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BF692AE12E0A475D00A5C2DA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + BF692AE22E0A475D00A5C2DA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + BF692AE32E0A475D00A5C2DA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BF692AE42E0A475D00A5C2DA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + BF692AE82E0A475D00A5C2DA /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + BF692AF92E0A6EFD00A5C2DA /* BRNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRNetwork.swift; sourceTree = ""; }; + BF692AFB2E0A6F1B00A5C2DA /* BRNetworkTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRNetworkTarget.swift; sourceTree = ""; }; + BF692B002E0A749C00A5C2DA /* BRDefine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRDefine.swift; sourceTree = ""; }; + BF692B032E0A76D200A5C2DA /* BRLoginManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRLoginManager.swift; sourceTree = ""; }; + BF692B062E0A771C00A5C2DA /* BRModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRModel.swift; sourceTree = ""; }; + BF692B082E0A775500A5C2DA /* BRLoginToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRLoginToken.swift; sourceTree = ""; }; + BF692B0D2E0A7AED00A5C2DA /* UserDefaults+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+BRAdd.swift"; sourceTree = ""; }; + BF692B0F2E0A7B3400A5C2DA /* BRUserDefaultsKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRUserDefaultsKey.swift; sourceTree = ""; }; + BF692B122E0A7B9000A5C2DA /* BRUserInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRUserInfo.swift; sourceTree = ""; }; + BF692B152E0A7CD200A5C2DA /* BRHUD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHUD.swift; sourceTree = ""; }; + BF692B172E0A7D8200A5C2DA /* BRToast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRToast.swift; sourceTree = ""; }; + BF692B1B2E0A7DE200A5C2DA /* BRAppTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRAppTool.swift; sourceTree = ""; }; + BF692B1E2E0A804100A5C2DA /* BRLocalizedManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRLocalizedManager.swift; sourceTree = ""; }; + BF692B212E0A820C00A5C2DA /* String+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+BRAdd.swift"; sourceTree = ""; }; + BF692B232E0A825600A5C2DA /* BRCryptorService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRCryptorService.swift; sourceTree = ""; }; + BF692B252E0A84F700A5C2DA /* JXUUID.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JXUUID.h; sourceTree = ""; }; + BF692B262E0A84F700A5C2DA /* JXUUID.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JXUUID.m; sourceTree = ""; }; + BF692B272E0A84F700A5C2DA /* PDKeyChain.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PDKeyChain.h; sourceTree = ""; }; + BF692B282E0A84F700A5C2DA /* PDKeyChain.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PDKeyChain.m; sourceTree = ""; }; + BF692B322E0A872600A5C2DA /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = ""; }; + BF692B332E0A87BD00A5C2DA /* UIDevice+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+BRAdd.swift"; sourceTree = ""; }; + BF692B392E0A8C6000A5C2DA /* BRViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRViewController.swift; sourceTree = ""; }; + BF692B3B2E0A8D0200A5C2DA /* BRNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRNavigationController.swift; sourceTree = ""; }; + BF692B3D2E0A8D2300A5C2DA /* BRTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTabBarController.swift; sourceTree = ""; }; + BF692B3F2E0A8F9D00A5C2DA /* UIColor+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+BRAdd.swift"; sourceTree = ""; }; + BF692B412E0A8FAE00A5C2DA /* UIFont+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+BRAdd.swift"; sourceTree = ""; }; + BF692B432E0A910E00A5C2DA /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; + BF692B462E0A9B7400A5C2DA /* BRPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPlayer.swift; sourceTree = ""; }; + BF692B482E0A9D0800A5C2DA /* UIView+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+BRAdd.swift"; sourceTree = ""; }; + BF692B502E0AA8C600A5C2DA /* BRPlayerListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPlayerListViewController.swift; sourceTree = ""; }; + BF692B532E0AA8FA00A5C2DA /* BRCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRCollectionView.swift; sourceTree = ""; }; + BF692B552E0AA92100A5C2DA /* BRCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRCollectionViewCell.swift; sourceTree = ""; }; + BF692B572E0AAA5F00A5C2DA /* UIScreen+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScreen+BRAdd.swift"; sourceTree = ""; }; + BF692B592E0AAADD00A5C2DA /* BRPlayerListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPlayerListCell.swift; sourceTree = ""; }; + BF692B5E2E0B812800A5C2DA /* BRTabBarItemContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTabBarItemContainer.swift; sourceTree = ""; }; + BF692B602E0B814F00A5C2DA /* BRTabBarItemContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTabBarItemContentView.swift; sourceTree = ""; }; + BF692B622E0B9D4800A5C2DA /* BRTabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTabBarItem.swift; sourceTree = ""; }; + BF692B642E0BC53900A5C2DA /* CGMutablePath+BRRoundedCorner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CGMutablePath+BRRoundedCorner.swift"; sourceTree = ""; }; + BF692B662E0BC6BC00A5C2DA /* AppDelegate+BRConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+BRConfig.swift"; sourceTree = ""; }; + BF692B6A2E0BC85300A5C2DA /* BRHomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeViewController.swift; sourceTree = ""; }; + BF692B6D2E0BD4CB00A5C2DA /* BRHomeHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeHeaderView.swift; sourceTree = ""; }; + BF692B722E0D396800A5C2DA /* BRHomeAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeAPI.swift; sourceTree = ""; }; + BF692B742E0D39D000A5C2DA /* BRListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRListModel.swift; sourceTree = ""; }; + BF692B772E0D3A1200A5C2DA /* BRHomeModuleItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeModuleItem.swift; sourceTree = ""; }; + BF692B792E0D3BD300A5C2DA /* BRShortModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRShortModel.swift; sourceTree = ""; }; + BF692B7B2E0D3C1300A5C2DA /* BRVideoInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRVideoInfoModel.swift; sourceTree = ""; }; + BF78108A2E0D4EB3007DEEBC /* BRURLPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRURLPath.swift; sourceTree = ""; }; + BFC676512E0D4EFD006659E5 /* BRHomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeViewModel.swift; sourceTree = ""; }; + BFC676542E0E2C8E006659E5 /* WMZBannerConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMZBannerConfig.h; sourceTree = ""; }; + BFC676552E0E2C8E006659E5 /* WMZBannerControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMZBannerControl.h; sourceTree = ""; }; + BFC676562E0E2C8E006659E5 /* WMZBannerControl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WMZBannerControl.m; sourceTree = ""; }; + BFC676572E0E2C8E006659E5 /* WMZBannerFadeLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMZBannerFadeLayout.h; sourceTree = ""; }; + BFC676582E0E2C8E006659E5 /* WMZBannerFadeLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WMZBannerFadeLayout.m; sourceTree = ""; }; + BFC676592E0E2C8E006659E5 /* WMZBannerFlowLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMZBannerFlowLayout.h; sourceTree = ""; }; + BFC6765A2E0E2C8E006659E5 /* WMZBannerFlowLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WMZBannerFlowLayout.m; sourceTree = ""; }; + BFC6765B2E0E2C8E006659E5 /* WMZBannerOverLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMZBannerOverLayout.h; sourceTree = ""; }; + BFC6765C2E0E2C8E006659E5 /* WMZBannerOverLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WMZBannerOverLayout.m; sourceTree = ""; }; + BFC6765D2E0E2C8E006659E5 /* WMZBannerParam.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMZBannerParam.h; sourceTree = ""; }; + BFC6765E2E0E2C8E006659E5 /* WMZBannerParam.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WMZBannerParam.m; sourceTree = ""; }; + BFC6765F2E0E2C8E006659E5 /* WMZBannerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WMZBannerView.h; sourceTree = ""; }; + BFC676602E0E2C8E006659E5 /* WMZBannerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WMZBannerView.m; sourceTree = ""; }; + BFC676682E0E34D9006659E5 /* BRUserAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRUserAPI.swift; sourceTree = ""; }; + BFC6766A2E0E395F006659E5 /* BRHomeHeaderBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeHeaderBannerCell.swift; sourceTree = ""; }; + BFC6766C2E0E3A8D006659E5 /* BRImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRImageView.swift; sourceTree = ""; }; + BFC6766E2E0E3B51006659E5 /* UIImageView+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImageView+BRAdd.swift"; sourceTree = ""; }; + BFC676702E0E9234006659E5 /* BRSpotlightViewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightViewViewController.swift; sourceTree = ""; }; + BFC676722E0E938B006659E5 /* BRTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTableView.swift; sourceTree = ""; }; + BFC676742E0E93B3006659E5 /* BRTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRTableViewCell.swift; sourceTree = ""; }; + BFC676772E0E9553006659E5 /* BRSpotlightMainBaseCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightMainBaseCell.swift; sourceTree = ""; }; + BFC6767A2E0E9736006659E5 /* UIStackView+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIStackView+BRAdd.swift"; sourceTree = ""; }; + BFC6767C2E0E9809006659E5 /* BRSpotlightHotMainCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightHotMainCell.swift; sourceTree = ""; }; + BFC6767E2E121A72006659E5 /* BRSpotlightHotCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightHotCell.swift; sourceTree = ""; }; + BFC676802E122733006659E5 /* BRPlayerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPlayerProtocol.swift; sourceTree = ""; }; + BFC676822E122CC5006659E5 /* BRPlayerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPlayerViewModel.swift; sourceTree = ""; }; + BFC676842E122D9E006659E5 /* BRVideoDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRVideoDetailViewController.swift; sourceTree = ""; }; + BFC676862E122E36006659E5 /* BRVideoDetailModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRVideoDetailModel.swift; sourceTree = ""; }; + BFC676882E122FDB006659E5 /* BRVideoAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRVideoAPI.swift; sourceTree = ""; }; + BFC6768A2E12368C006659E5 /* BRVideoRevolutionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRVideoRevolutionManager.swift; sourceTree = ""; }; + BFC6768C2E123D67006659E5 /* AttributedString+BRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AttributedString+BRAdd.swift"; sourceTree = ""; }; + BFC6768E2E125D5B006659E5 /* BRSpotlightTopMainCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightTopMainCell.swift; sourceTree = ""; }; + BFC676902E126248006659E5 /* BRSpotlightTopCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightTopCell.swift; sourceTree = ""; }; + BFC676922E126A62006659E5 /* BRSpotlightNewMainCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightNewMainCell.swift; sourceTree = ""; }; + BFC676942E126BBF006659E5 /* BRSpotlightNewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightNewCell.swift; sourceTree = ""; }; + BFC676962E127D3C006659E5 /* BRSpotlightRecommandMainCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightRecommandMainCell.swift; sourceTree = ""; }; + BFC676982E1280E3006659E5 /* BRSpotlightRecommandCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRSpotlightRecommandCell.swift; sourceTree = ""; }; + BFC6769A2E1285C5006659E5 /* BRPagerViewTransformer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPagerViewTransformer.swift; sourceTree = ""; }; + BFC6769C2E129794006659E5 /* BRHomeTop10ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeTop10ViewController.swift; sourceTree = ""; }; + C8F11086BA392585E9563BA7 /* Pods-ShortBox.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShortBox.release.xcconfig"; path = "Target Support Files/Pods-ShortBox/Pods-ShortBox.release.xcconfig"; sourceTree = ""; }; + F06627B1DEE86552C2A87AEC /* Pods-BeeReel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BeeReel.debug.xcconfig"; path = "Target Support Files/Pods-BeeReel/Pods-BeeReel.debug.xcconfig"; sourceTree = ""; }; + F70FA1F4169364C4C53534CE /* Pods-BeeReel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BeeReel.release.xcconfig"; path = "Target Support Files/Pods-BeeReel/Pods-BeeReel.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BF692AC62E0A475500A5C2DA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 440A41A6E6A22A02807AE759 /* Pods_BeeReel.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8972E1AE57ADB2F6844701DA /* Pods */ = { + isa = PBXGroup; + children = ( + 86290EBFA8B93C91B3BAD835 /* Pods-ShortBox.debug.xcconfig */, + C8F11086BA392585E9563BA7 /* Pods-ShortBox.release.xcconfig */, + F06627B1DEE86552C2A87AEC /* Pods-BeeReel.debug.xcconfig */, + F70FA1F4169364C4C53534CE /* Pods-BeeReel.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + BF692AC02E0A475500A5C2DA = { + isa = PBXGroup; + children = ( + BF692AEA2E0A475D00A5C2DA /* BeeReel */, + BF692ACA2E0A475500A5C2DA /* Products */, + 8972E1AE57ADB2F6844701DA /* Pods */, + DF948F1E234E75684255568B /* Frameworks */, + ); + sourceTree = ""; + }; + BF692ACA2E0A475500A5C2DA /* Products */ = { + isa = PBXGroup; + children = ( + BF692AC92E0A475500A5C2DA /* BeeReel.app */, + ); + name = Products; + sourceTree = ""; + }; + BF692AEA2E0A475D00A5C2DA /* BeeReel */ = { + isa = PBXGroup; + children = ( + BF692AF32E0A47B500A5C2DA /* Delegate */, + BF692AF42E0A47CA00A5C2DA /* Base */, + BF692AF52E0A47D400A5C2DA /* Class */, + BF692AF22E0A478D00A5C2DA /* Sources */, + BF692AF62E0A480000A5C2DA /* Lib */, + BF692AF72E0A480E00A5C2DA /* Thirdparty */, + ); + path = BeeReel; + sourceTree = ""; + }; + BF692AF22E0A478D00A5C2DA /* Sources */ = { + isa = PBXGroup; + children = ( + BF692AE22E0A475D00A5C2DA /* Assets.xcassets */, + BF692AE32E0A475D00A5C2DA /* Info.plist */, + BF692AE52E0A475D00A5C2DA /* LaunchScreen.storyboard */, + BF692B322E0A872600A5C2DA /* Bridging-Header.h */, + BF692B432E0A910E00A5C2DA /* Localizable.xcstrings */, + ); + path = Sources; + sourceTree = ""; + }; + BF692AF32E0A47B500A5C2DA /* Delegate */ = { + isa = PBXGroup; + children = ( + BF692AE12E0A475D00A5C2DA /* AppDelegate.swift */, + BF692AE82E0A475D00A5C2DA /* SceneDelegate.swift */, + BF692B662E0BC6BC00A5C2DA /* AppDelegate+BRConfig.swift */, + ); + path = Delegate; + sourceTree = ""; + }; + BF692AF42E0A47CA00A5C2DA /* Base */ = { + isa = PBXGroup; + children = ( + BF692B352E0A8AF200A5C2DA /* Controller */, + BF692B522E0AA8D600A5C2DA /* View */, + BF692B0C2E0A7A9A00A5C2DA /* Extension */, + BF692B052E0A770F00A5C2DA /* Model */, + BF692AFF2E0A748D00A5C2DA /* Define */, + BF692AF82E0A51CF00A5C2DA /* Network */, + ); + path = Base; + sourceTree = ""; + }; + BF692AF52E0A47D400A5C2DA /* Class */ = { + isa = PBXGroup; + children = ( + BF692B682E0BC78C00A5C2DA /* Home */, + BF692B4A2E0AA84C00A5C2DA /* Player */, + ); + path = Class; + sourceTree = ""; + }; + BF692AF62E0A480000A5C2DA /* Lib */ = { + isa = PBXGroup; + children = ( + BF692B452E0A9B5800A5C2DA /* Player */, + BF692B1D2E0A803000A5C2DA /* LocalizedManager */, + BF692B142E0A7CB500A5C2DA /* HUD */, + BF692B112E0A7B7500A5C2DA /* User */, + BF692B022E0A769C00A5C2DA /* Login */, + BF692B192E0A7DBB00A5C2DA /* AppTool */, + ); + path = Lib; + sourceTree = ""; + }; + BF692AF72E0A480E00A5C2DA /* Thirdparty */ = { + isa = PBXGroup; + children = ( + BFC676612E0E2C8E006659E5 /* WMZBanner */, + BF692B292E0A84F700A5C2DA /* JXUUID */, + ); + path = Thirdparty; + sourceTree = ""; + }; + BF692AF82E0A51CF00A5C2DA /* Network */ = { + isa = PBXGroup; + children = ( + BF692B712E0D395300A5C2DA /* API */, + BF692B702E0D394800A5C2DA /* Base */, + ); + path = Network; + sourceTree = ""; + }; + BF692AFF2E0A748D00A5C2DA /* Define */ = { + isa = PBXGroup; + children = ( + BF692B0F2E0A7B3400A5C2DA /* BRUserDefaultsKey.swift */, + BF692B002E0A749C00A5C2DA /* BRDefine.swift */, + ); + path = Define; + sourceTree = ""; + }; + BF692B022E0A769C00A5C2DA /* Login */ = { + isa = PBXGroup; + children = ( + BF692B032E0A76D200A5C2DA /* BRLoginManager.swift */, + BF692B082E0A775500A5C2DA /* BRLoginToken.swift */, + ); + path = Login; + sourceTree = ""; + }; + BF692B052E0A770F00A5C2DA /* Model */ = { + isa = PBXGroup; + children = ( + BF692B062E0A771C00A5C2DA /* BRModel.swift */, + BF692B742E0D39D000A5C2DA /* BRListModel.swift */, + ); + path = Model; + sourceTree = ""; + }; + BF692B0C2E0A7A9A00A5C2DA /* Extension */ = { + isa = PBXGroup; + children = ( + BFC6768C2E123D67006659E5 /* AttributedString+BRAdd.swift */, + BFC6767A2E0E9736006659E5 /* UIStackView+BRAdd.swift */, + BFC6766E2E0E3B51006659E5 /* UIImageView+BRAdd.swift */, + BF692B572E0AAA5F00A5C2DA /* UIScreen+BRAdd.swift */, + BF692B482E0A9D0800A5C2DA /* UIView+BRAdd.swift */, + BF692B412E0A8FAE00A5C2DA /* UIFont+BRAdd.swift */, + BF692B3F2E0A8F9D00A5C2DA /* UIColor+BRAdd.swift */, + BF692B332E0A87BD00A5C2DA /* UIDevice+BRAdd.swift */, + BF692B212E0A820C00A5C2DA /* String+BRAdd.swift */, + BF692B0D2E0A7AED00A5C2DA /* UserDefaults+BRAdd.swift */, + BF692B642E0BC53900A5C2DA /* CGMutablePath+BRRoundedCorner.swift */, + ); + path = Extension; + sourceTree = ""; + }; + BF692B112E0A7B7500A5C2DA /* User */ = { + isa = PBXGroup; + children = ( + BF692B122E0A7B9000A5C2DA /* BRUserInfo.swift */, + ); + path = User; + sourceTree = ""; + }; + BF692B142E0A7CB500A5C2DA /* HUD */ = { + isa = PBXGroup; + children = ( + BF692B152E0A7CD200A5C2DA /* BRHUD.swift */, + BF692B172E0A7D8200A5C2DA /* BRToast.swift */, + ); + path = HUD; + sourceTree = ""; + }; + BF692B192E0A7DBB00A5C2DA /* AppTool */ = { + isa = PBXGroup; + children = ( + BF692B1B2E0A7DE200A5C2DA /* BRAppTool.swift */, + ); + path = AppTool; + sourceTree = ""; + }; + BF692B1D2E0A803000A5C2DA /* LocalizedManager */ = { + isa = PBXGroup; + children = ( + BF692B1E2E0A804100A5C2DA /* BRLocalizedManager.swift */, + ); + path = LocalizedManager; + sourceTree = ""; + }; + BF692B292E0A84F700A5C2DA /* JXUUID */ = { + isa = PBXGroup; + children = ( + BF692B252E0A84F700A5C2DA /* JXUUID.h */, + BF692B262E0A84F700A5C2DA /* JXUUID.m */, + BF692B272E0A84F700A5C2DA /* PDKeyChain.h */, + BF692B282E0A84F700A5C2DA /* PDKeyChain.m */, + ); + path = JXUUID; + sourceTree = ""; + }; + BF692B352E0A8AF200A5C2DA /* Controller */ = { + isa = PBXGroup; + children = ( + BF692B3D2E0A8D2300A5C2DA /* BRTabBarController.swift */, + BF692B3B2E0A8D0200A5C2DA /* BRNavigationController.swift */, + BF692B392E0A8C6000A5C2DA /* BRViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; + BF692B452E0A9B5800A5C2DA /* Player */ = { + isa = PBXGroup; + children = ( + BF692B462E0A9B7400A5C2DA /* BRPlayer.swift */, + ); + path = Player; + sourceTree = ""; + }; + BF692B4A2E0AA84C00A5C2DA /* Player */ = { + isa = PBXGroup; + children = ( + BF692B4F2E0AA88B00A5C2DA /* Controller */, + BF692B4D2E0AA88000A5C2DA /* View */, + BF692B4E2E0AA88600A5C2DA /* Model */, + BF692B4B2E0AA86200A5C2DA /* ViewModel */, + ); + path = Player; + sourceTree = ""; + }; + BF692B4B2E0AA86200A5C2DA /* ViewModel */ = { + isa = PBXGroup; + children = ( + BFC676822E122CC5006659E5 /* BRPlayerViewModel.swift */, + BFC6768A2E12368C006659E5 /* BRVideoRevolutionManager.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + BF692B4D2E0AA88000A5C2DA /* View */ = { + isa = PBXGroup; + children = ( + BF692B592E0AAADD00A5C2DA /* BRPlayerListCell.swift */, + ); + path = View; + sourceTree = ""; + }; + BF692B4E2E0AA88600A5C2DA /* Model */ = { + isa = PBXGroup; + children = ( + BFC676802E122733006659E5 /* BRPlayerProtocol.swift */, + BFC676862E122E36006659E5 /* BRVideoDetailModel.swift */, + ); + path = Model; + sourceTree = ""; + }; + BF692B4F2E0AA88B00A5C2DA /* Controller */ = { + isa = PBXGroup; + children = ( + BF692B502E0AA8C600A5C2DA /* BRPlayerListViewController.swift */, + BFC676842E122D9E006659E5 /* BRVideoDetailViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; + BF692B522E0AA8D600A5C2DA /* View */ = { + isa = PBXGroup; + children = ( + BF692B5B2E0AB31700A5C2DA /* TabBar */, + BF692B532E0AA8FA00A5C2DA /* BRCollectionView.swift */, + BF692B552E0AA92100A5C2DA /* BRCollectionViewCell.swift */, + BFC6766C2E0E3A8D006659E5 /* BRImageView.swift */, + BFC676722E0E938B006659E5 /* BRTableView.swift */, + BFC676742E0E93B3006659E5 /* BRTableViewCell.swift */, + ); + path = View; + sourceTree = ""; + }; + BF692B5B2E0AB31700A5C2DA /* TabBar */ = { + isa = PBXGroup; + children = ( + BF0DBDD02E0D4E150035F6B4 /* BRTabBar.swift */, + BF692B622E0B9D4800A5C2DA /* BRTabBarItem.swift */, + BF692B602E0B814F00A5C2DA /* BRTabBarItemContentView.swift */, + BF692B5E2E0B812800A5C2DA /* BRTabBarItemContainer.swift */, + ); + path = TabBar; + sourceTree = ""; + }; + BF692B682E0BC78C00A5C2DA /* Home */ = { + isa = PBXGroup; + children = ( + BF692B692E0BC82C00A5C2DA /* Controller */, + BF692B6C2E0BD4B200A5C2DA /* View */, + BF692B762E0D3A0300A5C2DA /* Model */, + BF692B7D2E0D3D4C00A5C2DA /* ViewModel */, + ); + path = Home; + sourceTree = ""; + }; + BF692B692E0BC82C00A5C2DA /* Controller */ = { + isa = PBXGroup; + children = ( + BF692B6A2E0BC85300A5C2DA /* BRHomeViewController.swift */, + BFC676702E0E9234006659E5 /* BRSpotlightViewViewController.swift */, + BFC6769C2E129794006659E5 /* BRHomeTop10ViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; + BF692B6C2E0BD4B200A5C2DA /* View */ = { + isa = PBXGroup; + children = ( + BFC676762E0E950A006659E5 /* Spotlight */, + BF692B6D2E0BD4CB00A5C2DA /* BRHomeHeaderView.swift */, + BFC6766A2E0E395F006659E5 /* BRHomeHeaderBannerCell.swift */, + ); + path = View; + sourceTree = ""; + }; + BF692B702E0D394800A5C2DA /* Base */ = { + isa = PBXGroup; + children = ( + BF692B232E0A825600A5C2DA /* BRCryptorService.swift */, + BF692AFB2E0A6F1B00A5C2DA /* BRNetworkTarget.swift */, + BF692AF92E0A6EFD00A5C2DA /* BRNetwork.swift */, + BF78108A2E0D4EB3007DEEBC /* BRURLPath.swift */, + ); + path = Base; + sourceTree = ""; + }; + BF692B712E0D395300A5C2DA /* API */ = { + isa = PBXGroup; + children = ( + BFC676882E122FDB006659E5 /* BRVideoAPI.swift */, + BFC676682E0E34D9006659E5 /* BRUserAPI.swift */, + BF692B722E0D396800A5C2DA /* BRHomeAPI.swift */, + ); + path = API; + sourceTree = ""; + }; + BF692B762E0D3A0300A5C2DA /* Model */ = { + isa = PBXGroup; + children = ( + BF692B772E0D3A1200A5C2DA /* BRHomeModuleItem.swift */, + BF692B792E0D3BD300A5C2DA /* BRShortModel.swift */, + BF692B7B2E0D3C1300A5C2DA /* BRVideoInfoModel.swift */, + BFC6769A2E1285C5006659E5 /* BRPagerViewTransformer.swift */, + ); + path = Model; + sourceTree = ""; + }; + BF692B7D2E0D3D4C00A5C2DA /* ViewModel */ = { + isa = PBXGroup; + children = ( + BFC676512E0D4EFD006659E5 /* BRHomeViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; + BFC676612E0E2C8E006659E5 /* WMZBanner */ = { + isa = PBXGroup; + children = ( + BFC676542E0E2C8E006659E5 /* WMZBannerConfig.h */, + BFC676552E0E2C8E006659E5 /* WMZBannerControl.h */, + BFC676562E0E2C8E006659E5 /* WMZBannerControl.m */, + BFC676572E0E2C8E006659E5 /* WMZBannerFadeLayout.h */, + BFC676582E0E2C8E006659E5 /* WMZBannerFadeLayout.m */, + BFC676592E0E2C8E006659E5 /* WMZBannerFlowLayout.h */, + BFC6765A2E0E2C8E006659E5 /* WMZBannerFlowLayout.m */, + BFC6765B2E0E2C8E006659E5 /* WMZBannerOverLayout.h */, + BFC6765C2E0E2C8E006659E5 /* WMZBannerOverLayout.m */, + BFC6765D2E0E2C8E006659E5 /* WMZBannerParam.h */, + BFC6765E2E0E2C8E006659E5 /* WMZBannerParam.m */, + BFC6765F2E0E2C8E006659E5 /* WMZBannerView.h */, + BFC676602E0E2C8E006659E5 /* WMZBannerView.m */, + ); + path = WMZBanner; + sourceTree = ""; + }; + BFC676762E0E950A006659E5 /* Spotlight */ = { + isa = PBXGroup; + children = ( + BFC676772E0E9553006659E5 /* BRSpotlightMainBaseCell.swift */, + BFC6767C2E0E9809006659E5 /* BRSpotlightHotMainCell.swift */, + BFC6767E2E121A72006659E5 /* BRSpotlightHotCell.swift */, + BFC6768E2E125D5B006659E5 /* BRSpotlightTopMainCell.swift */, + BFC676902E126248006659E5 /* BRSpotlightTopCell.swift */, + BFC676922E126A62006659E5 /* BRSpotlightNewMainCell.swift */, + BFC676942E126BBF006659E5 /* BRSpotlightNewCell.swift */, + BFC676962E127D3C006659E5 /* BRSpotlightRecommandMainCell.swift */, + BFC676982E1280E3006659E5 /* BRSpotlightRecommandCell.swift */, + ); + path = Spotlight; + sourceTree = ""; + }; + DF948F1E234E75684255568B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 899B3015B03D5E1A5A6507EB /* Pods_BeeReel.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + BF692AC82E0A475500A5C2DA /* BeeReel */ = { + isa = PBXNativeTarget; + buildConfigurationList = BF692ADC2E0A475700A5C2DA /* Build configuration list for PBXNativeTarget "BeeReel" */; + buildPhases = ( + 1E47DF7D50FE03B0B10E2DED /* [CP] Check Pods Manifest.lock */, + BF692AC52E0A475500A5C2DA /* Sources */, + BF692AC62E0A475500A5C2DA /* Frameworks */, + BF692AC72E0A475500A5C2DA /* Resources */, + BDB57E17AABB03B647FB0C32 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BeeReel; + productName = ShortBox; + productReference = BF692AC92E0A475500A5C2DA /* BeeReel.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BF692AC12E0A475500A5C2DA /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1640; + LastUpgradeCheck = 1640; + TargetAttributes = { + BF692AC82E0A475500A5C2DA = { + CreatedOnToolsVersion = 16.4; + }; + }; + }; + buildConfigurationList = BF692AC42E0A475500A5C2DA /* Build configuration list for PBXProject "BeeReel" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = BF692AC02E0A475500A5C2DA; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = BF692ACA2E0A475500A5C2DA /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + BF692AC82E0A475500A5C2DA /* BeeReel */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + BF692AC72E0A475500A5C2DA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF692AEE2E0A475D00A5C2DA /* Assets.xcassets in Resources */, + BF692AF02E0A475D00A5C2DA /* LaunchScreen.storyboard in Resources */, + BF692B442E0A910E00A5C2DA /* Localizable.xcstrings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 1E47DF7D50FE03B0B10E2DED /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-BeeReel-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + 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; + }; + BDB57E17AABB03B647FB0C32 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-BeeReel/Pods-BeeReel-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-BeeReel/Pods-BeeReel-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-BeeReel/Pods-BeeReel-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BF692AC52E0A475500A5C2DA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BFC676992E1280E3006659E5 /* BRSpotlightRecommandCell.swift in Sources */, + BF692B3C2E0A8D0200A5C2DA /* BRNavigationController.swift in Sources */, + BFC676692E0E34DA006659E5 /* BRUserAPI.swift in Sources */, + BFC676782E0E9553006659E5 /* BRSpotlightMainBaseCell.swift in Sources */, + BFC676732E0E938B006659E5 /* BRTableView.swift in Sources */, + BFC676932E126A62006659E5 /* BRSpotlightNewMainCell.swift in Sources */, + BFC6768D2E123D6E006659E5 /* AttributedString+BRAdd.swift in Sources */, + BF692B132E0A7B9000A5C2DA /* BRUserInfo.swift in Sources */, + BF692B042E0A76D200A5C2DA /* BRLoginManager.swift in Sources */, + BFC6769D2E129794006659E5 /* BRHomeTop10ViewController.swift in Sources */, + BF692AEB2E0A475D00A5C2DA /* AppDelegate.swift in Sources */, + BF692B242E0A825B00A5C2DA /* BRCryptorService.swift in Sources */, + BF692B342E0A87C800A5C2DA /* UIDevice+BRAdd.swift in Sources */, + BF692B3E2E0A8D2300A5C2DA /* BRTabBarController.swift in Sources */, + BF692B542E0AA8FA00A5C2DA /* BRCollectionView.swift in Sources */, + BF692B472E0A9B7900A5C2DA /* BRPlayer.swift in Sources */, + BF692B6E2E0BD4CB00A5C2DA /* BRHomeHeaderView.swift in Sources */, + BF692AFA2E0A6F0900A5C2DA /* BRNetwork.swift in Sources */, + BF692B6B2E0BC85300A5C2DA /* BRHomeViewController.swift in Sources */, + BF692B7C2E0D3C1300A5C2DA /* BRVideoInfoModel.swift in Sources */, + BFC6766D2E0E3A8D006659E5 /* BRImageView.swift in Sources */, + BFC6766F2E0E3B5C006659E5 /* UIImageView+BRAdd.swift in Sources */, + BF692B782E0D3A1200A5C2DA /* BRHomeModuleItem.swift in Sources */, + BF692B5A2E0AAADD00A5C2DA /* BRPlayerListCell.swift in Sources */, + BF692B162E0A7CD600A5C2DA /* BRHUD.swift in Sources */, + BFC676952E126BBF006659E5 /* BRSpotlightNewCell.swift in Sources */, + BF692B402E0A8FA100A5C2DA /* UIColor+BRAdd.swift in Sources */, + BF692B102E0A7B4300A5C2DA /* BRUserDefaultsKey.swift in Sources */, + BFC676852E122D9E006659E5 /* BRVideoDetailViewController.swift in Sources */, + BFC676912E126248006659E5 /* BRSpotlightTopCell.swift in Sources */, + BF692B422E0A8FB500A5C2DA /* UIFont+BRAdd.swift in Sources */, + BF692AEC2E0A475D00A5C2DA /* SceneDelegate.swift in Sources */, + BF692B492E0A9D0E00A5C2DA /* UIView+BRAdd.swift in Sources */, + BFC676812E122733006659E5 /* BRPlayerProtocol.swift in Sources */, + BF692B5F2E0B812800A5C2DA /* BRTabBarItemContainer.swift in Sources */, + BF692B652E0BC53900A5C2DA /* CGMutablePath+BRRoundedCorner.swift in Sources */, + BFC676752E0E93B3006659E5 /* BRTableViewCell.swift in Sources */, + BF78108B2E0D4EB3007DEEBC /* BRURLPath.swift in Sources */, + BF692B092E0A775500A5C2DA /* BRLoginToken.swift in Sources */, + BF692AFC2E0A6F8000A5C2DA /* BRNetworkTarget.swift in Sources */, + BF692B3A2E0A8C6000A5C2DA /* BRViewController.swift in Sources */, + BF692B182E0A7D8900A5C2DA /* BRToast.swift in Sources */, + BF692B0E2E0A7AF300A5C2DA /* UserDefaults+BRAdd.swift in Sources */, + BF692B582E0AAA6F00A5C2DA /* UIScreen+BRAdd.swift in Sources */, + BF692B1F2E0A804600A5C2DA /* BRLocalizedManager.swift in Sources */, + BF692B612E0B814F00A5C2DA /* BRTabBarItemContentView.swift in Sources */, + BF692B012E0A74A200A5C2DA /* BRDefine.swift in Sources */, + BFC6767B2E0E973B006659E5 /* UIStackView+BRAdd.swift in Sources */, + BFC676892E122FDD006659E5 /* BRVideoAPI.swift in Sources */, + BFC6769B2E1285C5006659E5 /* BRPagerViewTransformer.swift in Sources */, + BFC676832E122CC5006659E5 /* BRPlayerViewModel.swift in Sources */, + BF692B672E0BC6C700A5C2DA /* AppDelegate+BRConfig.swift in Sources */, + BF692B222E0A820D00A5C2DA /* String+BRAdd.swift in Sources */, + BF692B632E0B9D4800A5C2DA /* BRTabBarItem.swift in Sources */, + BFC6768B2E123690006659E5 /* BRVideoRevolutionManager.swift in Sources */, + BFC6768F2E125D5B006659E5 /* BRSpotlightTopMainCell.swift in Sources */, + BF692B1C2E0A7DE800A5C2DA /* BRAppTool.swift in Sources */, + BFC676622E0E2C8E006659E5 /* WMZBannerView.m in Sources */, + BFC676632E0E2C8E006659E5 /* WMZBannerOverLayout.m in Sources */, + BFC676642E0E2C8E006659E5 /* WMZBannerFlowLayout.m in Sources */, + BFC676652E0E2C8E006659E5 /* WMZBannerControl.m in Sources */, + BFC676972E127D3C006659E5 /* BRSpotlightRecommandMainCell.swift in Sources */, + BFC6767F2E121A72006659E5 /* BRSpotlightHotCell.swift in Sources */, + BFC6767D2E0E9809006659E5 /* BRSpotlightHotMainCell.swift in Sources */, + BFC676662E0E2C8E006659E5 /* WMZBannerFadeLayout.m in Sources */, + BFC676872E122E36006659E5 /* BRVideoDetailModel.swift in Sources */, + BFC676672E0E2C8E006659E5 /* WMZBannerParam.m in Sources */, + BF692B732E0D397700A5C2DA /* BRHomeAPI.swift in Sources */, + BF692B7A2E0D3BD300A5C2DA /* BRShortModel.swift in Sources */, + BFC676712E0E9234006659E5 /* BRSpotlightViewViewController.swift in Sources */, + BF0DBDD12E0D4E150035F6B4 /* BRTabBar.swift in Sources */, + BF692B562E0AA92100A5C2DA /* BRCollectionViewCell.swift in Sources */, + BF692B072E0A771C00A5C2DA /* BRModel.swift in Sources */, + BF692B752E0D39D000A5C2DA /* BRListModel.swift in Sources */, + BF692B512E0AA8C600A5C2DA /* BRPlayerListViewController.swift in Sources */, + BFC676522E0D4EFD006659E5 /* BRHomeViewModel.swift in Sources */, + BF692B2A2E0A84F700A5C2DA /* JXUUID.m in Sources */, + BF692B2B2E0A84F700A5C2DA /* PDKeyChain.m in Sources */, + BFC6766B2E0E395F006659E5 /* BRHomeHeaderBannerCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + BF692AE52E0A475D00A5C2DA /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + BF692AE42E0A475D00A5C2DA /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + BF692ADD2E0A475700A5C2DA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F06627B1DEE86552C2A87AEC /* Pods-BeeReel.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 394VH538M8; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = BeeReel/Sources/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = BeeReel; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.BeeReel; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "BeeReel/Sources/Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + BF692ADE2E0A475700A5C2DA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F70FA1F4169364C4C53534CE /* Pods-BeeReel.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 394VH538M8; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = BeeReel/Sources/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = BeeReel; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = ""; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.BeeReel; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "BeeReel/Sources/Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + BF692ADF2E0A475700A5C2DA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 394VH538M8; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + BF692AE02E0A475700A5C2DA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 394VH538M8; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BF692AC42E0A475500A5C2DA /* Build configuration list for PBXProject "BeeReel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BF692ADF2E0A475700A5C2DA /* Debug */, + BF692AE02E0A475700A5C2DA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BF692ADC2E0A475700A5C2DA /* Build configuration list for PBXNativeTarget "BeeReel" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BF692ADD2E0A475700A5C2DA /* Debug */, + BF692ADE2E0A475700A5C2DA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BF692AC12E0A475500A5C2DA /* Project object */; +} diff --git a/BeeReel/Base/Controller/BRNavigationController.swift b/BeeReel/Base/Controller/BRNavigationController.swift new file mode 100644 index 0000000..09c44ad --- /dev/null +++ b/BeeReel/Base/Controller/BRNavigationController.swift @@ -0,0 +1,44 @@ +// +// BRNavigationController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRNavigationController: UINavigationController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override func pushViewController(_ viewController: UIViewController, animated: Bool) { + if children.count > 0 { + viewController.hidesBottomBarWhenPushed = true + } + super.pushViewController(viewController, animated: animated) + } + + override func setViewControllers(_ viewControllers: [UIViewController], animated: Bool) { + for (index, value) in viewControllers.enumerated() { + if index != 0 { + value.hidesBottomBarWhenPushed = true + } + } + super.setViewControllers(viewControllers, animated: animated) + } + + + //MARK:-------------- 状态栏样式 -------------- + override var childForStatusBarStyle: UIViewController? { + return self.topViewController + } + + override var childForStatusBarHidden: UIViewController? { + return self.topViewController + } + +} diff --git a/BeeReel/Base/Controller/BRTabBarController.swift b/BeeReel/Base/Controller/BRTabBarController.swift new file mode 100644 index 0000000..0273498 --- /dev/null +++ b/BeeReel/Base/Controller/BRTabBarController.swift @@ -0,0 +1,118 @@ +// +// BRTabBarController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRTabBarController: UITabBarController { + + private var ignoreNextSelection = false + + override var selectedViewController: UIViewController? { + willSet { + guard let newValue = newValue else { + // if newValue == nil ... + return + } + + guard !ignoreNextSelection else { + ignoreNextSelection = false + return + } + + guard let tabBar = self.tabBar as? BRTabBar, let index = viewControllers?.firstIndex(of: newValue) else { + return + } + tabBar.select(itemAtIndex: index, animated: false) + } + } + + override var selectedIndex: Int { + willSet { + guard let tabBar = self.tabBar as? BRTabBar else { + return + } + guard !ignoreNextSelection else { + ignoreNextSelection = false + return + } + + tabBar.select(itemAtIndex: newValue, animated: false) + } + } + + override func viewDidLoad() { + super.viewDidLoad() + let tabBar = BRTabBar() + tabBar.delegate = self + self.setValue(tabBar, forKey: "tabBar") + self.tabBar.isTranslucent = true + + + br_setup() + } + + + //MARK:-------------- 状态栏样式 -------------- + override var childForStatusBarStyle: UIViewController? { + return self.selectedViewController + } + + override var childForStatusBarHidden: UIViewController? { + return self.selectedViewController + } + +} + +extension BRTabBarController { + + private func br_setup() { + let nav1 = createNavigationController(viewController: BRHomeViewController(), title: "首页".localized, image: UIImage(named: "tabbar_icon_01"), selectedImage: UIImage(named: "tabbar_icon_01_selected")) + let nav2 = createNavigationController(viewController: BRViewController(), title: "推荐".localized, image: UIImage(named: "tabbar_icon_02"), selectedImage: UIImage(named: "tabbar_icon_02_selected")) + let nav3 = createNavigationController(viewController: BRViewController(), title: "首页".localized, image: UIImage(named: "tabbar_icon_03"), selectedImage: UIImage(named: "tabbar_icon_03_selected")) + let nav4 = createNavigationController(viewController: BRViewController(), title: "首页".localized, image: UIImage(named: "tabbar_icon_04"), selectedImage: UIImage(named: "tabbar_icon_04_selected")) + + viewControllers = [nav1, nav2, nav3, nav4] + + } + + private func createNavigationController(viewController: UIViewController, title: String?, image: UIImage?, selectedImage: UIImage?) -> UINavigationController { + let tabBarItem = BRTabBarItem() + tabBarItem.title = title + tabBarItem.image = image + tabBarItem.selectedImage = selectedImage + + let nav = BRNavigationController(rootViewController: viewController) + nav.tabBarItem = tabBarItem + return nav + } +} + +extension BRTabBarController { + + override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) { + guard let idx = tabBar.items?.firstIndex(of: item) else { + return; + } + if let vc = viewControllers?[idx] { + ignoreNextSelection = true + selectedIndex = idx + delegate?.tabBarController?(self, didSelect: vc) + } + } + + override func tabBar(_ tabBar: UITabBar, willBeginCustomizing items: [UITabBarItem]) { + if let tabBar = tabBar as? BRTabBar { + tabBar.updateLayout() + } + } + + override func tabBar(_ tabBar: UITabBar, didEndCustomizing items: [UITabBarItem], changed: Bool) { + if let tabBar = tabBar as? BRTabBar { + tabBar.updateLayout() + } + } +} diff --git a/BeeReel/Base/Controller/BRViewController.swift b/BeeReel/Base/Controller/BRViewController.swift new file mode 100644 index 0000000..81ff9f3 --- /dev/null +++ b/BeeReel/Base/Controller/BRViewController.swift @@ -0,0 +1,54 @@ +// +// BRViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRViewController: UIViewController { + + private(set) var isViewDidLoad = false + private(set) var isDidAppear = false + private(set) var hasViewDidAppear = false + + var statusBarStyle: UIStatusBarStyle = .darkContent { + didSet { + self.setNeedsStatusBarAppearanceUpdate() + } + } + + override func viewDidLoad() { + super.viewDidLoad() + self.edgesForExtendedLayout = [] + self.isViewDidLoad = true + self.view.backgroundColor = .backgroundColor() + + } + + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + isDidAppear = true + hasViewDidAppear = true + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + isDidAppear = false + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + isDidAppear = false + } + + override var preferredStatusBarStyle: UIStatusBarStyle { + return statusBarStyle + } + + func handleHeaderRefresh(_ completer: (() -> Void)?) {} + + func handleFooterRefresh(_ completer: (() -> Void)?) {} +} diff --git a/BeeReel/Base/Define/BRDefine.swift b/BeeReel/Base/Define/BRDefine.swift new file mode 100644 index 0000000..f1503ad --- /dev/null +++ b/BeeReel/Base/Define/BRDefine.swift @@ -0,0 +1,47 @@ +// +// BRDefine.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +//MARK:-------------- 系统版本号 -------------- +///当前系统版本号 +let kBROsVersion: String = UIDevice.current.systemVersion +let kBRAPPBundleIdentifier: String = (Bundle.main.infoDictionary!["CFBundleIdentifier"] as? String) ?? "0" + +///app版本号 +public let kBRAPPVersion: String = (Bundle.main.infoDictionary!["CFBundleShortVersionString"] as? String) ?? "0" +public let kSBAPPBundleVersion: String = (Bundle.main.infoDictionary!["CFBundleVersion"] as? String) ?? "0" + +public let kBRAPPBundleName: String = (Bundle.main.infoDictionary!["CFBundleName"] as? String) ?? "" +public let kBRAPPName: String = (Bundle.main.infoDictionary!["CFBundleDisplayName"] as? String) ?? "" + + +//MARK: ------- 打印信息 ---------- +#if DEBUG +public func brLog(message: Any? , file: String = #file, function: String = #function, line: Int = #line) { + print("\n\(Date(timeIntervalSinceNow: 8 * 60 * 60)) \(file.components(separatedBy: "/").last ?? "") \(function) \(line): \(message ?? "")") +} +#else +public func brLog(message: Any?) { } +#endif + +public func br_swizzled_instanceMethod(_ prefix: String, oldClass: Swift.AnyClass!, oldSelector: String, newClass: Swift.AnyClass) { + let newSelector = prefix + "_" + oldSelector; + let originalSelector = NSSelectorFromString(oldSelector) + let swizzledSelector = NSSelectorFromString(newSelector) + + let originalMethod = class_getInstanceMethod(oldClass, originalSelector) + let swizzledMethod = class_getInstanceMethod(newClass, swizzledSelector) + + let isAdd = class_addMethod(oldClass, originalSelector, method_getImplementation(swizzledMethod!), method_getTypeEncoding(swizzledMethod!)) + + if isAdd { + class_replaceMethod(newClass, swizzledSelector, method_getImplementation(originalMethod!), method_getTypeEncoding(originalMethod!)) + }else { + method_exchangeImplementations(originalMethod!, swizzledMethod!) + } +} diff --git a/BeeReel/Base/Define/BRUserDefaultsKey.swift b/BeeReel/Base/Define/BRUserDefaultsKey.swift new file mode 100644 index 0000000..0ce5633 --- /dev/null +++ b/BeeReel/Base/Define/BRUserDefaultsKey.swift @@ -0,0 +1,17 @@ +// +// BRUserDefaultsKey.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + + +///登录token +let kBRLoginTokenDefaultsKey = "kBRLoginTokenDefaultsKey" + +///用户信息 +let kBRLoginUserInfoDefaultsKey = "kBRLoginUserInfoDefaultsKey" + +///分辨率 +let kBRVideoRevolutionDefaultsKey = "kBRVideoRevolutionDefaultsKey" + diff --git a/BeeReel/Base/Extension/AttributedString+BRAdd.swift b/BeeReel/Base/Extension/AttributedString+BRAdd.swift new file mode 100644 index 0000000..78c5aba --- /dev/null +++ b/BeeReel/Base/Extension/AttributedString+BRAdd.swift @@ -0,0 +1,19 @@ +// +// AttributedString+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +extension AttributedString { + + static func br_createAttributedString(string: String, color: UIColor, font: UIFont) -> AttributedString { + return AttributedString(string, attributes: AttributeContainer([ + .foregroundColor: color, + .font : font + ])) + } + +} diff --git a/BeeReel/Base/Extension/CGMutablePath+BRRoundedCorner.swift b/BeeReel/Base/Extension/CGMutablePath+BRRoundedCorner.swift new file mode 100644 index 0000000..83bdbf6 --- /dev/null +++ b/BeeReel/Base/Extension/CGMutablePath+BRRoundedCorner.swift @@ -0,0 +1,65 @@ +// +// CGMutablePath+BRRoundedCorner.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/25. +// + +import UIKit + +struct BRRoundedCorner { + var topLeft:CGFloat = 0 + var topRight:CGFloat = 0 + var bottomLeft:CGFloat = 0 + var bottomRight:CGFloat = 0 + + public static let zero = BRRoundedCorner(topLeft: 0, topRight: 0, bottomLeft: 0, bottomRight: 0) + public init(topLeft: CGFloat, topRight:CGFloat, bottomLeft:CGFloat, bottomRight:CGFloat) { + self.topLeft = topLeft + self.topRight = topRight + self.bottomLeft = bottomLeft + self.bottomRight = bottomRight + } + static func ==(v1:BRRoundedCorner, v2:BRRoundedCorner) -> Bool { + return v1.bottomLeft == v2.bottomLeft + && v1.bottomRight == v2.bottomRight + && v1.topLeft == v2.topLeft + && v1.topRight == v2.topRight + } + static func !=(v1:BRRoundedCorner, v2:BRRoundedCorner) -> Bool { + return !(v1 == v2) + } +} + +extension CGMutablePath { + func addRadiusRectangle(_ circulars: BRRoundedCorner, rect: CGRect) { + let minX = rect.minX + let minY = rect.minY + let maxX = rect.maxX + let maxY = rect.maxY + + //获取四个圆心 + let topLeftCenterX = minX + circulars.topLeft + let topLeftCenterY = minY + circulars.topLeft + + let topRightCenterX = maxX - circulars.topRight + let topRightCenterY = minY + circulars.topRight + + let bottomLeftCenterX = minX + circulars.bottomLeft + let bottomLeftCenterY = maxY - circulars.bottomLeft + + let bottomRightCenterX = maxX - circulars.bottomRight + let bottomRightCenterY = maxY - circulars.bottomRight + + //顶 左 + addArc(center: CGPoint(x: topLeftCenterX, y: topLeftCenterY), radius: circulars.topLeft, startAngle: CGFloat.pi, endAngle: CGFloat.pi * 3 / 2, clockwise: false) + //顶右 + addArc(center: CGPoint(x: topRightCenterX, y: topRightCenterY), radius: circulars.topRight, startAngle: CGFloat.pi * 3 / 2, endAngle: 0, clockwise: false) + //底右 + addArc(center: CGPoint(x: bottomRightCenterX, y: bottomRightCenterY), radius: circulars.bottomRight, startAngle: 0, endAngle: CGFloat.pi / 2, clockwise: false) + //底左 + addArc(center: CGPoint(x: bottomLeftCenterX, y: bottomLeftCenterY), radius: circulars.bottomLeft, startAngle: CGFloat.pi / 2, endAngle: CGFloat.pi, clockwise: false) + closeSubpath(); + + } +} diff --git a/BeeReel/Base/Extension/String+BRAdd.swift b/BeeReel/Base/Extension/String+BRAdd.swift new file mode 100644 index 0000000..f645b3d --- /dev/null +++ b/BeeReel/Base/Extension/String+BRAdd.swift @@ -0,0 +1,12 @@ +// +// String+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import SmartCodable + +extension String: SmartCodable { + +} diff --git a/BeeReel/Base/Extension/UIColor+BRAdd.swift b/BeeReel/Base/Extension/UIColor+BRAdd.swift new file mode 100644 index 0000000..930d0ba --- /dev/null +++ b/BeeReel/Base/Extension/UIColor+BRAdd.swift @@ -0,0 +1,53 @@ +// +// UIColor.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +extension UIColor { + + static func backgroundColor() -> UIColor { + return colorEFEFF5() + } + + static func themeColor() -> UIColor { + return color1C1C1C() + } +} + +extension UIColor { + static func colorFFFFFF(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0xFFFFFF, alpha: alpha) + } + + static func color000000(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0x000000, alpha: alpha) + } + + static func color1C1C1C(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0x1C1C1C, alpha: alpha) + } + + static func colorEFEFF5(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0xEFEFF5, alpha: alpha) + } + + static func colorD3D3D3(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0xD3D3D3, alpha: alpha) + } + + static func colorF1FF94(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0xF1FF94, alpha: alpha) + } + + static func color899D00(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0x899D00, alpha: alpha) + } + + static func colorFF7489(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0xFF7489, alpha: alpha) + } +} diff --git a/BeeReel/Base/Extension/UIDevice+BRAdd.swift b/BeeReel/Base/Extension/UIDevice+BRAdd.swift new file mode 100644 index 0000000..c052a6f --- /dev/null +++ b/BeeReel/Base/Extension/UIDevice+BRAdd.swift @@ -0,0 +1,71 @@ +// +// UIDevice+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +extension UIDevice { + //http://theiphonewiki.com/wiki/Models + static func br_machineModelName() -> String { + guard let machineModel = UIDevice.current.machineModel else { return "" } + let map = [ + "iPhone1,1" : "iPhone", + "iPhone1,2" : "iPhone 3G", + "iPhone2,1" : "iPhone 3GS", + "iPhone3,1" : "iPhone 4", + "iPhone3,2" : "iPhone 4", + "iPhone3,3" : "iPhone 4", + "iPhone4,1" : "iPhone4,1", + "iPhone5,1" : "iPhone 5", + "iPhone5,2" : "iPhone 5", + "iPhone5,3" : "iPhone 5c", + "iPhone5,4" : "iPhone 5c", + "iPhone6,1" : "iPhone 5s", + "iPhone6,2" : "iPhone 5s", + "iPhone7,2" : "iPhone 6", + "iPhone7,1" : "iPhone 6 Plus", + "iPhone8,1" : "iPhone 6s", + "iPhone8,2" : "iPhone 6s Plus", + "iPhone8,4" : "iPhone SE (1st generation)", + "iPhone9,1" : "iPhone 7", + "iPhone9,3" : "iPhone 7", + "iPhone9,2" : "iPhone 7 Plus", + "iPhone9,4" : "iPhone 7 Plus", + "iPhone10,1" : "iPhone 8", + "iPhone10,4" : "iPhone 8", + "iPhone10,2" : "iPhone 8 Plus", + "iPhone10,5" : "iPhone 8 Plus", + "iPhone10,3" : "iPhone X", + "iPhone10,6" : "iPhone X", + "iPhone11,8" : "iPhone XR", + "iPhone11,2" : "iPhone11,2", + "iPhone11,6" : "iPhone XS Max", + "iPhone11,4" : "iPhone XS Max", + "iPhone12,1" : "iPhone 11", + "iPhone12,3" : "iPhone 11 Pro", + "iPhone12,5" : "iPhone 11 Pro Max", + "iPhone12,8" : "iPhone SE (2nd generation)", + "iPhone13,1" : "iPhone 12 mini", + "iPhone13,2" : "iPhone13,2", + "iPhone13,3" : "iPhone 12 Pro", + "iPhone13,4" : "iPhone 12 Pro Max", + "iPhone14,4" : "iPhone 13 mini", + "iPhone14,5" : "iPhone 13", + "iPhone14,2" : "iPhone 13 Pro", + "iPhone14,3" : "iPhone 13 Pro Max", + "iPhone14,6" : "iPhone SE (3rd generation)", + "iPhone14,7" : "iPhone 14", + "iPhone14,8" : "iPhone 14 Plus", + "iPhone15,2" : "iPhone 14 Pro", + "iPhone15,3" : "iPhone 14 Pro Max", + ] + if let name = map[machineModel] { + return name + } + + return machineModel + } +} diff --git a/BeeReel/Base/Extension/UIFont+BRAdd.swift b/BeeReel/Base/Extension/UIFont+BRAdd.swift new file mode 100644 index 0000000..ca26bfb --- /dev/null +++ b/BeeReel/Base/Extension/UIFont+BRAdd.swift @@ -0,0 +1,24 @@ +// +// UIFont+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + + +extension UIFont { + + static func fontRegular(ofSize: CGFloat) -> UIFont { + return .systemFont(ofSize: ofSize, weight: .regular) + } + + static func fontMedium(ofSize: CGFloat) -> UIFont { + return .systemFont(ofSize: ofSize, weight: .medium) + } + + static func fontBold(ofSize: CGFloat) -> UIFont { + return .systemFont(ofSize: ofSize, weight: .bold) + } +} diff --git a/BeeReel/Base/Extension/UIImageView+BRAdd.swift b/BeeReel/Base/Extension/UIImageView+BRAdd.swift new file mode 100644 index 0000000..fd6f3f5 --- /dev/null +++ b/BeeReel/Base/Extension/UIImageView+BRAdd.swift @@ -0,0 +1,24 @@ +// +// UIImageView+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit +import Kingfisher + +extension UIImageView { + func br_setImage(url: String?, placeholder: UIImage? = nil, completer: ((_ image: UIImage?, _ url: URL?) -> Void)? = nil) { + + self.kf.setImage(with: URL(string: url ?? ""), placeholder: placeholder, options: nil) { result in + switch result { + case .success(let value): + completer?(value.image, value.source.url) + default : + completer?(nil, nil) + break + } + } + } +} diff --git a/BeeReel/Base/Extension/UIScreen+BRAdd.swift b/BeeReel/Base/Extension/UIScreen+BRAdd.swift new file mode 100644 index 0000000..1b0c91c --- /dev/null +++ b/BeeReel/Base/Extension/UIScreen+BRAdd.swift @@ -0,0 +1,49 @@ +// +// UIScreen+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +extension UIScreen { + + static var screen: UIScreen { + if let screen = BRAppTool.windowScene?.screen { + return screen + } else { + return UIScreen.main + } + } + + static var width: CGFloat { + return screen.bounds.width + } + + static var height: CGFloat { + return screen.bounds.height + } + + static var statusBarHeight: CGFloat { + let top = BRAppTool.windowScene?.windows.first?.safeAreaInsets.top ?? 20 + return top + } + + static var tabbarSafeBottomMargin: CGFloat { + let bottom = BRAppTool.windowScene?.windows.first?.safeAreaInsets.bottom ?? 0 + return bottom + } + + static var navBarHeight: CGFloat { + return statusBarHeight + 44 + } + + static var tabBarHeight: CGFloat { + return tabbarSafeBottomMargin + 49 + } + + static var customTabBarHeight: CGFloat { + return tabbarSafeBottomMargin + 50 + } +} diff --git a/BeeReel/Base/Extension/UIStackView+BRAdd.swift b/BeeReel/Base/Extension/UIStackView+BRAdd.swift new file mode 100644 index 0000000..e978947 --- /dev/null +++ b/BeeReel/Base/Extension/UIStackView+BRAdd.swift @@ -0,0 +1,18 @@ +// +// UIStackView+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +extension UIStackView { + + func br_removeAllArrangedSubview() { + let arrangedSubviews = self.arrangedSubviews + + arrangedSubviews.forEach { + self.removeArrangedSubview($0) + $0.removeFromSuperview() + } + } +} diff --git a/BeeReel/Base/Extension/UIView+BRAdd.swift b/BeeReel/Base/Extension/UIView+BRAdd.swift new file mode 100644 index 0000000..5b31f6a --- /dev/null +++ b/BeeReel/Base/Extension/UIView+BRAdd.swift @@ -0,0 +1,94 @@ +// +// UIView+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit +import SnapKit + +extension UIView { + fileprivate struct AssociatedKeys { + static var br_roundedCorner: Int? + static var br_effect: Int? + } + + @objc public static func vp_Awake() { + br_swizzled_instanceMethod("br", oldClass: self, oldSelector: "layoutSubviews", newClass: self) + } + + @objc func br_layoutSubviews() { + br_layoutSubviews() + + _updateRoundedCorner() + + if let effectView = effectView, effectView.frame != self.bounds { + effectView.frame = self.bounds + } + } +} + +//MARK: -------------- 圆角 -------------- +extension UIView { + + + private var roundedCorner: BRRoundedCorner? { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.br_roundedCorner) as? BRRoundedCorner + } + set { + objc_setAssociatedObject(self, &AssociatedKeys.br_roundedCorner, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + ///设置圆角 + func setRoundedCorner(topLeft: CGFloat, topRight: CGFloat, bottomLeft: CGFloat, bottomRight: CGFloat) { + //清空其它设置方法 + self.roundedCorner = BRRoundedCorner(topLeft: topLeft, topRight: topRight, bottomLeft: bottomLeft, bottomRight: bottomRight) + _updateRoundedCorner() + } + + private func _updateRoundedCorner() { + guard let roundedCorner = self.roundedCorner else { return } + let rect = self.bounds + + let path = CGMutablePath() + path.addRadiusRectangle(roundedCorner, rect: rect) + + let maskLayer = CAShapeLayer() + maskLayer.frame = self.bounds + maskLayer.path = path + self.layer.mask = maskLayer + } + +} + +//MARK: -------------- 模糊效果 -------------- +extension UIView { + private var effectView: UIVisualEffectView? { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.br_effect) as? UIVisualEffectView + } + set { + objc_setAssociatedObject(self, &AssociatedKeys.br_effect, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + ///添加模糊效果 + func br_addEffectView(style: UIBlurEffect.Style = .light) { + if self.effectView == nil { + let blur = UIBlurEffect(style: style) + let effectView = UIVisualEffectView(effect: blur) + effectView.isUserInteractionEnabled = false + self.addSubview(effectView) + self.sendSubviewToBack(effectView) + + self.effectView = effectView + } + } + ///删除模糊效果 + func br_removeEffectView() { + self.effectView?.removeFromSuperview() + self.effectView = nil + } +} diff --git a/BeeReel/Base/Extension/UserDefaults+BRAdd.swift b/BeeReel/Base/Extension/UserDefaults+BRAdd.swift new file mode 100644 index 0000000..aa67397 --- /dev/null +++ b/BeeReel/Base/Extension/UserDefaults+BRAdd.swift @@ -0,0 +1,44 @@ +// +// UserDefaults+BRAdd.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import Foundation + + +extension UserDefaults { + + static func br_setObject(_ obj: NSSecureCoding?, forKey key: String) { + let defaults = UserDefaults.standard + + guard let obj = obj else { + defaults.removeObject(forKey: key) + return + } + + do { + let data = try NSKeyedArchiver.archivedData(withRootObject: obj, requiringSecureCoding: true) + defaults.set(data, forKey: key) + } catch { + print("Error archiving object: \(error)") + } + } + + static func br_object(forKey key: String, as type: T.Type) -> T? { + let defaults = UserDefaults.standard + + guard let data = defaults.data(forKey: key) else { + return nil + } + + do { + let object = try NSKeyedUnarchiver.unarchivedObject(ofClass: type, from: data) + return object + } catch { + print("Error unarchiving object: \(error)") + return nil + } + } +} diff --git a/BeeReel/Base/Model/BRListModel.swift b/BeeReel/Base/Model/BRListModel.swift new file mode 100644 index 0000000..8f14ead --- /dev/null +++ b/BeeReel/Base/Model/BRListModel.swift @@ -0,0 +1,22 @@ +// +// BRListModel.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/26. +// + +import UIKit +import SmartCodable + +class BRListModel: BRModel, SmartCodable { + var list: [T]? + var pagination: BRListPaginationModel? +} + + +class BRListPaginationModel: BRModel, SmartCodable { + var current_page: Int? + var page_size: Int? + var page_total: Int? + var total_size: Int? +} diff --git a/BeeReel/Base/Model/BRModel.swift b/BeeReel/Base/Model/BRModel.swift new file mode 100644 index 0000000..1def2ff --- /dev/null +++ b/BeeReel/Base/Model/BRModel.swift @@ -0,0 +1,15 @@ +// +// BRModel.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRModel: NSObject { + + required override init() { + super.init() + } +} diff --git a/BeeReel/Base/Network/API/BRHomeAPI.swift b/BeeReel/Base/Network/API/BRHomeAPI.swift new file mode 100644 index 0000000..0ad9ca4 --- /dev/null +++ b/BeeReel/Base/Network/API/BRHomeAPI.swift @@ -0,0 +1,32 @@ +// +// BRHomeAPI.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/26. +// + + +class BRHomeAPI { + ///首页数据 + static func requestHomeData(completer: ((_ list: [BRHomeModuleItem]?) -> Void)?) { + var param = BRNetworkParameters(path: "/home/all-modules") + param.method = .get + param.isToast = true + + BRNetwork.request(parameters: param) { (response: BRNetworkResponse>) in + completer?(response.data?.list) + } + } + + ///排行 + static func requestTop10List(completer: ((_ list: [BRShortModel]?) -> Void)?) { + var param = BRNetworkParameters(path: "/getVisitTop") + param.method = .get + + BRNetwork.request(parameters: param) { (response: BRNetworkResponse<[BRShortModel]>) in + completer?(response.data) + } + } + + +} diff --git a/BeeReel/Base/Network/API/BRUserAPI.swift b/BeeReel/Base/Network/API/BRUserAPI.swift new file mode 100644 index 0000000..300d0d1 --- /dev/null +++ b/BeeReel/Base/Network/API/BRUserAPI.swift @@ -0,0 +1,20 @@ +// +// BRUserAPI.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + + +class BRUserAPI { + ///获取用户信息 + static func requestUserInfo(completer: ((_ userInfo: BRUserInfo?) -> Void)?) { + + var param = BRNetworkParameters(path: "/customer/info") + param.method = .get + + BRNetwork.request(parameters: param) { (response: BRNetworkResponse) in + completer?(response.data) + } + } +} diff --git a/BeeReel/Base/Network/API/BRVideoAPI.swift b/BeeReel/Base/Network/API/BRVideoAPI.swift new file mode 100644 index 0000000..782ee7e --- /dev/null +++ b/BeeReel/Base/Network/API/BRVideoAPI.swift @@ -0,0 +1,75 @@ +// +// BRVideoAPI.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRVideoAPI { + ///获取视频详情 + static func requestVideoDetail(shortPlayId: String, activityId: String? = nil, revolution: BRShortModel.VideoRevolution? = nil, completer: ((_ model: BRVideoDetailModel?) -> Void)?) { + var parameters: [String : Any] = [ + "short_play_id" : shortPlayId, + "video_id" : "0" + ] + + if let activityId = activityId { + parameters["activity_id"] = activityId + } + + if let revolution = revolution?.rawValue { + parameters["revolution"] = revolution + } + + var param = BRNetworkParameters(path: "/getVideoDetails") + param.method = .get + param.parameters = parameters + + BRNetwork.request(parameters: param) { (response: BRNetworkResponse) in + completer?(response.data) + } + } + + + ///收藏 + static func requestFavorite(isFavorite: Bool, shortPlayId: String, videoId: String?, isLoding: Bool = true, success: (() -> Void)?, failure: (() -> Void)? = nil) { + let path: String + if isFavorite { + path = "/collect" + } else { + path = "/cancelCollect" + } + + var parameters: [String : Any] = [ + "short_play_id" : shortPlayId, + ] + + if let videoId = videoId { + parameters["video_id"] = videoId + } + + var param = BRNetworkParameters(path: path) + param.isLoding = isLoding + param.parameters = parameters + + BRNetwork.request(parameters: param) { (response: BRNetworkResponse) in + if response.code == BRNetworkCodeSucceed { + success?() + NotificationCenter.default.post(name: BRVideoAPI.updateShortFavoriteStateNotification, object: nil, userInfo: [ + "state" : isFavorite, + "id" : shortPlayId, + ]) + } else { + failure?() + } + } + } +} + + +extension BRVideoAPI { + ///更新短剧关注状态 [ "state" : isFavorite, "id" : shortPlayId,] + @objc static let updateShortFavoriteStateNotification = NSNotification.Name(rawValue: "BRVideoAPI.updateShortFavoriteStateNotification") +} diff --git a/BeeReel/Base/Network/Base/BRCryptorService.swift b/BeeReel/Base/Network/Base/BRCryptorService.swift new file mode 100644 index 0000000..9044dce --- /dev/null +++ b/BeeReel/Base/Network/Base/BRCryptorService.swift @@ -0,0 +1,102 @@ +// +// BRCryptorService.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +struct BRCryptorService { + + // 定义常量 + static let EN_STR_TAG: String = "$" // 替换为实际的加密标记 + + // 解密字符串 + static func decrypt(data: String) -> String { + guard data.hasPrefix(EN_STR_TAG) else { +// fatalError("Invalid encoded string") + return data + } + + let decryptedData = deStrBytes(data: data) + return String(data: decryptedData, encoding: .utf8) ?? "" + } + + // 从十六进制字符串解密字节 + static func deStrBytes(data: String) -> Data { + + let hexData = String(data.dropFirst()) + var bytes = Data() + + var index = hexData.startIndex + while index < hexData.endIndex { + let nextIndex = hexData.index(index, offsetBy: 2, limitedBy: hexData.endIndex) ?? hexData.endIndex + let byteString = String(hexData[index.. Data { + guard !data.isEmpty else { + return data + } + + let saltLen = Int(data[data.startIndex]) + guard data.count >= 1 + saltLen else { + return data + } + + let salt = data.subdata(in: 1..<1+saltLen) + let encryptedData = data.subdata(in: 1+saltLen.. Data { + let decryptedData = cxEd(data: data) + return removeSalt(data: decryptedData, salt: salt) + } + + // 加密/解密数据(按位取反) + static func cxEd(data: Data) -> Data { + return Data(data.map { $0 ^ 0xFF }) + } + + // 从数据中移除盐值 + static func removeSalt(data: Data, salt: Data) -> Data { + guard !salt.isEmpty else { + return data + } + + var result = Data() + let saltBytes = [UInt8](salt) + let saltCount = saltBytes.count + + for (index, byte) in data.enumerated() { + let saltByte = saltBytes[index % saltCount] + let decryptedByte = calRemoveSalt(v: byte, s: saltByte) + result.append(decryptedByte) + } + + return result + } + + // 计算移除盐值后的字节 + static func calRemoveSalt(v: UInt8, s: UInt8) -> UInt8 { + if v >= s { + return v - s + } else { + return UInt8(0xFF) - (s - v) + 1 + } + } +} diff --git a/BeeReel/Base/Network/Base/BRNetwork.swift b/BeeReel/Base/Network/Base/BRNetwork.swift new file mode 100644 index 0000000..e5ef104 --- /dev/null +++ b/BeeReel/Base/Network/Base/BRNetwork.swift @@ -0,0 +1,229 @@ +// +// BRNetwork.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import Foundation +import Moya +import SmartCodable + +///获取数据成功 +let BRNetworkCodeSucceed = 200 + + +struct BRNetwork { + ///用来获取token的线程 + private static let operationQueue = OperationQueue() + private static var tokenOperation: BlockOperation? + + static let provider = MoyaProvider(requestClosure: CustomApiTimeoutClosure) + + static func request(parameters: BRNetworkParameters, completion: ((_ response: BRNetworkResponse) -> Void)?) { + + if BRLoginManager.manager.token == nil { + self.requestToken(completer: nil) + } + + + if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" { + + let requestOperation = BlockOperation { + let semaphore = DispatchSemaphore(value: 0) + _request(parameters: parameters) { (response: BRNetworkResponse) in + semaphore.signal() + completion?(response) + } + semaphore.wait() + } + ///设置依赖关系 + requestOperation.addDependency(tokenOperation) + + operationQueue.addOperation(requestOperation) + } else { + _request(parameters: parameters, completion: completion) + } + } + + @discardableResult + static func _request(parameters: BRNetworkParameters, completion: ((_ response: BRNetworkResponse) -> Void)?) -> Cancellable { + + if parameters.isLoding { + BRHUD.show() + } + return provider.requestCustomJson(.request(parameters: parameters)) { (result) in + + if parameters.isLoding { + BRHUD.dismiss() + } + guard let completion = completion else {return} + + + _resultDispose(parameters: parameters, result: result, completion: completion) + } + } + + + private static func _resultDispose(parameters: BRNetworkParameters, result: Result, completion: ((_ response: BRNetworkResponse) -> Void)?) { + + switch result { + case .success(let response): + let code = response.statusCode + if code == 401 || code == 402 || code == 403 { + + if parameters.path == "/customer/register" { + var res = BRNetworkResponse() + res.code = -1 + if parameters.isToast { + BRToast.show(text: "Error".localized) + } + completion?(res) + } else { + if code == 402, parameters.isToast { + BRToast.show(text: "veloria_network_error_1".localized) + } + ///重新获取token + self.requestToken { token in + if token != nil { + BRLoginManager.manager.updateUserInfo(completer: nil) + } + } + + ///将请求失败数据重新请求 + if let tokenOperation = self.tokenOperation, parameters.path != "/customer/register" { + + let requestOperation = BlockOperation { + let semaphore = DispatchSemaphore(value: 0) + _request(parameters: parameters) { (response: BRNetworkResponse) in + semaphore.signal() + completion?(response) + } + semaphore.wait() + } + ///设置依赖关系 + requestOperation.addDependency(tokenOperation) + + operationQueue.addOperation(requestOperation) + } + } + + + return + } + + do { + let tempData = try response.mapString() + brLog(message: parameters.parameters) + brLog(message: parameters.path) + + + DispatchQueue.global().async { + let response: BRNetworkResponse = _deserialize(data: tempData) + + DispatchQueue.main.async { + if response.code != BRNetworkCodeSucceed { + if parameters.isToast { + BRToast.show(text: response.msg) + } + } + completion?(response) + } + } + + } catch { + var res = BRNetworkResponse() + res.code = -1 + if parameters.isToast { + BRToast.show(text: "Error".localized) + } + completion?(res) + } + case .failure(let error): + brLog(message: error) + var res = BRNetworkResponse() + res.code = -1 + if parameters.isToast { + BRToast.show(text: "veloria_network".localized) + } + completion?(res) + break + } + + } + + ///解析数据 + static private func _deserialize(data: String) -> BRNetworkResponse { + var response: BRNetworkResponse? + + let decrypted = BRCryptorService.decrypt(data: data) + brLog(message: decrypted) +// let option: SmartDecodingOption = .key(.fromSnakeCase) + response = BRNetworkResponse.deserialize(from: decrypted) + response?.rawData = decrypted + + if let response = response { + return response + } else { + var response = BRNetworkResponse() + response.code = -1 + response.msg = "Error".localized + return response + } + } +} + +extension BRNetwork { + ///获取token + static func requestToken(completer: ((_ token: BRLoginToken?) -> Void)?) { + guard self.tokenOperation == nil else { + completer?(nil) + return + } + + self.tokenOperation = BlockOperation(block: { + let semaphore = DispatchSemaphore(value: 0) + let param = BRNetworkParameters(path: "/customer/register") + BRNetwork.request(parameters: param) { (response: BRNetworkResponse) in + if let token = response.data { + BRLoginManager.manager.setLoginToken(token: token) + } + do { semaphore.signal() } + self.tokenOperation = nil + completer?(response.data) + } + semaphore.wait() + }) + operationQueue.addOperation(self.tokenOperation!) + } + + +} + + +extension MoyaProvider { + + @discardableResult + func requestCustomJson(_ target: Target, callbackQueue: DispatchQueue? = nil, completion: Completion?) -> Cancellable { + return request(target, callbackQueue: callbackQueue) { (result) in + guard let completion = completion else {return} + completion(result) + } + } +} + +let CustomApiTimeoutClosure = {(endpoint: Endpoint, closure: MoyaProvider.RequestResultClosure) -> Void in + + if var urlRequest = try? endpoint.urlRequest() { + ///总是获取新数据 + urlRequest.cachePolicy = .reloadIgnoringCacheData + urlRequest.timeoutInterval = 30 + closure(.success(urlRequest)) + } else { + closure(.failure(MoyaError.requestMapping(endpoint.url))) + } + + #if DEBUG /// + //print(try? endpoint.urlRequest() ) + #endif +} diff --git a/BeeReel/Base/Network/Base/BRNetworkTarget.swift b/BeeReel/Base/Network/Base/BRNetworkTarget.swift new file mode 100644 index 0000000..fe48473 --- /dev/null +++ b/BeeReel/Base/Network/Base/BRNetworkTarget.swift @@ -0,0 +1,105 @@ +// +// BRNetworkTarget.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + + +import Moya +import SmartCodable + +struct BRNetworkData { + var parameters: BRNetworkParameters? + var completion: ((_ response: BRNetworkResponse) -> Void)? +} + +struct BRNetworkParameters { + var baseURL: URL? + var parameters: [String : Any]? + var method: Moya.Method = .post + var path: String + var isLoding: Bool = false + var isToast: Bool = true +} + +struct BRNetworkResponse: SmartCodable { + var code: Int? + var data: T? + var msg: String? + + ///原始数据 + @IgnoredKey + var rawData: Any? +} + +enum BRNetworkTarget { + case request(parameters: BRNetworkParameters) +} + +extension BRNetworkTarget: TargetType { + var baseURL: URL { + return .init(string: BRBaseURL)! + } + + var path: String { + switch self { + case .request(let parameters): + return BRURLPathPrefix + parameters.path + } + } + + var method: Moya.Method { + switch self { + case .request(let parameters): + return parameters.method + } + } + + var task: Moya.Task { + switch self { + case .request(let parameters): + let parameters = parameters.parameters ?? [:] + return .requestParameters(parameters: parameters, encoding: getEncoding()) + } + } + + var headers: [String : String]? { + let userToken = BRLoginManager.manager.token?.token ?? "" + let dic: [String : String] = [ + "system-version" : kBROsVersion, + "lang-key" : BRLocalizedManager.manager.currentLocalizedKey,//当前语言 + "time-zone" : self.timeZone(), //时区 + "app-version" : kBRAPPVersion, + "device-id" : JXUUID.uuid(), //设备id + "brand" : "apple", //品牌 + "app-name" : kBRAPPBundleIdentifier, + "system-type" : "ios", + "idfa" : JXUUID.idfa(), + "model" : UIDevice.br_machineModelName(), + "authorization" : userToken + ] + return dic + } + +} + +extension BRNetworkTarget { + var sampleData: Data { return "".data(using: String.Encoding.utf8)! } + + func getEncoding() -> ParameterEncoding { + switch self.method { + case .get, .delete: + return URLEncoding.default + default: + return JSONEncoding.default + } + } + + func timeZone() -> String { + let timeZone = NSTimeZone.local as NSTimeZone + let timeZoneSecondsFromGMT = timeZone.secondsFromGMT / 3600 + return String(format: "GMT+0%d:00", timeZoneSecondsFromGMT) + } + +} diff --git a/BeeReel/Base/Network/Base/BRURLPath.swift b/BeeReel/Base/Network/Base/BRURLPath.swift new file mode 100644 index 0000000..5e3b49a --- /dev/null +++ b/BeeReel/Base/Network/Base/BRURLPath.swift @@ -0,0 +1,39 @@ +// +// BRURLPath.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + + + +let BRBaseURL = "https://api-qjwl168.qjwl168.com" +let BRURLPathPrefix = "/velo" + +let BRWebBaseURL = "https://www.qjwl168.com" +let BRCampaignWebURL = "https://campaign.qjwl168.com" + + +///用户协议 +let kSBUserAgreementWebUrl = BRWebBaseURL + "/user_policy" +///隐私协议 +let kSBPrivacyPolicyWebUrl = BRWebBaseURL + "/private" +///儿童个人信息保护规则 +let kSBInformationProtectionWebUrl = BRWebBaseURL + "/information_protection" +///第三方共享清单 +let kSBInformationSharingWebUrl = BRWebBaseURL + "/information_sharing" +///收集个人信息明示清单 +let kSBPersoInforDisclosureWebUrl = BRWebBaseURL + "/persoInfor_disclosure" +///全国青少年互联网文明公约 +let kSBCivizatioConventionWebUrl = BRWebBaseURL + "/civizatio_convention" +///会员服务协议 +let kSBMemberShipAgreement = BRWebBaseURL + "/member_ship_agreement" + +///反馈首页 +let kSBFeedBackHomeWebUrl = BRCampaignWebURL + "/pages/leave/index" +///反馈列表 +let kSBFeedBackListWebUrl = BRCampaignWebURL + "/pages/leave/list" +///反馈详情 +let kSBFeedBackDetailWebUrl = BRCampaignWebURL + "/pages/leave/detail" +///活动页面 +let kSBRewardsWebUrl = BRCampaignWebURL + "/pages/reward/theme4" diff --git a/BeeReel/Base/View/BRCollectionView.swift b/BeeReel/Base/View/BRCollectionView.swift new file mode 100644 index 0000000..0e5ed56 --- /dev/null +++ b/BeeReel/Base/View/BRCollectionView.swift @@ -0,0 +1,22 @@ +// +// BRCollectionView.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRCollectionView: UICollectionView { + + override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { + super.init(frame: frame, collectionViewLayout: layout) + self.backgroundColor = .clear + self.contentInsetAdjustmentBehavior = .never + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} diff --git a/BeeReel/Base/View/BRCollectionViewCell.swift b/BeeReel/Base/View/BRCollectionViewCell.swift new file mode 100644 index 0000000..902056f --- /dev/null +++ b/BeeReel/Base/View/BRCollectionViewCell.swift @@ -0,0 +1,21 @@ +// +// BRCollectionViewCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRCollectionViewCell: UICollectionViewCell { + + override init(frame: CGRect) { + super.init(frame: frame) + self.layer.rasterizationScale = UIScreen.main.scale + self.layer.shouldRasterize = true + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } +} diff --git a/BeeReel/Base/View/BRImageView.swift b/BeeReel/Base/View/BRImageView.swift new file mode 100644 index 0000000..b6fb3d4 --- /dev/null +++ b/BeeReel/Base/View/BRImageView.swift @@ -0,0 +1,77 @@ +// +// BRImageView.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit + +class BRImageView: UIImageView { + + var placeholderColor = UIColor.black + + private lazy var placeholderImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "placeholder_image_01")) + imageView.isHidden = true + imageView.contentMode = .scaleAspectFit + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + _init() + } + + override init(image: UIImage?) { + super.init(image: image) + _init() + } + + override init(image: UIImage?, highlightedImage: UIImage?) { + super.init(image: image, highlightedImage: highlightedImage) + _init() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + func _init() { + self.contentMode = .scaleAspectFill + self.layer.masksToBounds = true + if image == nil { + self.backgroundColor = self.placeholderColor + placeholderImageView.isHidden = false + } + + addSubview(placeholderImageView) + } + + override var image: UIImage? { + didSet { + if self.backgroundColor == nil && image == nil { + self.backgroundColor = self.placeholderColor + } else if image != nil { + if self.backgroundColor == self.placeholderColor { + self.backgroundColor = nil + } + } + + if image == nil { + placeholderImageView.isHidden = false + } else { + placeholderImageView.isHidden = true + } + } + } + + + override func layoutSubviews() { + super.layoutSubviews() + + placeholderImageView.frame = .init(x: 0, y: 0, width: self.bounds.width * (2 / 3), height: self.bounds.height * (2 / 3)) + placeholderImageView.center = .init(x: self.bounds.width / 2, y: self.bounds.height / 2) + } +} diff --git a/BeeReel/Base/View/BRTableView.swift b/BeeReel/Base/View/BRTableView.swift new file mode 100644 index 0000000..0172b95 --- /dev/null +++ b/BeeReel/Base/View/BRTableView.swift @@ -0,0 +1,49 @@ +// +// BRTableView.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit + +class BRTableView: UITableView { + + var insetGroupedMargins: CGFloat = 15 + + override init(frame: CGRect, style: UITableView.Style) { + super.init(frame: frame, style: style) + separatorColor = .colorFFFFFF(alpha: 0.1) + separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) + self.backgroundColor = .clear + self.contentInsetAdjustmentBehavior = .never + + if style == .insetGrouped { + sectionFooterHeight = 12 + sectionHeaderHeight = 0.1 + } else if style == .plain { + if #available(iOS 15.0, *) { + sectionHeaderTopPadding = 0 + } + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + ///修改 insetGrouped 的边距 参考https://github.com/QMUI/QMUIDemo_iOS/blob/master/QMUI/QMUIKit/UIKitExtensions/UITableView%2BQMUI.m + override var layoutMargins: UIEdgeInsets { + set { + super.layoutMargins = newValue + } + get { + var margins = super.layoutMargins + if self.style == .insetGrouped { + margins.left = self.safeAreaInsets.left + insetGroupedMargins + margins.right = self.safeAreaInsets.right + insetGroupedMargins + } + return margins + } + } +} diff --git a/BeeReel/Base/View/BRTableViewCell.swift b/BeeReel/Base/View/BRTableViewCell.swift new file mode 100644 index 0000000..f4dc34f --- /dev/null +++ b/BeeReel/Base/View/BRTableViewCell.swift @@ -0,0 +1,49 @@ +// +// BRTableViewCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit + +class BRTableViewCell: UITableViewCell { + + private(set) lazy var br_indicatorImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "arrow_right_icon_02")) + return imageView + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + self.layer.rasterizationScale = UIScreen.main.scale + self.layer.shouldRasterize = true + self.selectionStyle = .none + self.backgroundColor = .clear + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} + + +extension UITableViewCell { + + var br_tableView: UITableView? { + return self.value(forKey: "_tableView") as? UITableView + } +} diff --git a/BeeReel/Base/View/TabBar/BRTabBar.swift b/BeeReel/Base/View/TabBar/BRTabBar.swift new file mode 100644 index 0000000..9e4b461 --- /dev/null +++ b/BeeReel/Base/View/TabBar/BRTabBar.swift @@ -0,0 +1,224 @@ +// +// BRTabBar.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRTabBar: UITabBar { + + var containers = [BRTabBarItemContainer]() + private let tagOffset = 1000 + + override func sizeThatFits(_ size: CGSize) -> CGSize { + var size = super.sizeThatFits(size) + size.height = UIScreen.customTabBarHeight + return size + } + + private lazy var topImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "tabbar_top_icon")) + return imageView + }() + + override var items: [UITabBarItem]? { + didSet { + reload() + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.backgroundColor = .color1C1C1C() + self.setRoundedCorner(topLeft: 30, topRight: 30, bottomLeft: 0, bottomRight: 0) + + addSubview(topImageView) + + topImageView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() +// updateLayout() + + } + + override func setItems(_ items: [UITabBarItem]?, animated: Bool) { + super.setItems(items, animated: animated) + self.reload() + } + + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + var b = super.point(inside: point, with: event) + if !b { + for container in containers { + let p = CGPoint.init(x: point.x - container.frame.origin.x, y: point.y - container.frame.origin.y) + if container.point(inside: p, with: event) { + b = true + } + } + } + return b + } +} + +extension BRTabBar { + + func updateLayout() { + subviews.forEach { + if let cls = NSClassFromString("UITabBarButton") { + if $0.isKind(of: cls) == true { + $0.isHidden = true + } + } + } + + var index = 0 + let width = self.width / CGFloat(containers.count) + let height = self.height + var x = 0.0 + containers.forEach { + if $0.contentView == (selectedItem as? BRTabBarItem)?.contentView { + index = $0.tag - tagOffset + } + + $0.frame = .init(x: x, y: 0, width: width, height: height) + x += width + + } + updateSelectedStatus(index: index, animated: false) + + } + + + ///更新选中状态 + private func updateSelectedStatus(index: Int, animated: Bool) { + self.bringSubviewToFront(self.topImageView) + + var selectedView: UIView? + containers.forEach { + if $0.tag == index + tagOffset { + selectedView = $0 + } + } + + if let view = selectedView { + self.topImageView.snp.remakeConstraints { make in + make.top.equalToSuperview() + make.centerX.equalTo(view) + } + } else { + self.topImageView.snp.removeConstraints() + } + + if animated { + UIView.animate(withDuration: 0.3) { + self.layoutIfNeeded() + } + } + + } + + +} + +extension BRTabBar { + + func removeAll() { + for container in containers { + container.removeFromSuperview() + } + containers.removeAll() + } + + func reload() { + removeAll() + + guard let items = self.items else { return } + + + items.enumerated().forEach { (index, item) in + let container = BRTabBarItemContainer(self, tag: index + tagOffset) + addSubview(container) + + if let item = item as? BRTabBarItem { + container.contentView = item.contentView + } + containers.append(container) + } + updateLayout() + + self.setNeedsLayout() + + } + + @objc func highlightAction(_ sender: AnyObject?) { + guard let container = sender as? BRTabBarItemContainer else { + return + } + let newIndex = max(0, container.tag - tagOffset) + guard newIndex < items?.count ?? 0, let item = self.items?[newIndex], item.isEnabled == true else { + return + } + + if let item = item as? BRTabBarItem { + item.contentView.highlight(animated: true, completion: nil) + } + } + + @objc func dehighlightAction(_ sender: AnyObject?) { + guard let container = sender as? BRTabBarItemContainer else { + return + } + let newIndex = max(0, container.tag - tagOffset) + guard newIndex < items?.count ?? 0, let item = self.items?[newIndex], item.isEnabled == true else { + return + } + + if let item = item as? BRTabBarItem { + item.contentView.dehighlight(animated: true, completion: nil) + } + } + + @objc func selectAction(_ sender: AnyObject?) { + guard let container = sender as? BRTabBarItemContainer else { + return + } + select(itemAtIndex: container.tag - tagOffset, animated: true) + } + + @objc func select(itemAtIndex idx: Int, animated: Bool) { + let newIndex = max(0, idx) + let currentIndex = (selectedItem != nil) ? (items?.firstIndex(of: selectedItem!) ?? -1) : -1 + guard newIndex < items?.count ?? 0, let item = self.items?[newIndex], item.isEnabled == true else { + return + } + + if currentIndex != newIndex { + if currentIndex != -1 && currentIndex < items?.count ?? 0{ + if let currentItem = items?[currentIndex] as? BRTabBarItem { + currentItem.contentView.deselect(animated: animated, completion: nil) + } + } + if let item = item as? BRTabBarItem { + item.contentView.select(animated: animated, completion: nil) + } + } else if currentIndex == newIndex { + if let item = item as? BRTabBarItem { + item.contentView.reselect(animated: animated, completion: nil) + } + } + updateSelectedStatus(index: newIndex, animated: animated) + + delegate?.tabBar?(self, didSelect: item) + } +} diff --git a/BeeReel/Base/View/TabBar/BRTabBarItem.swift b/BeeReel/Base/View/TabBar/BRTabBarItem.swift new file mode 100644 index 0000000..e3ef996 --- /dev/null +++ b/BeeReel/Base/View/TabBar/BRTabBarItem.swift @@ -0,0 +1,45 @@ +// +// BRTabBarItem.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/25. +// + +import UIKit + +class BRTabBarItem: UITabBarItem { + + private(set) var contentView: BRTabBarItemContentView + + + override var title: String? { + didSet { + contentView.title = title + } + } + override var image: UIImage? { + didSet { + contentView.image = image + } + } + + override var selectedImage: UIImage? { + didSet { + contentView.selectedImage = selectedImage + } + } + + public init(_ contentView: BRTabBarItemContentView = BRTabBarItemContentView(), title: String? = nil, image: UIImage? = nil, selectedImage: UIImage? = nil, tag: Int = 0) { + self.contentView = contentView + super.init() + + self.title = title + self.image = image + self.selectedImage = selectedImage + self.tag = tag + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/BeeReel/Base/View/TabBar/BRTabBarItemContainer.swift b/BeeReel/Base/View/TabBar/BRTabBarItemContainer.swift new file mode 100644 index 0000000..2b12493 --- /dev/null +++ b/BeeReel/Base/View/TabBar/BRTabBarItemContainer.swift @@ -0,0 +1,56 @@ +// +// BRTabBarItemContainer.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/25. +// + +import UIKit + +class BRTabBarItemContainer: UIControl { + + var contentView: BRTabBarItemContentView? { + didSet { + oldValue?.removeFromSuperview() + + if let contentView = contentView { + addSubview(contentView) + } + } + } + + internal init(_ target: AnyObject?, tag: Int) { + super.init(frame: CGRect.zero) + self.tag = tag + self.addTarget(target, action: #selector(BRTabBar.selectAction(_:)), for: .touchUpInside) + self.addTarget(target, action: #selector(BRTabBar.highlightAction(_:)), for: .touchDown) + self.addTarget(target, action: #selector(BRTabBar.highlightAction(_:)), for: .touchDragEnter) + self.addTarget(target, action: #selector(BRTabBar.dehighlightAction(_:)), for: .touchDragExit) + self.backgroundColor = .clear +// self.isAccessibilityElement = true + } + + internal required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + internal override func layoutSubviews() { + super.layoutSubviews() + if let contentView = contentView { + contentView.frame = self.bounds +// contentView.updateLayout() + } + } + + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + var b = super.point(inside: point, with: event) + if !b { + for subview in self.subviews { + if subview.point(inside: CGPoint.init(x: point.x - subview.frame.origin.x, y: point.y - subview.frame.origin.y), with: event) { + b = true + } + } + } + return b + } +} diff --git a/BeeReel/Base/View/TabBar/BRTabBarItemContentView.swift b/BeeReel/Base/View/TabBar/BRTabBarItemContentView.swift new file mode 100644 index 0000000..5f97343 --- /dev/null +++ b/BeeReel/Base/View/TabBar/BRTabBarItemContentView.swift @@ -0,0 +1,161 @@ +// +// BRTabBarItemContentView.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/25. +// + +import UIKit + +class BRTabBarItemContentView: UIView { + + /// 是否被选中 + open var selected = false + + /// 是否处于高亮状态 + open var highlighted = false + + /// 是否支持高亮 + open var highlightEnabled = true + + var title: String? { + didSet { +// selectedView.title = title + } + } + var image: UIImage? { + didSet { +// normalView.image = image + updateLayout() + } + } + + var selectedImage: UIImage? { + didSet { +// selectedView.image = selectedImage + updateLayout() + } + } + + private lazy var imageView: UIImageView = { + let imageView = UIImageView() + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.isUserInteractionEnabled = false + self.layer.masksToBounds = true + + addSubview(imageView) + + + imageView.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-(UIScreen.tabbarSafeBottomMargin + 2)) + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + open func updateDisplay() { + + } + + func updateLayout() { + imageView.image = selected ? selectedImage : image + + } +} + +extension BRTabBarItemContentView { + // MARK: - INTERNAL METHODS + internal final func select(animated: Bool, completion: (() -> ())?) { + selected = true + if highlightEnabled && highlighted { + highlighted = false + dehighlightAnimation(animated: animated, completion: { [weak self] in + self?.updateDisplay() + self?.selectAnimation(animated: animated, completion: completion) + }) + } else { + updateDisplay() + selectAnimation(animated: animated, completion: completion) + } + } + + internal final func deselect(animated: Bool, completion: (() -> ())?) { + selected = false + updateDisplay() + self.deselectAnimation(animated: animated, completion: completion) + } + + internal final func reselect(animated: Bool, completion: (() -> ())?) { + if selected == false { + select(animated: animated, completion: completion) + } else { + if highlightEnabled && highlighted { + highlighted = false + dehighlightAnimation(animated: animated, completion: { [weak self] in + self?.reselectAnimation(animated: animated, completion: completion) + }) + } else { + reselectAnimation(animated: animated, completion: completion) + } + } + } + + internal final func highlight(animated: Bool, completion: (() -> ())?) { + if !highlightEnabled { + return + } + if highlighted == true { + return + } + highlighted = true + self.highlightAnimation(animated: animated, completion: completion) + } + + internal final func dehighlight(animated: Bool, completion: (() -> ())?) { + if !highlightEnabled { + return + } + if !highlighted { + return + } + highlighted = false + self.dehighlightAnimation(animated: animated, completion: completion) + } + + internal func badgeChanged(animated: Bool, completion: (() -> ())?) { + self.badgeChangedAnimation(animated: animated, completion: completion) + } + + // MARK: - ANIMATION METHODS + func selectAnimation(animated: Bool, completion: (() -> ())?) { + self.imageView.image = self.selectedImage + + } + + func deselectAnimation(animated: Bool, completion: (() -> ())?) { + self.imageView.image = self.image + } + + func reselectAnimation(animated: Bool, completion: (() -> ())?) { + completion?() + } + + func highlightAnimation(animated: Bool, completion: (() -> ())?) { + completion?() + } + + func dehighlightAnimation(animated: Bool, completion: (() -> ())?) { + completion?() + } + + func badgeChangedAnimation(animated: Bool, completion: (() -> ())?) { + completion?() + } +} diff --git a/BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift b/BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift new file mode 100644 index 0000000..1548dca --- /dev/null +++ b/BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift @@ -0,0 +1,45 @@ +// +// BRHomeTop10ViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRHomeTop10ViewController: BRViewController { + + + private lazy var dataArr: [BRShortModel] = [] + + +// private lazy var collectionView: BRCollectionView = { +// let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: <#T##UICollectionViewLayout#>) +// }() + + override func viewDidLoad() { + super.viewDidLoad() + + requestDataArr() + } + + + + + +} + +extension BRHomeTop10ViewController { + + private func requestDataArr() { + + BRHomeAPI.requestTop10List { [weak self] list in + guard let self = self else { return } + guard let list = list else { return } + self.dataArr = list + } + + } + + +} diff --git a/BeeReel/Class/Home/Controller/BRHomeViewController.swift b/BeeReel/Class/Home/Controller/BRHomeViewController.swift new file mode 100644 index 0000000..0aa13c5 --- /dev/null +++ b/BeeReel/Class/Home/Controller/BRHomeViewController.swift @@ -0,0 +1,239 @@ +// +// BRHomeViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/25. +// + +import UIKit + +class BRHomeViewController: BRViewController { + + + private lazy var viewModel = BRHomeViewModel() + + + private lazy var spotlightVC: BRSpotlightViewViewController = { + let vc = BRSpotlightViewViewController() + vc.viewModel = self.viewModel + return vc + }() + + private lazy var vcArr: [BRViewController] = { + return [ + spotlightVC, + BRHomeTop10ViewController(), + BRViewController(), + BRViewController(), + BRViewController() + ] + }() + + private lazy var pageParam: WMZPageParam = { + let param = WMZPageParam() + param.wTitleArr = [ + "Spotlight".localized, + "Top 10".localized, + "Popular Picks".localized, + "New Releases".localized, + "Categories".localized + ] + param.wViewController = { [weak self] index in + return self?.vcArr[index] + } + param.wMenuHeadView = { [weak self] in + if let bannerArr = self?.viewModel.bannerArr, bannerArr.count > 0 { + return self?.headerView + } else { + return nil + } + } + //顶部可下拉 + param.wBounces = true + param.wMenuTitleColor = .colorFFFFFF() + param.wMenuTitleSelectColor = .colorFFFFFF() + param.wMenuTitleUIFont = .fontMedium(ofSize: 12) + param.wMenuTitleSelectUIFont = .fontMedium(ofSize: 12) + param.wMenuTitleRadios = 17 + param.wMenuHeight = 34 + param.wMenuTitleOffset = 10 + param.wMenuInsets = UIEdgeInsets(top: 40, left: 59, bottom: 0, right: 15) + param.wMenuBgColor = .clear + param.wBgColor = .clear + + + param.wTopSuspension = true + param.wCustomDataViewTopOffset = UIScreen.statusBarHeight + + param.wCustomMenuTitle = { [weak self] buttons in + buttons?.forEach({ button in + self?.setMenuTitle(button: button) + }) + } + + param.wCustomNaviBarY = { _ in + return 0 + } + param.wCustomTabbarY = { _ in + return UIScreen.customTabBarHeight + } + + + param.wEventChildVCDidSroll = { [weak self] (pageVC, oldPoint, newPonit, currentScrollView) in + guard let self = self else { return } + + let top = max(0, newPonit.y) + self.bgImageView.snp.updateConstraints { make in + make.top.equalToSuperview().offset(-top) + } + self.updateStatusBarStyle() + } + + return param + }() + + private lazy var pageView: WMZPageView = { + let view = WMZPageView(frame: self.view.bounds, autoFix: true, param: pageParam, parentReponder: self) + view.backgroundColor = .clear + view.downSc?.backgroundColor = .clear + return view + }() + + private lazy var bgImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "home_header_bg_image")) + imageView.isHidden = true + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 17) + label.textColor = .color1C1C1C() + label.text = "Browse Genres".localized + return label + }() + + private lazy var headerView: BRHomeHeaderView = { + let view = BRHomeHeaderView() + view.frame = .init(x: 0, y: 0, width: UIScreen.width, height: view.contentHeight) + return view + }() + + private lazy var menuLeftView: UIView = { + let view = UIView() + view.backgroundColor = self.view.backgroundColor + return view + }() + + private lazy var searchButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "search_button_01"), for: .normal) + return button + }() + + override func viewDidLoad() { + super.viewDidLoad() + self.edgesForExtendedLayout = [.top, .bottom] + self.statusBarStyle = .lightContent + self.navigationController?.isNavigationBarHidden = true + + br_setupUI() + + requestHomeData() + + setupPageView() + + updateStatusBarStyle() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(true, animated: true) + } + + + private func updateStatusBarStyle() { + let point = self.pageView.downSc?.contentOffset ?? .zero + + if point.y < 300, let bannerArr = self.viewModel.bannerArr, bannerArr.count > 0 { + self.statusBarStyle = .lightContent + } else { + self.statusBarStyle = .darkContent + } + } + + +} + +extension BRHomeViewController { + + private func br_setupUI() { + view.addSubview(bgImageView) + view.addSubview(pageView) + menuLeftView.addSubview(searchButton) + + bgImageView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(0) + make.left.right.equalToSuperview() + make.height.equalTo(UIScreen.statusBarHeight + 300) + } + + searchButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.centerY.equalToSuperview() + } + } + + ///自定义菜单样式 + private func setMenuTitle(button: UIButton) { + button.setBackgroundImage(UIImage(named: "menu_bg_image_01"), for: .selected) + button.setBackgroundImage(UIImage(color: .colorD3D3D3()), for: .normal) + button.layer.masksToBounds = true + } + + private func setupPageView() { + + self.pageView.upSc.addSubview(titleLabel) + self.pageView.upSc.addSubview(menuLeftView) + +// self.pageView.upSc.sendSubviewToBack(menuBgView) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview().offset(10) + } + + menuLeftView.snp.makeConstraints { make in + make.left.equalToSuperview() + make.top.equalToSuperview().offset(pageParam.wMenuInsets.top) + make.height.equalTo(34) + make.width.equalTo(59) + } + } + +} + +extension BRHomeViewController { + + private func requestHomeData() { + + BRHomeAPI.requestHomeData { [weak self] list in + guard let self = self else { return } + self.viewModel.homeOldDataArr = list ?? [] + + self.headerView.bannerArr = self.viewModel.bannerArr + if let bannerArr = self.viewModel.bannerArr, bannerArr.count > 0 { + self.bgImageView.isHidden = false + self.pageView.updateHeadView() + } else { + self.bgImageView.isHidden = true + } + self.spotlightVC.reloadData() + self.updateStatusBarStyle() + } + + } + +} + + diff --git a/BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift b/BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift new file mode 100644 index 0000000..4ef9fa4 --- /dev/null +++ b/BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift @@ -0,0 +1,71 @@ +// +// BRSpotlightViewViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit + +class BRSpotlightViewViewController: BRViewController, WMZPageProtocol { + + var viewModel: BRHomeViewModel? + + private lazy var tableView: BRTableView = { + let tableView = BRTableView(frame: .zero, style: .plain) + tableView.delegate = self + tableView.dataSource = self + tableView.register(BRSpotlightMainBaseCell.self, forCellReuseIdentifier: "cell") + tableView.register(BRSpotlightHotMainCell.self, forCellReuseIdentifier: BRHomeModuleItem.ModuleKey.v3_recommand.rawValue) + tableView.register(BRSpotlightTopMainCell.self, forCellReuseIdentifier: BRHomeModuleItem.ModuleKey.week_ranking.rawValue) + tableView.register(BRSpotlightNewMainCell.self, forCellReuseIdentifier: BRHomeModuleItem.ModuleKey.new_recommand.rawValue) + tableView.register(BRSpotlightRecommandMainCell.self, forCellReuseIdentifier: BRHomeModuleItem.ModuleKey.cagetory_recommand.rawValue) + return tableView + }() + + override func viewDidLoad() { + super.viewDidLoad() + + br_setupUI() + } + + + func reloadData() { + tableView.reloadData() + } + + func getMyScrollView() -> UIScrollView { + return tableView + } +} + +extension BRSpotlightViewViewController { + + private func br_setupUI() { + view.addSubview(tableView) + + tableView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(15) + } + } + + +} + +//MARK: -------------- UITableViewDelegate UITableViewDataSource -------------- +extension BRSpotlightViewViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let moduleItem = self.viewModel?.spotlightDataArr[indexPath.row] + let cell = tableView.dequeueReusableCell(withIdentifier: moduleItem?.module_key?.rawValue ?? "cell", for: indexPath) as! BRSpotlightMainBaseCell + cell.moduleItem = moduleItem + return cell + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return self.viewModel?.spotlightDataArr.count ?? 0 + } + + +} diff --git a/BeeReel/Class/Home/Model/BRHomeModuleItem.swift b/BeeReel/Class/Home/Model/BRHomeModuleItem.swift new file mode 100644 index 0000000..6fa8010 --- /dev/null +++ b/BeeReel/Class/Home/Model/BRHomeModuleItem.swift @@ -0,0 +1,67 @@ +// +// BRHomeModuleItem.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/26. +// + +import UIKit +import SmartCodable + +class BRHomeModuleItem: BRModel, SmartCodable { + + enum ModuleKey: String, SmartCaseDefaultable { + case banner = "home_banner" + case v3_recommand = "home_v3_recommand" + ///分类推荐 + case cagetory_recommand = "home_cagetory_recommand" + case week_ranking = "week_ranking" + ///跑马灯 + case marquee = "marquee" + + case new_recommand = "new_recommand" + } + + + var module_key: ModuleKey? + var title: String? + var list: [BRShortModel]? +// var categoryList: [VPCategoryModel]? + + @SmartAny + var data: Any? + + @IgnoredKey + var iconImage: UIImage? + + @IgnoredKey + var br_cellHeight: CGFloat? + + + + func didFinishMapping() { + if let data = data as? [[String : Any]] { +// if module_key == .category_navigation { +// self.categoryList = [VPCategoryModel].deserialize(from: data) +// } else { +// } + self.list = [BRShortModel].deserialize(from: data) + } else if let data = data as? [String : Any] { + var dataList: [[String : Any]]? + if let list = data["list"] as? [[String : Any]] { + self.title = data["title"] as? String + dataList = list + + } else if let list = data["shortPlayList"] as? [[String : Any]] { + self.title = data["category_name"] as? String + dataList = list + } + + if let dataList = dataList { + self.list = [BRShortModel].deserialize(from: dataList) + } + + } + } + +} diff --git a/BeeReel/Class/Home/Model/BRPagerViewTransformer.swift b/BeeReel/Class/Home/Model/BRPagerViewTransformer.swift new file mode 100644 index 0000000..2c111fa --- /dev/null +++ b/BeeReel/Class/Home/Model/BRPagerViewTransformer.swift @@ -0,0 +1,61 @@ +// +// BRPagerViewTransformer.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit +import FSPagerView + +class BRPagerViewTransformer: FSPagerViewTransformer { + + + override func applyTransform(to attributes: FSPagerViewLayoutAttributes) { + guard let pagerView = self.pagerView else { + return + } + + let position = attributes.position + let scrollDirection = pagerView.scrollDirection + let itemSpacing = (scrollDirection == .horizontal ? attributes.bounds.width : attributes.bounds.height) + self.proposedInteritemSpacing() + + if self.type == .ferrisWheel { + guard scrollDirection == .horizontal else { + // This type doesn't support vertical mode + return + } + // http://ronnqvi.st/translate-rotate-translate/ + var zIndex = 0 + var transform = CGAffineTransform.identity + switch position { + case -5 ... 5: + let itemSpacing = attributes.bounds.width+self.proposedInteritemSpacing() + let count: CGFloat = 40 + let circle: CGFloat = .pi * 2.0 + let radius = itemSpacing * count / circle + let ty = radius * (self.type == .ferrisWheel ? 1 : -1) + let theta = circle / count + let rotation = position * theta * (self.type == .ferrisWheel ? 1 : -1) + transform = transform.translatedBy(x: -position*itemSpacing, y: ty) + transform = transform.rotated(by: rotation) + transform = transform.translatedBy(x: 0, y: -ty) + zIndex = Int((4.0-abs(position)*10)) + default: + break + } +// attributes.alpha = abs(position) < 0.5 ? 1 : self.minimumAlpha + + attributes.transform = transform + attributes.zIndex = zIndex + + + } else { + super.applyTransform(to: attributes) + } + } + + override func proposedInteritemSpacing() -> CGFloat { + return pagerView?.interitemSpacing ?? 0 + } +} diff --git a/BeeReel/Class/Home/Model/BRShortModel.swift b/BeeReel/Class/Home/Model/BRShortModel.swift new file mode 100644 index 0000000..57a3f5f --- /dev/null +++ b/BeeReel/Class/Home/Model/BRShortModel.swift @@ -0,0 +1,82 @@ +// +// BRShortModel.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/26. +// + +import UIKit +import SmartCodable + +class BRShortModel: BRModel, SmartCodable { + + enum VideoRevolution: String, SmartCaseDefaultable { + case r_540 = "540" + case r_720 = "720" + case r_1080 = "1080" + + var needLogin: Bool { + if self == .r_720 { + return true + } else { + return false + } + } + + var needVip: Bool { + if self == .r_1080 { + return true + } else { + return false + } + } + + var toString: String { + return "\(self.rawValue)P" + } + } + + enum TagType: String, SmartCaseDefaultable { + case hot = "hot" + case new = "new" + } + + var id: String? + var all_coins: String? + var buy_type: String? + var collect_total: Int? + var vp_description: String? + var episode_total: Int? + var horizontally_img: String? + var image_url: String? + var is_collect: Bool? + var name: String? + var process: String? + var search_click_total: String? + var short_id: String? + var short_play_id: String? + var short_play_video_id: String? + var tag_type: TagType? + var video_info: BRVideoInfoModel? + var category: [String]? + ///观看数 + var watch_total: Int? + var current_episode: String? + var video_url: String? + var updated_at: String? + + var revolution: VideoRevolution? + + @IgnoredKey + var titleAttributedString: NSAttributedString? + @IgnoredKey + var vp_isSelected: Bool? + + + static func mappingForKey() -> [SmartKeyTransformer]? { + return [ + CodingKeys.vp_description <--- ["description", "short_video_description"], + CodingKeys.name <--- ["short_video_title", "name"] + ] + } +} diff --git a/BeeReel/Class/Home/Model/BRVideoInfoModel.swift b/BeeReel/Class/Home/Model/BRVideoInfoModel.swift new file mode 100644 index 0000000..9667fdd --- /dev/null +++ b/BeeReel/Class/Home/Model/BRVideoInfoModel.swift @@ -0,0 +1,29 @@ +// +// BRVideoInfoModel.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/26. +// + +import UIKit +import SmartCodable + +class BRVideoInfoModel: BRModel, SmartCodable { + + var coins: Int? + var vip_coins: Int? + var episode: String? + var id: String? + var image_url: String? + ///1:会员,2: 非会员 + var is_vip: Int? + ///是否锁定,购买后解锁 + var is_lock: Bool? + var promise_view_ad: Int? + var short_id: String? + var short_play_id: String? + var short_play_video_id: String? + var video_url: String? + ///播放进度,毫秒 + var play_seconds: Int? +} diff --git a/BeeReel/Class/Home/View/BRHomeHeaderBannerCell.swift b/BeeReel/Class/Home/View/BRHomeHeaderBannerCell.swift new file mode 100644 index 0000000..7443ef5 --- /dev/null +++ b/BeeReel/Class/Home/View/BRHomeHeaderBannerCell.swift @@ -0,0 +1,126 @@ +// +// BRHomeHeaderBannerCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit + +class BRHomeHeaderBannerCell: BRCollectionViewCell { + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + titleLabel.text = model?.name + categoryLabel.text = model?.category?.first + } + } + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + return imageView + }() + + private lazy var holeLayer: CAShapeLayer = { + let maskLayer = CAShapeLayer() + maskLayer.fillRule = .evenOdd + return maskLayer + }() + + private lazy var playImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "play_icon_01")) + return imageView + }() + + private lazy var bottomView: UIView = { + let view = UIView() + view.br_addEffectView() + return view + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontBold(ofSize: 14) + label.textColor = .colorFFFFFF() + label.layer.shadowColor = UIColor.color000000(alpha: 0.25).cgColor + label.layer.shadowOpacity = 1 + label.layer.shadowRadius = 1 + label.layer.shadowOffset = .init(width: 0, height: 1) + return label + }() + + private lazy var categoryLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 10) + label.textColor = .colorF1FF94() + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + contentView.layer.cornerRadius = 16 + contentView.layer.masksToBounds = true + contentView.layer.mask = self.holeLayer + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + override func layoutSubviews() { + super.layoutSubviews() + + let holeCenter = CGPoint(x: 21, y: 21) + let holeRadius: CGFloat = 11 + + let holePath = UIBezierPath(arcCenter: holeCenter, radius: holeRadius, startAngle: 0, endAngle: CGFloat.pi * 2, clockwise: true) + + let path = UIBezierPath(rect: self.bounds) + path.append(holePath) + path.usesEvenOddFillRule = true + + holeLayer.path = path.cgPath + } + +} + +extension BRHomeHeaderBannerCell { + + private func br_setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(playImageView) + contentView.addSubview(bottomView) + bottomView.addSubview(titleLabel) + bottomView.addSubview(categoryLabel) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + playImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + bottomView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(50) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(8) + make.top.equalToSuperview().offset(6) + make.right.lessThanOrEqualToSuperview().offset(-8) + } + + categoryLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(8) + make.bottom.equalToSuperview().offset(-11) + make.right.lessThanOrEqualToSuperview().offset(-8) + } + } + +} diff --git a/BeeReel/Class/Home/View/BRHomeHeaderView.swift b/BeeReel/Class/Home/View/BRHomeHeaderView.swift new file mode 100644 index 0000000..147bf97 --- /dev/null +++ b/BeeReel/Class/Home/View/BRHomeHeaderView.swift @@ -0,0 +1,86 @@ +// +// BRHomeHeaderView.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/25. +// + +import UIKit + +class BRHomeHeaderView: UIView { + + var bannerArr: [BRShortModel]? { + didSet { + bannerParam.wData = bannerArr ?? [] + bannerView.updateUI() + } + } + + var contentHeight: CGFloat = UIScreen.statusBarHeight + 107 + 280 + + private lazy var bgIconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "home_header_icon_01")) + return imageView + }() + + private lazy var bannerParam: WMZBannerParam = { + let param = WMZBannerParam() + param.wFrame = .init(x: 0, y: UIScreen.statusBarHeight + 107, width: UIScreen.width, height: 280) + param.wItemSize = .init(width: 180, height: 230) + param.wMyCell = { [weak self] (indexPath, collectionView, model, bgImageView, dataArr) in + let cell = collectionView?.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath ?? .init(row: 0, section: 0)) as? BRHomeHeaderBannerCell + cell?.model = model as? BRShortModel + return cell + } + param.wEventClick = { [weak self] (anyId, index) in + guard let self = self else { return } + guard let model = anyId as? BRShortModel else { return } + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + param.wSectionInset = .init(top: 0, left: 27, bottom: 0, right: 27) + param.wCardOverLapCount = 4 + param.wLineSpacing = 40 + param.wCardOverLap = true + param.wEffect = false + param.wAutoScroll = false + ///开启无限循环 + param.wRepeat = true + param.wHideBannerControl = true + param.wCanFingerSliding = false + + return param + }() + + private lazy var bannerView: WMZBannerView = { + let view = WMZBannerView(configureWithModel: bannerParam) + view.register(BRHomeHeaderBannerCell.self, forCellWithReuseIdentifier: "cell") + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + br_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRHomeHeaderView { + + private func br_setupUI() { + addSubview(bannerView) + addSubview(bgIconImageView) + + bgIconImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(0) + make.top.equalToSuperview().offset(UIScreen.statusBarHeight) + } + } + +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightHotCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightHotCell.swift new file mode 100644 index 0000000..a01bf68 --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightHotCell.swift @@ -0,0 +1,163 @@ +// +// BRSpotlightHotCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRSpotlightHotCell: BRCollectionViewCell { + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + titleLabel.text = model?.name + categoryLabel.text = model?.category?.first + + favoriteButton.isSelected = self.model?.is_collect ?? false + + hotView.setNeedsUpdateConfiguration() + } + } + + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 12) + label.textColor = .color1C1C1C() + return label + }() + + private lazy var playIconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "play_icon_02")) + return imageView + }() + + private lazy var categoryLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 10) + label.textColor = .color899D00() + return label + }() + + private lazy var hotView: UIButton = { + var config = UIButton.Configuration.plain() + config.image = UIImage(named: "hot_icon_02") + config.imagePlacement = .leading + config.imagePadding = 2 + config.contentInsets = .init(top: 0, leading: 0, bottom: 0, trailing: 0) + + let button = UIButton(configuration: config) + button.isUserInteractionEnabled = false + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + let count = model?.watch_total ?? 0 + var string = "\(count)" + if count > 100 { + string = String(format: "%.1fk", Float(count) / 1000) + } + button.configuration?.attributedTitle = AttributedString.br_createAttributedString(string: string, color: .colorFF7489(), font: .fontRegular(ofSize: 10)) + + } + return button + }() + + private lazy var favoriteButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "favorite_icon_01"), for: .normal) + button.setImage(UIImage(named: "favorite_icon_01_selected"), for: .selected) + button.setImage(UIImage(named: "favorite_icon_01_selected"), for: [.selected, .highlighted]) + button.addTarget(self, action: #selector(handleFavoriteButton), for: .touchUpInside) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + NotificationCenter.default.addObserver(self, selector: #selector(updateShortFavoriteStateNotification), name: BRVideoAPI.updateShortFavoriteStateNotification, object: nil) + + contentView.backgroundColor = .colorFFFFFF() + contentView.layer.cornerRadius = 10 + contentView.layer.masksToBounds = true + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + @objc private func handleFavoriteButton() { + guard let shortPlayId = self.model?.short_play_id else { return } + + let isFavorite = !(self.model?.is_collect ?? false) + let videoId = self.model?.short_play_video_id + + BRVideoAPI.requestFavorite(isFavorite: isFavorite, shortPlayId: shortPlayId, videoId: videoId) { + + } + } + + @objc private func updateShortFavoriteStateNotification(sender: Notification) { + guard let userInfo = sender.userInfo else { return } + guard let shortPlayId = userInfo["id"] as? String else { return } + guard let state = userInfo["state"] as? Bool else { return } + guard shortPlayId == self.model?.short_play_id else { return } + + self.model?.is_collect = state; + + favoriteButton.isSelected = self.model?.is_collect ?? false + } + +} + +extension BRSpotlightHotCell { + + private func br_setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(favoriteButton) + contentView.addSubview(titleLabel) + contentView.addSubview(playIconImageView) + contentView.addSubview(categoryLabel) + contentView.addSubview(hotView) + + coverImageView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + make.height.equalTo(160) + } + + favoriteButton.snp.makeConstraints { make in + make.top.equalToSuperview().offset(4) + make.right.equalToSuperview().offset(-4) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(7) + make.right.lessThanOrEqualToSuperview().offset(-7) + make.top.equalTo(coverImageView.snp.bottom).offset(5) + } + + playIconImageView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-4) + make.bottom.equalToSuperview().offset(-5) + } + + categoryLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(7) + make.top.equalTo(coverImageView.snp.bottom).offset(26) + } + + hotView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(7) + make.bottom.equalToSuperview().offset(-8) + } + + } + +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightHotMainCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightHotMainCell.swift new file mode 100644 index 0000000..169e82e --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightHotMainCell.swift @@ -0,0 +1,105 @@ +// +// BRSpotlightHotMainCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit + +class BRSpotlightHotMainCell: BRSpotlightMainBaseCell { + + + override var moduleItem: BRHomeModuleItem? { + didSet { + + UIView.performWithoutAnimation { [weak self] in + self?.collectionView.reloadData() + } + + self.collectionView.performBatchUpdates(nil) { [weak self] _ in + guard let self = self else { return } + let height = moduleItem?.br_cellHeight ?? 0 + let contentHeight = self.collectionView.contentSize.height + if height != contentHeight { + self.collectionView.snp.updateConstraints { make in + make.height.equalTo(contentHeight + 1) + } + moduleItem?.br_cellHeight = contentHeight + + self.br_tableView?.reloadData() + } + + + } + + } + } + + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let width = floor((UIScreen.width - 30 - 10) / 2) + + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: width, height: 222) + layout.minimumInteritemSpacing = 10 + layout.minimumLineSpacing = 10 + layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15) + return layout + }() + + private lazy var collectionView: BRCollectionView = { + let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.isScrollEnabled = false + collectionView.register(BRSpotlightHotCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRSpotlightHotMainCell { + private func br_setupUI() { + containerView.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + make.height.equalTo(1) + } + } + +} + +//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource -------------- +extension BRSpotlightHotMainCell: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRSpotlightHotCell + cell.model = self.moduleItem?.list?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.moduleItem?.list?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.moduleItem?.list?[indexPath.row] + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightMainBaseCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightMainBaseCell.swift new file mode 100644 index 0000000..9b21ea6 --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightMainBaseCell.swift @@ -0,0 +1,77 @@ +// +// BRSpotlightMainBaseCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/27. +// + +import UIKit + +class BRSpotlightMainBaseCell: BRTableViewCell { + + var moduleItem: BRHomeModuleItem? { + didSet { + titleStackView.br_removeAllArrangedSubview() + + if let icon = moduleItem?.iconImage { + iconImageView.image = icon + titleStackView.addArrangedSubview(iconImageView) + } + titleLabel.text = moduleItem?.title + titleStackView.addArrangedSubview(titleLabel) + + + + } + } + + + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 15) + label.textColor = .color1C1C1C() + return label + }() + + private lazy var iconImageView: UIImageView = { + let imageView = UIImageView() + return imageView + }() + + private lazy var titleStackView: UIStackView = { + let view = UIStackView() + view.axis = .horizontal + view.spacing = 4 + return view + }() + + private(set) lazy var containerView: UIView = { + let view = UIView() + return view + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + contentView.addSubview(titleStackView) + contentView.addSubview(containerView) + + titleStackView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview() + make.height.equalTo(20) + } + + containerView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalTo(titleStackView.snp.bottom).offset(10) + make.bottom.equalToSuperview().offset(-30) + } + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightNewCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightNewCell.swift new file mode 100644 index 0000000..023edac --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightNewCell.swift @@ -0,0 +1,107 @@ +// +// BRSpotlightNewCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRSpotlightNewCell: BRCollectionViewCell { + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + titleLabel.text = model?.name + categoryLabel.text = model?.category?.first + } + } + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + return imageView + }() + + private lazy var bottomView: UIView = { + let view = UIView() + view.br_addEffectView(style: .light) + return view + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontBold(ofSize: 12) + label.textColor = .colorFFFFFF() + label.layer.shadowColor = UIColor.color000000(alpha: 0.25).cgColor + label.layer.shadowOpacity = 1 + label.layer.shadowRadius = 1 + label.layer.shadowOffset = .init(width: 0, height: 1) + return label + }() + + private lazy var categoryLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 10) + label.textColor = .colorF1FF94() + return label + }() + + private lazy var playImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "play_icon_04")) + imageView.setContentHuggingPriority(.required, for: .horizontal) + imageView.setContentCompressionResistancePriority(.required, for: .horizontal) + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRSpotlightNewCell { + + private func br_setupUI() { + contentView.layer.cornerRadius = 10 + contentView.layer.masksToBounds = true + + contentView.addSubview(coverImageView) + contentView.addSubview(bottomView) + bottomView.addSubview(titleLabel) + bottomView.addSubview(playImageView) + bottomView.addSubview(categoryLabel) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + bottomView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(52) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(8) + make.top.equalToSuperview().offset(5) + make.right.lessThanOrEqualToSuperview().offset(-8) + } + + playImageView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-4) + make.bottom.equalToSuperview().offset(-5) + } + + categoryLabel.snp.makeConstraints { make in + make.centerY.equalTo(playImageView) + make.left.equalToSuperview().offset(8) + make.right.lessThanOrEqualTo(playImageView.snp.left).offset(-5) + } + } + +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightNewMainCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightNewMainCell.swift new file mode 100644 index 0000000..7f66f12 --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightNewMainCell.swift @@ -0,0 +1,96 @@ +// +// BRSpotlightNewMainCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRSpotlightNewMainCell: BRSpotlightMainBaseCell { + + override var moduleItem: BRHomeModuleItem? { + didSet { + + UIView.performWithoutAnimation { [weak self] in + self?.collectionView.reloadData() + } + + self.collectionView.performBatchUpdates(nil) { [weak self] _ in + guard let self = self else { return } + let height = moduleItem?.br_cellHeight ?? 0 + let contentHeight = self.collectionView.contentSize.height + if height != contentHeight { + self.collectionView.snp.updateConstraints { make in + make.height.equalTo(contentHeight + 1) + } + moduleItem?.br_cellHeight = contentHeight + + self.br_tableView?.reloadData() + } + + + } + + } + } + + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let width = floor((UIScreen.width - 30 - 10) / 2) + + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: width, height: 222) + layout.minimumLineSpacing = 10 + layout.minimumInteritemSpacing = 10 + layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15) + return layout + }() + + private lazy var collectionView: BRCollectionView = { + let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.register(BRSpotlightNewCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + containerView.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + make.height.equalTo(1) + } + + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRSpotlightNewMainCell: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRSpotlightNewCell + cell.model = self.moduleItem?.list?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return moduleItem?.list?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.moduleItem?.list?[indexPath.row] + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandCell.swift new file mode 100644 index 0000000..01fdfe5 --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandCell.swift @@ -0,0 +1,79 @@ +// +// BRSpotlightRecommandCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit +import FSPagerView + +class BRSpotlightRecommandCell: FSPagerViewCell { + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + } + } + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.contentView.layer.shadowOpacity = 0 + + br_setupUI() + + applyDiagonalMask() + } + + @MainActor required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + } + + + private func applyDiagonalMask() { + let maskLayer = CAShapeLayer() + let path = UIBezierPath() + let width = 150.0 + let height = 193.0 + let cut: CGFloat = 16 // 控制斜切角度 + let radius: CGFloat = 10 // 圆角半径 + + + path.move(to: CGPoint(x: 0, y: radius)) + path.addQuadCurve(to: CGPoint(x: radius, y: 0), controlPoint: CGPoint(x: 0, y: 0)) + + // 右上角 + path.addLine(to: CGPoint(x: width - radius, y: 0)) + path.addQuadCurve(to: CGPoint(x: width, y: radius), controlPoint: CGPoint(x: width, y: 0)) + // 右下角 + path.addLine(to: CGPoint(x: width - cut, y: height - radius)) + path.addQuadCurve(to: CGPoint(x: width - cut - radius, y: height), controlPoint: CGPoint(x: width - cut, y: height)) + // 左下角 + path.addLine(to: CGPoint(x: cut + radius, y: height)) + path.addQuadCurve(to: CGPoint(x: cut, y: height - radius), controlPoint: CGPoint(x: cut, y: height)) + path.close() + + maskLayer.path = path.cgPath + coverImageView.layer.mask = maskLayer + } +} + +extension BRSpotlightRecommandCell { + + private func br_setupUI() { + contentView.addSubview(coverImageView) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandMainCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandMainCell.swift new file mode 100644 index 0000000..9bbcb63 --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightRecommandMainCell.swift @@ -0,0 +1,79 @@ +// +// BRSpotlightRecommandMainCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit +import FSPagerView + +class BRSpotlightRecommandMainCell: BRSpotlightMainBaseCell { + + override var moduleItem: BRHomeModuleItem? { + didSet { + bannerView.reloadData() + } + } + + + private lazy var bannerView: FSPagerView = { + let transformer = BRPagerViewTransformer(type: .ferrisWheel) + transformer.minimumAlpha = 1 + + let view = FSPagerView() + view.transformer = transformer + view.decelerationDistance = FSPagerView.automaticDistance + view.interitemSpacing = 0 + view.itemSize = .init(width: 150, height: 193) + view.isInfinite = true + view.delegate = self + view.dataSource = self + view.register(BRSpotlightRecommandCell.self, forCellWithReuseIdentifier: "cell") + + return view + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + containerView.addSubview(bannerView) + + bannerView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalToSuperview().offset(-20) + make.height.equalTo(193 + 40) + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + +} + +//MARK: -------------- FSPagerViewDataSource FSPagerViewDelegate -------------- +extension BRSpotlightRecommandMainCell: FSPagerViewDataSource, FSPagerViewDelegate { + + func numberOfItems(in pagerView: FSPagerView) -> Int { + return moduleItem?.list?.count ?? 0 + } + + func pagerView(_ pagerView: FSPagerView, cellForItemAt index: Int) -> FSPagerViewCell { + let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) as! BRSpotlightRecommandCell + cell.model = moduleItem?.list?[index] + return cell + } + + func pagerView(_ pagerView: FSPagerView, didSelectItemAt index: Int) { + let model = self.moduleItem?.list?[index] + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + + +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift new file mode 100644 index 0000000..73cebe4 --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift @@ -0,0 +1,144 @@ +// +// BRSpotlightTopCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRSpotlightTopCell: BRCollectionViewCell { + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + + titleLabel.text = model?.name + categoryLabel.text = model?.category?.first + + hotView.setNeedsUpdateConfiguration() + } + } + + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + return imageView + }() + + private lazy var coverMarkView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "cover_mark_icon_01")) + return imageView + }() + + private lazy var playImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "play_icon_03")) + return imageView + }() + + private lazy var textBgView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "text_bg_image_01")) + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 12) + label.textColor = .color1C1C1C() + label.numberOfLines = 2 + return label + }() + + private lazy var categoryLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 10) + label.textColor = .color899D00() + return label + }() + + private lazy var hotView: UIButton = { + var config = UIButton.Configuration.plain() + config.image = UIImage(named: "hot_icon_02") + config.imagePlacement = .leading + config.imagePadding = 2 + config.contentInsets = .init(top: 0, leading: 0, bottom: 0, trailing: 0) + + let button = UIButton(configuration: config) + button.isUserInteractionEnabled = false + button.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + let count = model?.watch_total ?? 0 + var string = "\(count)" + if count > 100 { + string = String(format: "%.1fk", Float(count) / 1000) + } + button.configuration?.attributedTitle = AttributedString.br_createAttributedString(string: string, color: .colorFF7489(), font: .fontRegular(ofSize: 10)) + + } + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRSpotlightTopCell { + + private func br_setupUI() { + contentView.layer.cornerRadius = 11 + contentView.layer.masksToBounds = true + + + contentView.addSubview(coverImageView) + coverImageView.addSubview(coverMarkView) + contentView.addSubview(playImageView) + coverImageView.addSubview(textBgView) + textBgView.addSubview(titleLabel) + textBgView.addSubview(categoryLabel) + textBgView.addSubview(hotView) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverMarkView.snp.makeConstraints { make in + make.right.bottom.equalToSuperview() + } + + playImageView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(0) + make.bottom.equalToSuperview().offset(0) + } + + textBgView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(10) + make.right.equalToSuperview().offset(-10) + make.bottom.equalToSuperview().offset(-10) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(8) + make.top.equalToSuperview().offset(7) + make.right.lessThanOrEqualToSuperview().offset(-8) + } + + categoryLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(8) + make.top.equalTo(titleLabel.snp.bottom).offset(5) + } + + hotView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(8) + make.bottom.equalToSuperview().offset(-10) + } + } + +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift new file mode 100644 index 0000000..37b081a --- /dev/null +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift @@ -0,0 +1,81 @@ +// +// BRSpotlightTopMainCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRSpotlightTopMainCell: BRSpotlightMainBaseCell { + + + override var moduleItem: BRHomeModuleItem? { + didSet { + collectionView.reloadData() + } + } + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15) + layout.itemSize = .init(width: 210, height: 260) + layout.minimumLineSpacing = 10 + return layout + }() + + private lazy var collectionView: BRCollectionView = { + let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsHorizontalScrollIndicator = false + collectionView.register(BRSpotlightTopCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension BRSpotlightTopMainCell { + + private func br_setupUI() { + containerView.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + make.height.equalTo(260) + } + } + +} + +//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource -------------- +extension BRSpotlightTopMainCell: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRSpotlightTopCell + cell.model = self.moduleItem?.list?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.moduleItem?.list?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.moduleItem?.list?[indexPath.row] + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } +} diff --git a/BeeReel/Class/Home/ViewModel/BRHomeViewModel.swift b/BeeReel/Class/Home/ViewModel/BRHomeViewModel.swift new file mode 100644 index 0000000..ca2d301 --- /dev/null +++ b/BeeReel/Class/Home/ViewModel/BRHomeViewModel.swift @@ -0,0 +1,67 @@ +// +// BRHomeViewModel.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/26. +// + +import UIKit + +class BRHomeViewModel { + + var homeOldDataArr: [BRHomeModuleItem] = [] { + didSet { + spotlightDataArr.removeAll() + + //v3数据 + var item1: BRHomeModuleItem? + //排行 + var item2: BRHomeModuleItem? + //新品 + var item3: BRHomeModuleItem? + + ///其余分类数据 + var item4List: [BRHomeModuleItem] = [] + + homeOldDataArr.forEach { + if $0.module_key == .banner { + bannerArr = $0.list + } else if $0.module_key == .v3_recommand { + $0.iconImage = UIImage(named: "hot_icon_01") + item1 = $0 + } else if $0.module_key == .week_ranking { + $0.iconImage = UIImage(named: "top_icon_01") + $0.title = "Top Charts".localized + item2 = $0 + } else if $0.module_key == .new_recommand { + $0.title = "Fresh Stories".localized + item3 = $0 + } else if $0.module_key == .cagetory_recommand { + item4List.append($0) + } + + } + + if let item = item1 { + spotlightDataArr.append(item) + } + + if let item = item2 { + spotlightDataArr.append(item) + } + + if let item = item3 { + spotlightDataArr.append(item) + } + + spotlightDataArr += item4List + + } + } + + var bannerArr: [BRShortModel]? + + var spotlightDataArr: [BRHomeModuleItem] = [] + + +} diff --git a/BeeReel/Class/Player/Controller/BRPlayerListViewController.swift b/BeeReel/Class/Player/Controller/BRPlayerListViewController.swift new file mode 100644 index 0000000..6d5d456 --- /dev/null +++ b/BeeReel/Class/Player/Controller/BRPlayerListViewController.swift @@ -0,0 +1,156 @@ +// +// BRPlayerListViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + + +@objc protocol BRPlayerListViewControllerDelegate { + + ///加载新数据 + @objc optional func br_playerViewControllerLoadNewDataV2(playerViewController: BRPlayerListViewController) + + ///将要加载更多数据 + @objc optional func br_playerViewControllerShouldLoadMoreData(playerViewController: BRPlayerListViewController) -> Bool + ///加载更多数据 + @objc optional func br_playerViewControllerLoadMoreData(playerViewController: BRPlayerListViewController) + ///向上加载更多数据 + @objc optional func br_playerViewControllerLoadUpMoreData(playerViewController: BRPlayerListViewController) + + ///当前展示的发生变化 + @objc optional func br_playerListViewController(_ viewController: BRPlayerListViewController, didChangeIndexPathForVisible indexPath: IndexPath) + +} + +@objc protocol BRPlayerListViewControllerDataSource { + + + func br_playerListViewController(_ viewController: BRPlayerListViewController, _ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath, oldCell: UICollectionViewCell) -> UICollectionViewCell + + func br_playerListViewController(_ viewController: BRPlayerListViewController, _ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int + +} + +class BRPlayerListViewController: BRViewController { + + var contentSize: CGSize { + return CGSize(width: UIScreen.width, height: UIScreen.height - UIScreen.customTabBarHeight) + } + + var CellClass: BRPlayerListCell.Type { + return BRPlayerListCell.self + } + + private(set) lazy var viewModel = BRPlayerViewModel() + + weak var delegate: BRPlayerListViewControllerDelegate? + weak var dataSource: BRPlayerListViewControllerDataSource? + + + private lazy var collectionViewLayout: UICollectionViewLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = contentSize + layout.minimumInteritemSpacing = 0 + layout.minimumLineSpacing = 0 + return layout + }() + + private(set) lazy var collectionView: BRCollectionView = { + let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.isPagingEnabled = true + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + collectionView.bounces = false + collectionView.scrollsToTop = false + collectionView.register(CellClass.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override func viewDidLoad() { + super.viewDidLoad() + + br_setupUI() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + } + + func play() { + if self.isDidAppear { + self.viewModel.currentPlayer?.start() + } + + self.viewModel.isPlaying = true + +// if getDataCount() - viewModel.currentIndexPath.row <= 2 { +// self.loadMoreData() +// } + } + +} + +extension BRPlayerListViewController { + private func br_setupUI() { + view.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.top.equalToSuperview() + make.left.equalToSuperview() + make.width.equalTo(self.contentSize.width) + make.height.equalTo(self.contentSize.height) + } + } + +} + +//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource -------------- +extension BRPlayerListViewController: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + var cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) + if let newCell = self.dataSource?.br_playerListViewController(self, collectionView, cellForItemAt: indexPath, oldCell: cell) { + cell = newCell + } + if let cell = cell as? BRPlayerListCell { + if cell.viewModel == nil { + cell.viewModel = viewModel + } + } + + + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + if let count = self.dataSource?.br_playerListViewController(self, collectionView, numberOfItemsInSection: section) { + return count + } else { + return 0 + } + } +} + + +extension BRPlayerListViewController { + + private func loadMoreData() { + let isLoad = self.delegate?.br_playerViewControllerShouldLoadMoreData?(playerViewController: self) + if isLoad != false { + self.delegate?.br_playerViewControllerLoadMoreData?(playerViewController: self) + } + } + + private func loadUpMoreData() { + self.delegate?.br_playerViewControllerLoadUpMoreData?(playerViewController: self) + } + + private func didChangeIndexPathForVisible() { + self.delegate?.br_playerListViewController?(self, didChangeIndexPathForVisible: viewModel.currentIndexPath) + } +} diff --git a/BeeReel/Class/Player/Controller/BRVideoDetailViewController.swift b/BeeReel/Class/Player/Controller/BRVideoDetailViewController.swift new file mode 100644 index 0000000..dc1c04e --- /dev/null +++ b/BeeReel/Class/Player/Controller/BRVideoDetailViewController.swift @@ -0,0 +1,75 @@ +// +// BRVideoDetailViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRVideoDetailViewController: BRPlayerListViewController { + + + var shortPlayId: String? + var activityId: String? + + private var detailModel: BRVideoDetailModel? + + override func viewDidLoad() { + super.viewDidLoad() + + + self.requestDetailData() + } + + + + +} + + +extension BRVideoDetailViewController { + + private func requestDetailData(indexPath: IndexPath? = nil) { + guard let shortPlayId = shortPlayId else { return } + + + + + BRHUD.show(containerView: self.view) + BRVideoAPI.requestVideoDetail(shortPlayId: shortPlayId, activityId: activityId) { [weak self] model in + BRHUD.dismiss() + + guard let self = self else { return } + guard let model = model else { return } + self.detailModel = model +// self.videoNameLabel.text = model.shortPlayInfo?.name + + /* + self.reloadData { [weak self] in + guard let self = self else { return } + + if let indexPath = indexPath { + self.scrollToItem(indexPath: indexPath, animated: false) + + } else if let videoInfo = self.detailModel?.video_info { + var row: Int? + self.detailModel?.episodeList?.enumerated().forEach({ + if $1.id == videoInfo.id { + row = $0 + } + }) + if let row = row { + self.scrollToItem(indexPath: .init(row: row, section: 0), animated: false) + } else { + self.scrollToItem(indexPath: .init(row: 0, section: 0), animated: false) + } + } else { + self.scrollToItem(indexPath: .init(row: 0, section: 0), animated: false) + } + } + */ + } + } + +} diff --git a/BeeReel/Class/Player/Model/BRPlayerProtocol.swift b/BeeReel/Class/Player/Model/BRPlayerProtocol.swift new file mode 100644 index 0000000..54ba3b7 --- /dev/null +++ b/BeeReel/Class/Player/Model/BRPlayerProtocol.swift @@ -0,0 +1,42 @@ +// +// BRPlayerProtocol.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +@objc protocol BRPlayerProtocol: NSObjectProtocol { + + + var videoInfo: BRVideoInfoModel? { get set } + + var isCurrent: Bool { get set } + + ///上一集是否加锁 + @objc optional var hasLastEpisodeUnlocked: Bool { get set } + + ///总进度 + var duration: Int { get } + ///当前进度 + var currentPosition: Int { get } + + var rate: Float { get set } + + ///播放准备 + func prepare() + + ///开始播放 + func start() + + ///暂停播放 + func pause() + + ///从头播放 + func replay() + + ///设置进度 + func seekToTime(toTime: Int) + +} diff --git a/BeeReel/Class/Player/Model/BRVideoDetailModel.swift b/BeeReel/Class/Player/Model/BRVideoDetailModel.swift new file mode 100644 index 0000000..eff4b5a --- /dev/null +++ b/BeeReel/Class/Player/Model/BRVideoDetailModel.swift @@ -0,0 +1,24 @@ +// +// BRVideoDetailModel.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit +import SmartCodable + +class BRVideoDetailModel: BRModel, SmartCodable { + + var business_model: String? + var video_info: BRVideoInfoModel? + var shortPlayInfo: BRShortModel? + var episodeList: [BRVideoInfoModel]? + var is_collect: Bool? + var show_share_coin: Int? + var share_coin: Int? + var install_coins: Int? + var revolution: Int? + var unlock_video_ad_count: Int? + var discount: Int? +} diff --git a/BeeReel/Class/Player/View/BRPlayerListCell.swift b/BeeReel/Class/Player/View/BRPlayerListCell.swift new file mode 100644 index 0000000..667d694 --- /dev/null +++ b/BeeReel/Class/Player/View/BRPlayerListCell.swift @@ -0,0 +1,87 @@ +// +// BRPlayerListCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRPlayerListCell: BRCollectionViewCell, BRPlayerProtocol { + + + var viewModel: BRPlayerViewModel? { + didSet { + + } + } + + var videoInfo: BRVideoInfoModel? { + didSet { + player.setPlayUrl(url: videoInfo?.video_url ?? "") + } + } + + var isCurrent: Bool = false + + var duration: Int = 0 + + var currentPosition: Int = 0 + + var rate: Float = 1 + + func prepare() { + + } + + func start() { + + } + + func pause() { + + } + + func replay() { + + } + + func seekToTime(toTime: Int) { + + } + + + private lazy var player: BRPlayer = { + let player = BRPlayer() + player.playerView = self.playerView + return player + }() + + private lazy var playerView: UIView = { + let view = UIView() + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRPlayerListCell { + + private func br_setupUI() { + contentView.addSubview(playerView) + + playerView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + +} diff --git a/BeeReel/Class/Player/ViewModel/BRPlayerViewModel.swift b/BeeReel/Class/Player/ViewModel/BRPlayerViewModel.swift new file mode 100644 index 0000000..04d063b --- /dev/null +++ b/BeeReel/Class/Player/ViewModel/BRPlayerViewModel.swift @@ -0,0 +1,26 @@ +// +// BRPlayerViewModel.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRPlayerViewModel: NSObject { + + + @objc dynamic var isPlaying: Bool = true + + var currentIndexPath = IndexPath(row: 0, section: 0) + + var currentPlayer: BRPlayerProtocol? { + didSet { + oldValue?.isCurrent = false + oldValue?.pause() + + self.currentPlayer?.isCurrent = true +// self.currentPlayer?.rate = rateModel.rate.getRate() + } + } +} diff --git a/BeeReel/Class/Player/ViewModel/BRVideoRevolutionManager.swift b/BeeReel/Class/Player/ViewModel/BRVideoRevolutionManager.swift new file mode 100644 index 0000000..00fa547 --- /dev/null +++ b/BeeReel/Class/Player/ViewModel/BRVideoRevolutionManager.swift @@ -0,0 +1,72 @@ +// +// BRVideoRevolutionManager.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + + +class BRVideoRevolutionManager: NSObject { + + static let manager = BRVideoRevolutionManager() + + ///当前分辨率 + lazy var revolution: BRShortModel.VideoRevolution = { + let userInfo = BRLoginManager.manager.userInfo + + if let revolution = UserDefaults.standard.object(forKey: kBRVideoRevolutionDefaultsKey) as? String { + var revolution = verify(revolution: BRShortModel.VideoRevolution.init(rawValue: revolution) ?? .r_540) + return revolution + } + return .r_540 + }() + + override init() { + super.init() + NotificationCenter.default.addObserver(self, selector: #selector(userInfoUpdateNotification), name: BRLoginManager.userInfoUpdateNotification, object: nil) + } + + @objc private func userInfoUpdateNotification() { + self.setVideoRevolution(revolution: self.revolution) + } + + func setVideoRevolution(revolution: BRShortModel.VideoRevolution) { + let newRevolution = verify(revolution: revolution) + + if newRevolution != self.revolution { + self.revolution = newRevolution + NotificationCenter.default.post(name: BRVideoRevolutionManager.didChangeRevolutionNotification, object: nil) + UserDefaults.standard.set(newRevolution.rawValue, forKey: kBRVideoRevolutionDefaultsKey) + } + } + +} + +extension BRVideoRevolutionManager { + + ///校验分辨率是否可用,并返回可用分辨率 + func verify(revolution: BRShortModel.VideoRevolution) -> BRShortModel.VideoRevolution { + let userInfo = BRLoginManager.manager.userInfo + var newRevolution = revolution + if userInfo?.is_vip != true { + if newRevolution == .r_1080 { + newRevolution = .r_720 + } + if userInfo?.is_tourist != false, revolution != .r_540 { + newRevolution = .r_540 + } + } + return newRevolution + } + +} + + +extension BRVideoRevolutionManager { + + ///分辨率发生变化 + @objc static let didChangeRevolutionNotification = NSNotification.Name(rawValue: "VPVideoRevolutionManager.didChangeRevolutionNotification") +} + diff --git a/BeeReel/Delegate/AppDelegate+BRConfig.swift b/BeeReel/Delegate/AppDelegate+BRConfig.swift new file mode 100644 index 0000000..e4c9c80 --- /dev/null +++ b/BeeReel/Delegate/AppDelegate+BRConfig.swift @@ -0,0 +1,14 @@ +// +// AppDelegate+BRConfig.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/25. +// + +extension AppDelegate { + + func addConfig() { + UIView.vp_Awake() + } + +} diff --git a/BeeReel/Delegate/AppDelegate.swift b/BeeReel/Delegate/AppDelegate.swift new file mode 100644 index 0000000..88ea2aa --- /dev/null +++ b/BeeReel/Delegate/AppDelegate.swift @@ -0,0 +1,41 @@ +// +// AppDelegate.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + BRAppTool.appDelegate = self + + BRLoginManager.manager.updateUserInfo(completer: nil) + + addConfig() + + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/BeeReel/Delegate/SceneDelegate.swift b/BeeReel/Delegate/SceneDelegate.swift new file mode 100644 index 0000000..90f9d94 --- /dev/null +++ b/BeeReel/Delegate/SceneDelegate.swift @@ -0,0 +1,56 @@ +// +// SceneDelegate.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + guard let windowScene = (scene as? UIWindowScene) else { return } + BRAppTool.sceneDelegate = self + BRAppTool.windowScene = windowScene + + window = UIWindow(windowScene: windowScene) + + window?.rootViewController = BRTabBarController() + window?.makeKeyAndVisible() + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/BeeReel/Lib/AppTool/BRAppTool.swift b/BeeReel/Lib/AppTool/BRAppTool.swift new file mode 100644 index 0000000..ea9025c --- /dev/null +++ b/BeeReel/Lib/AppTool/BRAppTool.swift @@ -0,0 +1,55 @@ +// +// BRAppTool.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit + +class BRAppTool { + + static var appDelegate: AppDelegate? + static var sceneDelegate: SceneDelegate? + + static var windowScene: UIWindowScene? + + + static var keyWindow: UIWindow? { + return windowScene?.keyWindow + } + + static var rootViewController: UIViewController? { + return keyWindow?.rootViewController + } + + ///获得启动图 + static var lanuchViewController: UIViewController? { + let storyboard = UIStoryboard(name: "LaunchScreen", bundle: nil) + let vc = storyboard.instantiateInitialViewController() + return vc + } + + static var topViewController: UIViewController? { + var resultVC: UIViewController? = self.rootViewController + if let rootNav = resultVC as? UINavigationController { + resultVC = rootNav.topViewController + } + + resultVC = self._topViewController(resultVC) + while resultVC?.presentedViewController != nil { + resultVC = self._topViewController(resultVC?.presentedViewController) + } + return resultVC + } + + private static func _topViewController(_ vc: UIViewController?) -> UIViewController? { + if vc is UINavigationController { + return _topViewController((vc as? UINavigationController)?.topViewController) + } else if vc is UITabBarController { + return _topViewController((vc as? UITabBarController)?.selectedViewController) + } else { + return vc + } + } +} diff --git a/BeeReel/Lib/HUD/BRHUD.swift b/BeeReel/Lib/HUD/BRHUD.swift new file mode 100644 index 0000000..282d058 --- /dev/null +++ b/BeeReel/Lib/HUD/BRHUD.swift @@ -0,0 +1,21 @@ +// +// BRHUD.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import SVProgressHUD + +struct BRHUD { + + static func show(containerView: UIView? = nil, type: SVProgressHUDMaskType = .clear) { + SVProgressHUD.setContainerView(containerView) + SVProgressHUD.setDefaultMaskType(type) + SVProgressHUD.show() + } + + static func dismiss() { + SVProgressHUD.dismiss() + } +} diff --git a/BeeReel/Lib/HUD/BRToast.swift b/BeeReel/Lib/HUD/BRToast.swift new file mode 100644 index 0000000..45c1cd8 --- /dev/null +++ b/BeeReel/Lib/HUD/BRToast.swift @@ -0,0 +1,22 @@ +// +// BRToast.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import Toast + +struct BRToast { + + static func config() { + CSToastManager.setTapToDismissEnabled(false) + CSToastManager.setDefaultDuration(2) + CSToastManager.setDefaultPosition(CSToastPositionCenter) + } + + static func show(text: String?) { + guard let text = text else { return } + BRAppTool.keyWindow?.makeToast(text) + } +} diff --git a/BeeReel/Lib/LocalizedManager/BRLocalizedManager.swift b/BeeReel/Lib/LocalizedManager/BRLocalizedManager.swift new file mode 100644 index 0000000..52810c8 --- /dev/null +++ b/BeeReel/Lib/LocalizedManager/BRLocalizedManager.swift @@ -0,0 +1,122 @@ +// +// BRLocalizedManager.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import Foundation + +class BRLocalizedManager { + + static let manager = BRLocalizedManager() + + private let LocalizedUserDefaultsKey = "BRLocalizedManager.LocalizedUserDefaultsKey" + private let LocalizedDataUserDefaultsKey = "BRLocalizedManager.LocalizedDataUserDefaultsKey" + private let LocalizedDataLocalizedKeyUserDefaultsKey = "BRLocalizedManager.LocalizedDataLocalizedKeyUserDefaultsKey" + + + ///多语言数据 + private(set) lazy var localizedData: [String : String]? = UserDefaults.standard.object(forKey: LocalizedDataUserDefaultsKey) as? [String : String] + { + didSet { + UserDefaults.standard.set(localizedData, forKey: LocalizedDataUserDefaultsKey) + UserDefaults.standard.synchronize() + } + } + ///当前语言数据对应的key + private(set) lazy var localizedDataLocalizedKey: String? = UserDefaults.standard.object(forKey: LocalizedDataLocalizedKeyUserDefaultsKey) as? String + { + didSet { + UserDefaults.standard.set(localizedDataLocalizedKey, forKey: LocalizedDataLocalizedKeyUserDefaultsKey) + UserDefaults.standard.synchronize() + } + } + + // 获取当前语言代码(如果用户未手动设置,则返回系统语言) + var currentLocalizedKey: String { + get { + return "en" +// var key = UserDefaults.standard.string(forKey: LocalizedUserDefaultsKey) ?? Locale.preferredLanguages.first +// +// if key?.contains("zh-Hans") == true { +// key = "zh" +// } else if key?.contains("zh-Hant") == true { +// key = "zh_hk" +// } else { +// let arr = key?.components(separatedBy: "-") +// key = arr?.first +// } +// return key ?? "en" + } + set { + UserDefaults.standard.set(newValue, forKey: LocalizedUserDefaultsKey) + UserDefaults.standard.synchronize() + } + } + + var mjLocalizedKey: String { + let key = currentLocalizedKey + if key == "zh" { + return "zh-Hans" + } else if key == "zh_hk" { + return "zh-Hant" + } + return key + } + + // 判断是否跟随系统 + var isFollowingSystem: Bool { + return UserDefaults.standard.string(forKey: LocalizedUserDefaultsKey) == nil + } + + // 还原为系统默认语言 + func resetToSystemLanguage() { + UserDefaults.standard.removeObject(forKey: LocalizedUserDefaultsKey) + UserDefaults.standard.synchronize() + } + + // 获取本地化字符串 + func localizedString(forKey key: String, tableName: String? = nil) -> String { + if let localizedData = localizedData, + let text = localizedData[key] { + return text + + } else if let selectedLanguage = UserDefaults.standard.string(forKey: LocalizedUserDefaultsKey), + let bundlePath = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj"), + let bundle = Bundle(path: bundlePath) { + + return bundle.localizedString(forKey: key, value: nil, table: tableName) + } else { + return NSLocalizedString(key, tableName: tableName, bundle: .main, value: "", comment: "") + } + } + +} + +extension BRLocalizedManager { + + static let localizedDidChangeNotification = Notification.Name(rawValue: "BRLocalizedManager.localizedDidChangeNotification") + +} + +extension String { + var localized: String { + var text = BRLocalizedManager.manager.localizedString(forKey: self) + text = text.replacingOccurrences(of: "
", with: "\n") + return text + } + + func localizedReplace(text: String) -> String { + return self.localized.replacingOccurrences(of: "##", with: text) + } + + func localizedReplace(text1: String, text2: String, text3: String? = nil) -> String { + var string = self.localized.replacingOccurrences(of: "#1#", with: text1) + string = string.replacingOccurrences(of: "#2#", with: text2) + if let text = text3 { + string = string.replacingOccurrences(of: "#3#", with: text) + } + return string + } +} diff --git a/BeeReel/Lib/Login/BRLoginManager.swift b/BeeReel/Lib/Login/BRLoginManager.swift new file mode 100644 index 0000000..e7963a2 --- /dev/null +++ b/BeeReel/Lib/Login/BRLoginManager.swift @@ -0,0 +1,127 @@ +// +// BRLoginManager.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit +import SmartCodable + +class BRLoginManager { + + enum LoginType: String, SmartCaseDefaultable { + case apple = "Apple" + case faceBook = "Facebook" + case google = "Google" + case tiktok = "Tiktok" + } + + + static let manager = BRLoginManager() + + private(set) var token = UserDefaults.br_object(forKey: kBRLoginTokenDefaultsKey, as: BRLoginToken.self) + private(set) var userInfo = UserDefaults.br_object(forKey: kBRLoginUserInfoDefaultsKey, as: BRUserInfo.self) + + ///是否正在刷新token + private(set) var isRefreshingToken = false + + + + func setLoginToken(token: BRLoginToken?) { + self.token = token + UserDefaults.br_setObject(token, forKey: kBRLoginTokenDefaultsKey) + } + + func openLogin(finishHandle: (() -> Void)? = nil) { +// let view = VPLoginContentView() +// view.loginFinishBlock = finishHandle +// view.present(in: nil) + } + + func login(type: LoginType, presentingViewController: UIViewController?, completer: ((_ isFinish: Bool) -> Void)?) { + +// switch type { +// case .apple: +// appleSignLogin { [weak self] model in +// self?.requestThirdLogin(thirdSignModel: model, completer: completer) +// } +// +// case .faceBook: +// facebookLogin(presentingViewController: presentingViewController) { [weak self] model in +// self?.requestThirdLogin(thirdSignModel: model, completer: completer) +// } +// default: +// completer?(false) +// } + + } + + ///退出登录 + func logout(completer: ((_ isFinish: Bool) -> Void)?) { +// VPStatAPI.requestLeaveApp() +// VPUserAPI.requestLogout { [weak self] token in +// guard let self = self else { return } +// if let token = token { +// self.setLoginToken(token: token) +// self.userInfo?.is_tourist = true +// self.updateUserInfo(completer: nil) +// VPStatAPI.requestStatOnLine() +// VPStatAPI.requestEnterApp() +// completer?(true) +// NotificationCenter.default.post(name: VPLoginManager.userInfoUpdateNotification, object: nil) +// NotificationCenter.default.post(name: VPLoginManager.loginStateDidChangeNotification, object: nil) +// } else { +// completer?(false) +// } +// } + } + + ///删除账号 + func deleteAccount(completer: ((_ isFinish: Bool) -> Void)?) { +// VPStatAPI.requestLeaveApp() +// VPUserAPI.requestDelete { [weak self] isFinish in +// guard let self = self else { return } +// if isFinish { +// self.setLoginToken(token: nil) +// self.userInfo?.is_tourist = true +// self.updateUserInfo(completer: nil) +// VPStatAPI.requestStatOnLine() +// VPStatAPI.requestEnterApp() +// completer?(true) +// NotificationCenter.default.post(name: VPLoginManager.userInfoUpdateNotification, object: nil) +// NotificationCenter.default.post(name: VPLoginManager.loginStateDidChangeNotification, object: nil) +// } else { +// completer?(false) +// } +// } + } + + + ///更新用户信息 + func updateUserInfo(completer: (() -> Void)?) { + + BRUserAPI.requestUserInfo { [weak self] userInfo in + guard let self = self else { return } + if let userInfo = userInfo { + self.userInfo = userInfo + UserDefaults.br_setObject(userInfo, forKey: kBRLoginUserInfoDefaultsKey) + NotificationCenter.default.post(name: BRLoginManager.userInfoUpdateNotification, object: nil) + } + completer?() + } + + } + + + +} + +extension BRLoginManager { + + ///登录状态发生变化 + @objc static let loginStateDidChangeNotification = NSNotification.Name(rawValue: "BRLoginManager.loginStateDidChangeNotification") + ///用户信息更新 + @objc static let userInfoUpdateNotification = NSNotification.Name(rawValue: "BRLoginManager.userInfoUpdateNotification") + +} diff --git a/BeeReel/Lib/Login/BRLoginToken.swift b/BeeReel/Lib/Login/BRLoginToken.swift new file mode 100644 index 0000000..15537a9 --- /dev/null +++ b/BeeReel/Lib/Login/BRLoginToken.swift @@ -0,0 +1,43 @@ +// +// BRLoginToken.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit +import SmartCodable + +class BRLoginToken: BRModel, SmartCodable, NSSecureCoding { + + var token: String? + var customer_id: String? + var auto_login: Int? + + required init() { } + + static var supportsSecureCoding: Bool { + get { + return true + } + } + + + func encode(with coder: NSCoder) { + coder.encode(token, forKey: "token") + coder.encode(customer_id, forKey: "customer_id") + coder.encode(auto_login, forKey: "auto_login") + } + + required init?(coder: NSCoder) { + super.init() + + token = coder.decodeObject(of: NSString.self, forKey: "token") as? String + customer_id = coder.decodeObject(of: NSString.self, forKey: "customer_id") as? String + auto_login = coder.decodeObject(of: NSNumber.self, forKey: "auto_login")?.intValue + } + + + + +} diff --git a/BeeReel/Lib/Player/BRPlayer.swift b/BeeReel/Lib/Player/BRPlayer.swift new file mode 100644 index 0000000..5349a4b --- /dev/null +++ b/BeeReel/Lib/Player/BRPlayer.swift @@ -0,0 +1,90 @@ +// +// BRPlayer.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit +import SJBaseVideoPlayer + + +class BRPlayer { + + private lazy var player: SJBaseVideoPlayer = { + let player = SJBaseVideoPlayer() + player.autoplayWhenSetNewAsset = false + return player + }() + + var playerView: UIView? { + didSet { + playerView?.addSubview(player.view) + player.view.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + } + + var duration: TimeInterval { + return self.player.duration + } + + var currentTime: TimeInterval { + return self.player.currentTime + } + + init() { + setupPlayer() + } + + func setPlayUrl(url: String) { + self.stop() + guard let url = URL(string: url) else { return } + let asset = SJVideoPlayerURLAsset(url: url) + self.player.urlAsset = asset + } + + func start() { + self.player.play() + } + + func pause() { + self.player.pause() + } + + func stop() { + self.player.stop() + } + + func seek(toTime: Int) { + + } +} + +extension BRPlayer { + + private func setupPlayer() { + //播放完成回调 + self.player.playbackObserver.playbackDidFinishExeBlock = { [weak self] player in + guard let self = self else { return } + + } + //播放状态改变 + self.player.playbackObserver.playbackStatusDidChangeExeBlock = { [weak self] player in + guard let self = self else { return } + + } + //播放时长改变 + self.player.playbackObserver.durationDidChangeExeBlock = { [weak self] player in + guard let self = self else { return } + + } + //播放进度改变 + self.player.playbackObserver.currentTimeDidChangeExeBlock = { [weak self] player in + guard let self = self else { return } + + } + } + +} diff --git a/BeeReel/Lib/User/BRUserInfo.swift b/BeeReel/Lib/User/BRUserInfo.swift new file mode 100644 index 0000000..b938733 --- /dev/null +++ b/BeeReel/Lib/User/BRUserInfo.swift @@ -0,0 +1,72 @@ +// +// BRUserInfo.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/24. +// + +import UIKit +import SmartCodable + +class BRUserInfo: BRModel, SmartCodable, NSSecureCoding { + + var id: String? + var customer_id: String? + var is_guide_vip: String? + ///是否为游客登录 + var is_tourist: Bool? + var family_name: String? + var giving_name: String? + var vip_end_time: TimeInterval? + var third_access_id: String? + var is_vip: Bool? + var coin_left_total: Int? + var send_coin_left_total: Int? + var vip_type: String? + var email: String? + var third_access_platform: String? + var ip_address: String? + var country_code: String? + var user_level: String? + var avator: String? + var sign_in_status: String? + var registered_days: String? + var ln: String? + var country: String? + + + var totalCoin: Int { + return (coin_left_total ?? 0) + (send_coin_left_total ?? 0) + } + + required init() { } + + static var supportsSecureCoding: Bool { + get { + return true + } + } + + + func encode(with coder: NSCoder) { + coder.encode(id, forKey: "id") + coder.encode(customer_id, forKey: "customer_id") + coder.encode(is_tourist, forKey: "is_tourist") + coder.encode(is_vip, forKey: "is_vip") + coder.encode(avator, forKey: "avator") + coder.encode(family_name, forKey: "family_name") + coder.encode(giving_name, forKey: "giving_name") + } + + required init?(coder: NSCoder) { + super.init() + id = coder.decodeObject(of: NSString.self, forKey: "id") as? String + customer_id = coder.decodeObject(of: NSString.self, forKey: "customer_id") as? String + is_tourist = coder.decodeObject(of: NSNumber.self, forKey: "is_tourist")?.boolValue + is_vip = coder.decodeObject(of: NSNumber.self, forKey: "is_vip")?.boolValue + avator = coder.decodeObject(of: NSString.self, forKey: "avator") as? String + family_name = coder.decodeObject(of: NSString.self, forKey: "family_name") as? String + giving_name = coder.decodeObject(of: NSString.self, forKey: "giving_name") as? String + } + +} diff --git a/BeeReel/Sources/Assets.xcassets/AccentColor.colorset/Contents.json b/BeeReel/Sources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json b/BeeReel/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/Contents.json b/BeeReel/Sources/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Contents.json new file mode 100644 index 0000000..9ef6fb7 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Exclude@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Exclude@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Exclude@2x.png b/BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Exclude@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9d0079e5ed16f3e4022742264138e8cf74b17801 GIT binary patch literal 937 zcmeAS@N?(olHy`uVBq!ia0vp^6+oQ9!3HF)Hko(=Db50q$YKTtF;x&|^bAt@02E{_ z4sv&5Sa(k5C6L3C?&#~tz_78O`%fY(0|T?2r;B4q1>@Vh7jtg~h#dQvyu8w5mez(w zW5<^)7PB`v-dIr5q$X@4UBdE$C9(Mer(Tfs3GRKi=4L{!0*xC#KD_*W@`~US+`pd3 z+-K-=?Ra5g`8;Z)z=qE)jSEwGdfu)%eBeTjxlq%SJ2n?pf6Wx;$)4C&Z+URRoa)MJ z%;u3DbAI2x>@2kJ8B4R~xxLPsOvOzPQ{tC)NE;XkJWngHda?H2aaF07dF9r#K4<=| z^D|(ueZQPv09Hxt>amLlXh+0u->igmL zmr0DJx))bY;GD`{_Re3+=KHL`!z{;FPLMQZ>9gaW8R(oapJQg=aW!p0qs4s(YUW=T zsQVx*!`z&lP{6~}*Lcv-z=DnK_<;u!5;PVJmAYYhe7{Nd=`D{q?fhGGW`@XEc(>^M zj4ga%9M^JbTH(>g+VB$-Dnf29eOqB^oxR9&cWq_xLl*rYMdL>|`VVb9#97CAc{Ycn z;QcMP#V32|eViB1F{^NGM{?z!efws#tmmJX5XW(AR>q?3w+;3_tQVcrT&b85y($0n zj)RVkb7$Xuxllc&r9NZ(db#lTntNSdSBA%5>6q8j({b!q_QmO6tG#_U%qtJJHkMH+IjcI(_Jz#UAA) u?(?}!Q={%2yY+DTy^{7nnJTJ(nD@VazNX;FyGmfrV(@hJb6Mw<&;$UR9isjK literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Exclude@3x.png b/BeeReel/Sources/Assets.xcassets/icon/cover_mark_icon_01.imageset/Exclude@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4064219f98855da2a3edf56704d2b5e24ff8b677 GIT binary patch literal 1390 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{D2OE&QX4IGoq&N#aB8wRq6fHoQ(RG?(0#J~# zILO_JVcj{Imp~3nx}&cn1H;CC?mvmF3=FKyo-U3d6^w81_6AD3OSFG1Z&f$;`yf$T zu=2nXrYT$svJ8)<3r|PS(7c_}F z{oDWe!#5e9ihE=-mR?-(@toW2gN9)lTS6qwn~wfHFJuyR{P*g~1!XpG&D{95c+Hso z-Fch%<~*PY*;k4;Ti3s^TXP|!HFEZW-yBlC;r)_gNoCca-<>|u=q8=ZAl_w})as^O z8QyZ(EWO88IInxO>dt0SL6c41f}bQDmAkEy ztPOVC#+Dr3&e3$t?dtLVa;FXE4=+SNpUM0D(WdD}k35SUukU`mI_}5U(3byke;AJ? z&-mCLF7d>ZCD#4Ve^1-ywf5}`_eRN6p%1u3h&MLeg7$BBMUX^!+mY zdz(Ayn6uP=r}e*P*wy*;@>P{^=-IKC-EUwuF?-=U{{pX1R?3AVJ)x#0!4b#yOKbB) z1U+uzb2onEZEa|rtlBGO`D%JuQ99e26^4$+=E|*Xy)u{MZ*fMrDTigew?7^}!Nxqn z*O$|3UqWf(fmxgSWhTGxXI!(I(fG^u@5dRgO)Y)0rZT1aiG_*6 z!W`xH?{(+jsOLL4Nru00w~1#ynaZ>4va!O(9!LIo7B&y9_Y3W8 zD$nm7yS$doR?3`4I+v9!mk%Nx!8=l}au_NiD}-qLOHG3#XGjwN>#YW~>W zb_V({pPYY`^g_W;Lx9|R)c1u@U+VaqyJ@WhhwlaF| zJY5j-czfjbyp+~;&(q5D9D)w-{Mpa`KCyEn=aDp@`z&?k`ra$#jCGE@sW6ijDw>|w z?|kOn;XT!A(w1)04oPlFS6{m(_g#xyxVOJvzCxDoZ0K^fCBjVW4lUeyH~e(X#VE)2 z%AMlRo*E~|xdpA0xBEB8T;Kn%SG1#Sk!bkSd5kBIOvpdH>d%sV?I|LJb| ztnzkX4&?a%KvUXoiE+;l`OSC3yYqgC{aW{!`|HQYa|Pb`T70=ynRa;RjyHma*Gx7% sWIKOo;r3VeFNEy)w`4vrd&V>VSMz?~`~UH0V6nyE>FVdQ&MBb@0LaKt`Tzg` literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Component 2@2x.png b/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Component 2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a99790268f528cac50e5ba920bbe0abd8ca7c8 GIT binary patch literal 1515 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Contents.json new file mode 100644 index 0000000..19b16b1 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Component 2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Component 2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Component 2@2x.png b/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Component 2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..55210c53d418fd62eac3eb6b72ba647ccf8c081c GIT binary patch literal 1567 zcmV+)2H^RLP)m)Rk7!2XY?-x18!j^4pb6*a8(&d_aXU69{b7tn7 zGgg2M7#J8(84L#V{{Fr(kx1z1j*nG%SEb4*6p8@ef-KAK;b+e0^LeMIrvo4n3J?i0 zTC3Gs(a1`=Km-_u*+W8ZDP#l_$S}Mq)5B7MMAid=fJ-P5K?H_}hg;+}JQvt2uJQ5l zRlenU5kRl&(Cc=L?{atnpz#t4g=YEm276S2k&zJ#dZi1!u7ei`6~fZl+38zYSnw4q zSd;)7Z;M8wuK*9CB>;<#tLyFURm{)NdkYpS^y0wy7C2_m3|EXqUIK%IgEXg~hZ6!K z(bv}(oSmKJa^D>yKm%5-Ry*K$!lodIM0yBnc>$N>OSuA6|R&aa*SMQ_!D^w9z|| z0hzs!B!EiL3NpdgzEjZCZH}#XK_;XmJWJt&JfhSP#{f^F8mScDDs&MtAzpoq5L>wRy zL^MU#2;r=E7-q{8pLdM%X@|D1OtKB0Fq9{iX-PqYoo`v%e-i;M-wF?1<=;Sw@%X_h z-rqqzz;<_c^Y-eW&dSv)bI3#T0AxlYq42wwDki`EvSo&E9o)GA>u@*($%oZHD%{}! zJC6&~1r}FWkO5@;kGCwNKg~4U2Vr0t5P`*C%>UlL(fnC7!g@d=sEu1+oxOe^+XN9{ zFpgp%0^xJS!86#r8k~PFICQ8=*Hwn?M36dWgU#NPyN56K#Z6 z7nP)fDJjfg`Ywu0ykZ)#U)r=XOyRY_}ED)gRqYMqz1#5#bZ)T5Fcx#rP`Tl0(99@)Vskc7s&m>~32#E?K3Lm;B(<+!ON?_)T zL3LLpq>+ZReto4mkkmyxTiQD}r&_<5`=Pd=93U;VH~VMK9)3meXV?k zoh3|6Osv!Abb6gO$=C~5g!TgMa|0afUlb?>Z0DbvjO8K2q6i5Q4u|igQtw&k11BY+ zTMRgBx+W(l(+40~Vs30~%!RjOTbX$vm}xxWkQ&AASr9AmN(r(FZM&EI{15?(EgZ~} z^O$l2ZTcA1ZK}q4tgUmMX>|WNF zql`yKY>P2G-3G{j6d8?1V?=}K=Lp)&lYR0qB@dE2D255(g2d5AO03bDcn+fiqu~m; RRX_j$002ovPDHLkV1j;R%6|X= literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Component 2@3x.png b/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Component 2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..49737cad11752dea689ad89ba9b87e30589ea4b5 GIT binary patch literal 2290 zcmV{~IvFJdu;;14lKja76!U3{qP$4ZEpiVbg7%pJLj$tnfC#!6- zaqU(q{D6@~U#=JJqIF;tEuf%{3RJ2r_Yt|R1zSoY$+0QRk}1B2q;h_NV^9<+K4$KS zvOj>HF=vM4{5t2{bMHNOOk^O34jq!~>gpV^Sj=rQne3@l%CWe(=)y7HIx^4Y<6(X& z{C>i0Hb3HRgtvh+XU;qz12K_cAd17`XkjrL`M)l{QJFNt!p&MNmdRi+ID6^Rr7#IZ zh(MX5upn*{h$`0Evu7ts0J;hUVeEFhmqlsS!%|8i?UGZGNMuq^tI|cFwG<{BRj9tc zzFVXNngu#}^5nCMqI6{k*|i2jRaI5pJbn7~J<>qg0>Nr*Hd{NahAJ42PvfCbXpG%X zp)xR28L&7G7H1!ebgHNGE%ZgB?|3wI7N>*OIS328 zckeb04Gql}bAC|*r7dUOi=%?%wOC6kDA3`;Mun>WKF{dCLxEr~3ySrNJmiNZfdCtCd)>@T{IW5u@i z1HnByozAv=$8%=V9F#XElgaI5AaB2a3|%Pjh$|83^tf zBNEx~FB1r@7Uw%HWFUw+vNg4$Pv@+OuSGm+&9Lah@I}R(VZ;Cp}K(ejqu|S+Lw-{|b`@S`KpwKz5es{vq zU=1t6c)I%k#{%)dlA+cEYBt0Q#+Z#S1bdCPqVx>R5=#OhIE$Wr$OcV&uHc-FWL|WB z^R+KtAp?OHs+%nd#MWb|I3QQko)4p&e4x6SDv+V>^@F4TJ5Y@Es32J58Zr>o&6c_v zM~@!;Ht9rr*IYx5OL4jz!ycO>>8y6eJ#tmbX|W`$tL#aSy*kk0k>$pN?lAhmlNIVm{fi!?@w{^?>LDAxr z0^GOByKq2jCeCrlEuq4KG|=J=yi65}*58H-6a;A(X<%~PHA)rAt$(?PNCPk)N$Xtt zC)b)jo%nz4hg4zUH(ej_jFSdXyJYU^>3Na&HHq}!5%;a?T4loXTzH$wL{?fu(9(?# zdQSi0mzzH(ji4nn@7%dlml$&AX6@92d(MH)TjzVs=0!uh1}aM2?ElNv=Jy8v*sPb^ z%M$6x*nevM*Dh~<2S1by2H*M7ue|Tx7--bwR@vw(5Ku+JxH1_;jKAyGA8dX5_NYEd zVkWu^1RxRy-5<`_`$;hPj^CVn>D`%WTZjaJAdP;QkgBj70}Vr)wgkvk8y7NkI{jJA zm0$dL>xbb5OIfu)g+LLO5DUuWa$m<4v@E1Eh&lLd5(r9=B~~dwf}HQh5O#+m>?T}wabe4W&?739%*)Q@CF9`taKd@aAh<#1SLXa2Q=Zm%;KX9{S$BxbFJvX+oC0NvtM@IbT-?d&+l>fJPvax%TXFUkq->0^K1U2`yNc34k~Qcf!y_A#pPK{m;E0|KvyA2XSro zu}DbYZcHMPSQd|$Rk?O{b_O`T-o#dhlBF%V$Lmkp&VP%?2}+gu$*GW0VS;@ge7g?zCFN})Ue(HHv%%h2HCCd zmU3OmOD(bPoLjfMJS4D@1kK0_AcEHF;>C+4&jFUT78RX27HQIEvq_bnOd<(nac->E zl&^;7hnrwkH0Mef_pwuD5kWJ~E~RN&OSk6-9XWEOjRW}ew8lcEW6d4Tjwi}}ph+fr zKVZor%X0Ht2&K0$D#D&&hUHaQ;$Xxhx-g!OA!9v-dHne#7+4h+%jhN6Qb`I=bcz%u z6X617!?DWEZnyzO+B^oc0cFUTD9H7g!1OkN0t*xpr0WR6qD9H%E0Z($8X}uZ0{{R3 M07*qoM6N<$f@I}cUH||9 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Contents.json new file mode 100644 index 0000000..19b16b1 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/favorite_icon_01_selected.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Component 2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Component 2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/Contents.json new file mode 100644 index 0000000..cb7b1bc --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "顶部卡片bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "顶部卡片bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/顶部卡片bg@2x.png b/BeeReel/Sources/Assets.xcassets/icon/home_header_icon_01.imageset/顶部卡片bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..225de44f31c42b6cea7608ca4c2eefcb3690ddf5 GIT binary patch literal 80598 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%0AIa@>~t&S*~qOYBhXe5c0RR} zzIMyqEgyagsHfL2f3<=~aN3E+(Z38|olM8iaEzDQPlYt#akhNxv8mJTtH0btN$;wr zkI_esybBM|XW1!)Kq|X%xof&$9+L<~a57q`n0PyGmLtwB0*l;i_)gf#w#$sH4HC=a z$wrtO(6(vom>}?!r6;AxV^?mRwtBmE-!?-aG6==P+(&Ds7_A!}^#{sCaENad)BEqO zc78&~Lymloo1Cq2gD-@AC-I6+h*i#3GVU^|R285}069rRrHd|l%aXWLY6v6mY{283 z=`%;#Z!RA3;u#HaJctgRJ&pG6?SSI0CbGEgvAu0%asQ^Dc2UJRz4f3&rnc)9QDL`) zqnkz{gu-w-S1}3M2n7@~wUO3JI0IS`qe;b#f+<~Tc6svP|Yap7d?hJ6s?RCb$HPd&t-$~qC`N1N2WPsrbTuB29}#x6dNS+Y8pa&D)J zd)YMw(tw(&;~GZEuNw)3vW5LG<&9R>Du5o6e%Iy9PL6yofh_mh?jiRP+qZd)l55u) z%EM#J50-D9PfZZP+9$97Tni#w@E9YHkcdGJLz_pxg~I#d7` zBdT$Opx9<{!=VTk<#?DosqPD%wDeRuclmiNyWBpIL2Yl^E=dF{v_tE)^Ud zbuDocKu*%ckbuU~QNC()ZAm#e&vw(!9i!vUyPba8 z0>vrqHx=96Pvd&XDd^0B(Te}HvdStLa+5Vx8KTF?3MlZJp=5Q?DMKu8@;rr}bL$zf zxx@KtX@vS*KCa}Aw>fK$Kx7QL9AVj7mgRh`+Lo!UGWI@^IcBzwbK*$u*EOkBk1b%U zp(L>PI0FpROKXGzl(H$`jA{~7?*;={ZcsMF@1j(;d3z@6M^GM~820q(K`0mMUh(_9 zpKj`b$I>^lEU^}0y(RaqDg!rIkQiR<6kY!K;;4s0&owl$q&i{@=?z5#v&*DT5!^(Y zdC-g^KO86$P*p42>jEMInH?wLKn8&?V){ANv|O*8$7gR_^L4syb+@}>+-=o>$6OkL zJaxyN^Q+n}1R{Jth5SR|+aCQ@3)bRBJu%8SUeG8MBabb3G|@JQ4WKibnk^Wa^8JD6 zp{bGm!>H3EG!Q&STDbTaVG{Tf2bZio^ilAlXzh#)%or==6>=`z zXWq$z>Oh;on&;HggiYtoiqDKk^ zl?N!uL{H@zGTq8L0LHH31M(iRPa4~11qKJ583G5&YRLY8jZGR!E#(bm5^OCShP1Y! zc(87o#il^kZB6&?+5s)aTc|>l0CJM{i@G(9BY)92VSmwp#<|mHjD!Y(Zl) zc=6<~M(LrS?P;TpV@*XZr=Kz%eCV|9W5YtJ*H@ie9HwRW0Fp=usB%fGf=`8SZp)D} ztTR}b@ETbILq+9`Fc%J9DDF~mx3~O&&a^@Rf+L+$l+9e34fWT}rs6SE@whSm<1d9y?y-r3U|0trb!Is>5CwCDV<1TE!qTJB3ikB1-UCP92nMz;UgED5Gd0dMj*3 zWAT_AZ+NjCS?%%;xbvzMAl98db1*QG4Q$B944Er{sbL?C{Fq&?e8b|bVGp-1-~jnY zmBdtF_51JrSra`vjOMl<?bqHAfeZJ@=0{ zAWo*NMvA+wzUAsS_Om1J)D6sNo&9uLDjGC?5+tr`Jdj9B8+ly*8j@&eTRyYnN!=?K z%pj)#^6!J2A0D&p_ERC(#K_}eso#$c9wVKTzWc~jpP7)ED|DT`t-hug6nj0uGldzc zb&e$WVE_+$$-e&#n!txQJ5{n}W6P%gY02{!&8N4%ZyAXm*|mLl6Pa6G1y?7WaXj63 z=MQKY6#L`D4TwCp0k4#5M+7n@Cfz+})^_(sz^x)P11U`;@WT@T9-nK}fyXzSYj&8M zoM}<;h~Q0RPBwb;II&RnCIOqWb9zYI^<6J8pv&1!VnsXK2@v7hNV$Whdhm*;-EpZG zxNZ!K>O#HR5%R=w{b5Iw0CJM{iP~u6-mo&RX^fxIc6n)t6hR~J*%RogUo}z2 zpN<`6j8jk#J#1RLxy|%hBkfdFPLi%brb6te5JB2(?7$g72P!F$?64T|P>T^G9?ZdU)s7}G9u~Yjre;$L6TKT9*O~cSw`Ust6 z<7h$zE(~M@6u$vH(ibpgw+7LrNdB$`a{>PiRThU{l7mB6Ex#l&kD->r zH&}2_vb~+lrIL@}Lo+24_Vs6vurz9I{l&1ufQ{VFQ+MRJpxS^pUxMVcr{zZiWAMVZKjX=*BGNo0M(W66TamP&^-0@7AdruR2{8}4ziFD%WFKfW#Mamjx#I|g!Y2;QQY>_Osj+X-lj}m#zb=D>c z1;drLtvQ$Jchj9eq(RhuXY%d&Qz7F8k8%3y{A1^JJaV5EK=we#R2d8}PWRUGw#bbKz|hX8chgsH*+8#aa$*9H z$O=wRlk4K>_b^U1Dc6P#q2#BZti$RZ*ESb?r9|ePKh`*_pS=F_IqDec$OaI-1EF}DlMk14D>w_Co62R^4pg;qcIqloF|#fEpmhqFVP|(mZkSV%!4z*~zG`da z94(k>gscRbGQ#N2otnvLsD7(x5|~zLWsv{?aR$)n zDdCzBz#e)ZcoZY6c~u{%P^rGUtE#YSsWfeHM|j4?ojR2cn>LqslC9yZb5rJTzh9@< zv6eNCi;Zl^M+(`LUE_;fWQf>Zg8Y;-y&X(e0r{!$n=i6BH3VHsi9e6b}4CETAMmB|UPF5&sb++ws=3xMd_K|XRDl72d^4Yk4W06k_ z9#{P#d`5%m)7SlLyGv*vEo{JJ++lQK6N!wU;TQ%*xrl&uVFspF4yXskws;+624R2<@a9R^>jGxaK(VO1J zfbr952I)8pE!*e_W>j-rKqJ_w36p?MGX+BOOS}|<2)t?OYJgSIbpIf@sTsn-q$9Ec za`Vq)oJ7(Yz)OBjQJIJ2WWfhMfuqBk*Z9FBrZ4Nk6$5LIVRY6wcfb>oj+lpD1P3h@ zpoALZfyl0zs5nKzoma>Js#@eu^1)k_>{g&`gmCbL3_mOkQrFL^r%sR&5&6g+!-y(7 zR&feV;kXjWBjXepwgz5`;#|W*z63nRPt}NI(;<8mr>IW=4)#Q}}@VeQ*+G%SH(z}TowD?Ib6qy98$WoA)J7oX$9K@2!)NDfH#Oif?uyz+ zFF)h>Zui@Ui3JOf7#e_#6r+#}E9)S;v(lzm>t|;LbkkUaNfklr$FKe9^BO#!dFeUr zPOCExnyLL$41$nXb#33LLV2i0GnaGJF54L64%q%`L8Fr|bxA4?4A}p~o6K6k$LtI% zA}(xcph3$JeSOGia7;*q(|A?>z183d8zXvT>4(oe{j}yYGC75HlExqbj!!?ue>rp3 z$eaioPdx1~8fg^#6WgAlC!4<-aE#wtjFHAUFPPSVM#{ajI?5v_xxa%&AqL>cMIOwB|89NoIOVjIZ z7_y3vOvDg@nm6ioUi!#7tyFW|9jA#o@^uML<>eYOQ{V2V))T4}hJ9-Q5G~haR@#)Q z8nN?z(N7^{(+J9t-_1??CY5E^`Z%Exl*>AET@TX6f&yMdSa-& z)=dp+b}Fl~RH<|BVl~OB$N+&8J-`uHtE+t6-+-(&*WF5g_}<@ZqH>4RAhONv2SYSX z#|DovDB^XT?+aEFd5IlsYMsDk}PLgxBa>)l)E0N?&WPbhXFPS`K+A4y_&)#rryB2W}9e>6N zsl@L1>ubMB!=eaWFS_atIe$+7A^9HekGiw;bk@7v4xoH^)s4N=a-R7g!Ibi# zgTp4m7*KCXTF{q9G~7&!(p2Z8Q1LYg^3M+#-!$lb#$4^P4;+-v*{Rs5F3dKNv+2w- z1@=FeRG5EUbOidgFb!Q}DBGN3CxLBVY`z0IHB9cpI!Qg$0>`J?h~r;QpTTn$H=yyv zCh9mk%Jj=eo}nGv%e9R$+W5kG(_7#;W0pi3)tH$`f(Sp@p4^c`T9YJ#=49A9>u8~z z_m3#ErZIpOJ>c?Kgc}4_h1}OG-E|5?uUjYEF;I|qC2LNmZ3V0N6zCbw&GY1*?GDvx zV^ex}>^Vk1+A1|R5luVgvm~z8N%QKuQgBa{)69A|ps6_FYMN}DQeT}&fK1^jrIW%foZc(@PXeiMFa5bs3$;->6h&j>3!u$hlx6Ng~o{EZL90RF;WDNf6{=*b|+C*@VNPV zKZSC@K_V-Q*xu65(a{U;EySp_9W)pp9l2;8z5RWccdgPqA2(I``;{Lx-)fw3@N`NE zQrk21`HH9MlwdsUi$0#W>^1G5B#h<$!>WJTr*)h$LgsZ}j`~rLY-fJQZZK6{T*#r? zWwHudie{%VYoRbr*TYU$8V+=4D0m>=u_ZmBz zAKQ0`6yI&+vx`E4&L{ABT6U%0nxZ8pLa-wPgu5bmTzSLu8azgd?f0Ga8|alwPRZ9) zm-s#vXoN>V9zae)r*lU8YztYlmAg1w+oz6RFt(D=Cn;VcX?l{VV5v_yRf*lBlGH{f zmD%9ZN%b?E*#y>X3^KsphwRK6d=w?5g;{&IKb5oDzI*zXT6U8F^0%DguBzLg9=&14 ztSJj)#BuTIhfy4O=mU;jv~g+^ZJgdk8(RYRAPKG=&1Dr*CgT{0Vr?l9IHb~>Q6ZBN zAS0kgik$OGmK6%-fY6ZU#{wCQ&{u5tv`!-xhjeVhXH4#-=7fxMWm2FK21gh3S1J`* z%7iGCWvinN4jtiCR?QX3M@`BNLVEZhbaJf|?Mg7^*C@CF1>E#PoNVI|4(eV+WJWU6 z-7wY*My>7v7qKfZS2#dq2i7_cLa^m%fx+bw+HWe}zv-uqbNUEA?i9e7u7)t${z}wvJQR02{o_?{%WE@ZSBcYB5j;kk zbTQsHQ4 zeaYm+%a!l#DEHeNHuA4_3;Fj?#j-Z8`%d0Grv#7Gg2%qyS&`zWJCGuv9OgR6NbNM% zS1cr%-I42JR6%}A);b3-&t02+?uO4A@VIdCqNXk<(CnrSe$bS+aoq-bzR(@3Z#Mw4 zwExh5azB^En#6h>+LmIn7~I9~(ezH(IRK{UijP^m#8iGD2U^i*NE_e~upg*rLmell zL@;=(*CLHD%4RU~>LcN%Y^W1K_ctZL9w31J(J{lK}F!lrFmH@`YjVlp99( zh9$rAyNA%pub$Hw-Vu827klZ+C-xTUBXB%?{tPtW8^fNLej8Fm6Zt< z%7E(AP5Yc9``)@Ias8q4fGKM^*HoYdD}nmnMu!Xf?`v5Q1qMKf(?u}ik-8lj#20$X zr~a}f@}zxs5SLn>yk)HblW$0TU&d#2KrReGt$oo#TQ1~9B4-4BSMOr-YDAK1`2*kV z*7b-2NRA|q&Z14uMwohxxpQh=i&Yr&UWUjKzLm0XgH|9StxKFv_K(+orv1)i3m%uA zX!8xF!7h1$!67a|7fK_REqqH3bq6a{OO@Oskomh+tLcF)kJ5O_L>?0_@lzf#S}FJS zg}A!Ae%CRiwd-n>>J~R#|IuG#ZPy5Zsrep z9b}%yDnJ~1xRLqxpYFvJQz1$1{!JgeDX-~V_=-hz?y@Di&XTDGlJR?x!>q%vlVV+b z6tdJO`jcgrAaYm;FKR!hXPJ!q)BZ5}me~NN^r>Ha5Q)E}zDeN+QW*_3EDuzjBD3|x zszWIORBI>v^jE2at$u!{^>o8t*g%K4cYgRJfcz~ZS?3t`@~ZjA%xr+;Y&zoT8T7pu`FdPYo$3hb>%W*ndBJuh;{a17PjcyNY3lC*-&j`{Eej){HHa6A z+MF>pMdUn_Vhf-i>>OT9u7H)OhNT=3!JoG6;)XrTMZbqNzW4A7t1ro|CqxvY_jVDdE4_IB6i;NB&V zgD=u3DcPF;g$?V!S41CM@Ob5G^7*!Q!=8WHr|2ot%!6kX@~^Mh zIkA0>FOOAZK-V3oUoo4ld|^T|&bleCc(b9d$0$IG(gGQof#}S}^3Y5jZ2`PH4dCH$W2d%+a>e zW|6F)2$><${4(QgH3nJ1OoAf}f!>hmk5mjgi8R`(7h1&~*Gc^W_>%t!lyMp{Ervwmjm-JFlLJjCE3 zak_@Ju9gw-4%dsUd!Q*g7mv{x%KO!9tqqhZ;n;R;*zmSi8%R5@`hC*2I%TkiGqXcU zy6%sFpTe=kmdoAFy;x&p**|6aBg&ZpQ|J(s-N*26PPx1(PNf|%UL`cHT&5INr_dj^=W$hHzkjlSp z_1D@zq`9)0iI-^ty-g)|awkXq$U1XGRQHt}33zNbRY@7#a^vm2;IXaSAv1CxR{5{! zB}WlB-oD00AJ4huw07#MJQhLEhgN>HcY~er(A*}{X6$Ra-W@|fMIos)aGp6qR<;#P z$wnJ#?uh}Wb-9YszwF%Nr#Do=5Hf>oapjtcswa+iHDGLA0*Gh z&@sqYq`1yB_VEMx#;B(l4U~0|YExCe=P_;~?SF>20a5E(@Hl_be7bzao9KwP?p%@o zK+iYwQAkzGTz74Z@d)~W*q(|gn`Bl2So?y0YN!}yG(O!${V{e9E+Ze9o}8SM4&)Tk z!z$Gs0P!C>mZgrVXR-+bNo8UKw2$n0@(HLz{SzLMCIRGc0i~$p%BD;G<-(U8OlQ7+ zE{#kbp`UHpMZ0#|?%4sy=?!qyu3`P|Wcmx|)pc`kecZWDJwW9E9iL#s4WWiKLOvfKg#sMNJEH7+6^@b{ z1+|8|KN4xnF&R>AIte;>*(W2ezHc*Syl>4`Za_9d!;Zan%Am+zsJ}-OMPxGksJI0c zmZAfJ5jOl-cKxxj&myCw=SB|m*eT{?;^}3*lH97E=pP#S;+k*L7gv9yJy!4tO3CSs z!6fo+)8pGQ^$g{j;8Onk4Wq0-54?47w{OVi{6zy%xL=f{3h?APGeoak(Ml9LS=96^mScRXk0Xc z$Mvh%(^;3E)#S6Z{iH?Cp(6hga6R8BuZ3jv6-X5Vu~m7-<&r*0gdJLE0$F+JQiM|0 zQ-VC`jKY)7b8%k%Iy;FGK&S|mLnJ;}u{4X-24|*i)f`{;gt_!z@Ci8J!AW3FGUO)@HL94h(>g~~gP$K4C0P?5mS_KfsS1MR@$mEH8(BpbIi zAoup>Z!DUF-|I|rWY(I7lKsaTK5*@0{7lE2uTGyHXcBDuMFfxgKW!B$0!ZO4lj~ka z-!YB(`o#~;t<0J!&N4v#TPWmQIOz?>wsUqBi_fN3qip63%qP`tHm!-ZsKD}{O|Z(FG9dlA_gCfM)E*t+1)$Xr|N4ynA&%xu7nG{&1~u*=0j?Z2Vhx+nfJbLY?``Hbry_iop3K<<5JYA=8s zp-Fn)(i<+g;x9%xY*=v2%!OB8eKgHGdM5qk{@o3D)J<~Y=Qs{uFoRz5@`E#YRJ-J( zFq(Hatxk^%3xm4PhV$TBa;mY=qzqIbDs#KV+0DGbfgd3ysu(}K7Jz?oPC3<`$?FM| zXTU1D=-OBm@W-yBLf1AB8Mg`^b!Qdk29|Ggmh!B^L6ug|ujUr(#y<>gt3b=QPdQ50 zlX<=vARkrIKEHIsS=&$)jCz2)kQXwl*q z=Unbyzp0qEiZtWk8Lk|%?-~aVn3HZ5$6CQlsf)U2AFQm|G}BfSbrI6B!DHryMD7CU zAK&WA{yNBe(c)w1%_}a+=kYs}|M1_310Ex_->Jk`D^97{Rq{Ha&Gqvby8xDW9G;gO{B0 z+BtOMsfW^IkM5;yk3D13#c8TB>Nsu22&vZ?%!o}S8Sx4g=hQ?gvV^9tDN!2dT-)8p zV7)*9S1G92cz;|4HD{_fH6_8Yrz!#}g`d4)bdDXAV6w;Sy0J%~67g0ZWHqFEl^qAD z)2vd`+!&OW=Gd2hFzNJAB6KL~YOOyPOo>lcB5>`k(m04)U#2{$PNXJdC{R zG+{}Vf7uS8V7+_u>Gt;)z^cPW^eCkqK;p=Wn-SQ8tFBcoYF=g z>!f`u6uHrWXUIsFs19Ttqx~w+_58{xf1S3C0dU^3;vzbA$>Myzp#hJdxbCw9pPAL} zdRmbMFLvqWjuO--cg>o^#f{B+qFAFAr`P_6_gk+A5N)=gj7`W3Xqte^Q$&l}hO)gZ9v=LRg*W z`j;CDVJglup)u~^jcc~h=(Ui`h>^#W&wVAGb;%jIyoa_tykFok(($MNPCl;L)QMUL zDdkzq2|O_8UB|z<_L~h4v*@b-@vfW*#D((vsMyV&Pw$|Kq}Vobqn;yi;#=c0<~F?`9W;6xk$*Gl1PeUDMvQdqs#(t9mwAIf377`#9Mew4cV& z1+p$(28=j!D7nymB{0%UDX&C|7(* zH{bhnT7BIY+Fe$K;x`^Iz3O!|D3|fenSTcK9(xCoizf!=Sm^NnlKbfO%g$-)yEwIR z(;l0CMr+0ZkC7CRc{!^bv$`+Yjd9JDlxp$HYal_q8#WXvm0 zWt{_MOL^KfU9G>peq%e`bwLBptZ#*SK;B2$mcs^ck>`_^oYJ((f(9tgPjyiL27S6S zFFB`OuQ*W@qmb{o=8s{(74;l}jrUJNPj&WR)r}RZ;B8ViYr*)aoqxw=*AC)8T3ckM zn8G6gbYAbE5P=`Z&hC=V+`t(%)v+2-0Ll7eD^#U)_v61rF7BWKGzlP|M|8mjSNsLj z-v9lI(+=ZPo5@1Zfw)ZP znW*&J03F4Y8*I-BE<0QpkHE2N;Ko6?KE}Un923#wV9NFZ!C*rS^0LT}@aV3z4#cvT zF|x+g7N!Q3P#&}n=-{d`$BOE49_?kWi%@cSgEyvFPb&HDBayB+P4x?FzL}@13dL_c zF1z}Id>$iB-&*(mc1mSDjzBX;EaP8XFDVq)ugz-y;_jtKE;^j%yr}y|5Hmv*JK7q$bvt(nE)Gi|NI+Ze=Cpn7%HG-QsZT64zr$SW! zZF^+6(+IoBDqH=7x{9Hheg6+IbXf5wJMqHxjv-%Da)qHSM0FQX9@RdoywjL6D5b^E z%WV1HR$8*`b=mekw7CI~tNv-fK~nea#~udS0gR5xVXuRXbl+X~m7m^7B=&Px6Fofs zj1#*47|`O{88@P%eO|k^@1kK-j4qzLd}(<@^u0v!I0DGCo9OA+o|P!1@!6~cAf3IU z_(GObyQGC$hr{p8E)hCSqkUg|)L`ry8D7}QBM#P}%*ygC^(WQW?UMKkqBo*tbJ4eK zq_&4b8^@F#{Yh0bCc+406JnZ-K>jw+g%`g0e>Z*XFV8yvg>?K$htR_h?rEHx(R@Ef z9gl9Jj)%;SuN?YI5)MDY#Q9#)h4YbFyHxSotdngrAd?j+D7luW(aPwL*Ad2eriX$| zz%kNsi;t$|4S1B&B0!AafE>>^6n7>-8F%Ew zyd$uDNt17kYMyxdOHj*JS(aDWS25eQQoDtUoI}DLPnAw*1dp#@c2>?O0_4A6wZ?$r zK@{s%1+JFeUhS8U%^+lqfc~^;?}zjKx2(9h0pjzr0~68=)7KZCU&pKpgRfGuSGn2P}%)J^Z7%|bA6$&Pu0svKFR5*08 zVw$`q?#%FM&#k8Y!ny?@OCfsr#onvbl;u#(b<}2L&AN|rpm<3?V1BWv|&*%(U$D%$TUWL;F zE~*sntLQ9ZcB+YF109|219g}7P*2;`C&;nk#WgCqXCZft|K`Qt#HHRW@~u&zx~9YT z1iV0)HMsWSo>KZsE_uK<;o@%XSdD#v^xplDYV?3MDKpgjH{rX?<>r4(J^To9)oEuM z%ty*PKUsURzz=>xM56jClk8cn9K(C=G6G*ur@;_(M*(aSB`pRG7^aE)x)ogv6hY>v zJB}OHykzlFG%_-xgGCg;#;HNoC?yd_EcLxOa*eyAaY(;<%eU#vYd7=)q!=xH$NMhL zdF=~$97Hjnd++>l`xm2=ab4x94VctdUdov7&o*r+u2z(ZNwd>MEzWPi<9Q8ul)<_P znEr0n$HxsGBgI`RSq&n6Oqq_FI}oJ*c#RF#mYYL zwWH0~my7)$tW75C*4Rj>@g1ol6d zRLHfT${HY@v85qzo&$Dr?+&y6aXpPele@6~2Gd0sUA}Pp(<2)Wo;~HOb%j$ zU7oJODl725gN{avA+hons&y#&%EClyIYKT&#X_CvV9K&tu^gBiEz{HrTiZSp|vRMW4l-AI4ifWTE({VjcA^*8##Nc^?mDR0(sBKq3eyYrg3OWt)Jow`&v_K6YFPmE)2W*^BXGOSF2 z_USrxyK&A#TOY~b(TshRheM>`qWy`#?5CzK?xf1(tV3qeNlQy| z`4@T-3~E+oEXV+8Fj0RGZcS9RsGYv^4CZUTw5tbK+RFDH&YqoPn)Yq|W2DIl#933=o;Sj9ko&U_c)m-6wucQwh! z=?>a%<0UWj8ihpt&ArcK6vk+L$lvGS6q>oNk+xbc?e###{qA}>&D7)&%9`MNm-Q)9 zNZE?m|Hh!y7tDHGs(?56#g@{`ew_l3T|T@1X!<3aawQ5QeXB2T+qI45YyKZG&Sowq zxD2Q)#7<@HalDAksA~5b*~t+b)uM7nreVLe{yuuuxhIgHF61{Ikgigj;)7i7e0p~S zI-aB--}|!`pvA~$1b*WMM04jI)h!CWGSXZdZTk@P@043* zDsOVLQeKgvCi3*mlTYM?BO}w-(-<@fAb$fX?zB3(cl7pGoPOxsGtQe!5B$`wcbqwE zgkF5yESR#IDEG`zUMJN1YS^<(rp{kZWg{4HbPg%`wOQ63*XO}GOv;sO&NgOIA>}2Q zuzyz~7xlFlLVnKY+5L`?tn&)h5kmqaD)rOz?5v<;RWPJCYR;e zoTITyN(TlNU;;^1!8x66c>$wC)bHYUK1t{;L(5`P?2>rq`qUqM18%6XUcRQN+?Rgo zQ}@t76iB9$dCf18S(jNv-a}8z2W)fdc}Z+|QUfy{mi@XMQsFT9Q+nmne?!60m)CxW zUU9~8mB%^P5oaz~->ZvU-oNQ*El3owxc}g%1CM{Y>WUUDNLg$C`U`aTx=r+KP>e!G z5c#LqENiE?cI0P02*mQbQ7J&`8trI6c8um-dessV`F`x-C-xgWDzB+rbevEXRr_6+ zF1_*g+O~#=zi+3|?rg#1dCSkq&qRQ6px`l53n0+}6kb@Tu*K-(6)P?-z+4E@N4vW0 zczXC7nRHWvm9fIf?9+;^T_SC3F+V9EKgJ{EWiaO-sA!|koQ8_+5~26kr3|j}D-1*+ zJ`C^}>4YUpjlK~qLIb7Vz=Ust?}EH5$H`6#c8r}M^@7oWYrBWZ;%e3djNEWVvrKu zvfz9y3gkhg4n%_vF}jYj%ai?RGdR#Ujka&Vo{cYM25r6VrU3QPoiuP;x&VB)NnzuG zJ->PaGu-%J{`>=5XbhSJkiTIR!DBPdaQmsRoiq29XC6jde{9z~&UxW9nt#-cHUe2t zKxsg!BJxte##uoZM#(z22oyr;-xS_p5*8HtB; z^lPummGApI8l!wKJ>P>Xpp0P3up62N1I#5kb5F!0)ug%xguNrGWq;ulchYG~UfzI@ zLy3~il!G>Q;3`HdBfxrKYZF!6JlyG|FG%1~z)&prwl&{;*1)4s1j7G!z!^tB~|et!qhU!D{FJzF4QnA8x?os^NggNT)10 ziTbc3a)wQK>;$ZXjC9j=H_=tsT-EfYIi1aK8ZrXQ^{dyn-&eeR#bpE|^NBAzlR$V3 zU_;yKz7r7rj%`qjKo+3I$;9iHpGR9({sT=E>5i<6jD9J7qI{P9xoltZ%Ll(H$pt%; zY&SC^wO?YF@B!~2h;!E-hU~-S4RpBl+q{0qD1XSp8?3x@-4E@`^4FmDtaT&njD+3W z9#a>H!iQ-bGzlPogXp4*-m;{LJbwCBubngJcN_5d(=EG;^^S+nm+xHF)TKlz^}3(h zr|DBVW2{I&x!}N@I0L>+<4}viVJt#~BRHYZH5qx84Eo_nA|vuab#z(*v{7(7c@YXG z6}}I{zj@?_oefWo7ffC9W7HRK3&HVV%1nlW!a!4ON2g4qx?|*{&X2FJRc{O>7WTtX z7 z9)CrDcL3lqlB^YV3XiB)=ea?#DtJ7ni9DX2`(PJ&{P@r|tI6N3Ono-waevW=1^VFvjE zmoa$0D?E7H;f-HvaVMXWpUt+80)T{nrK_h2px+FE%`&jtMZ#T`j&4rY+o z8cL_LutDT`X5d}kL#F_W{R~n&i2fnu0ZxLwO0~hMd|KftZUPe{j}LBsh=xTA({xc` z!dta;V6Mh#$Z@J^A9xxD#r2SJQ=JGNBiOop#pQ)HE_dnFDUZRV?Cu`uMng54kq3mV z=MZv)G}O9R%i6h36mlY|i$ZQrT@v19P4$2uSphx)40iJrPum_LHqISK87y8OU31+W@~rR{T9*wTt4Q zl1QX2JWgA^d;NX%m)E`(3^6oP0m5zH8TMMU7Ch!@t6gQk*Z|xwHj&Qf0)2Ju23mZ^ zOX;{1kIvUH4k72#_hG1yihk|-Lj;e1w{rDRc9xatptUHdk5u520Mr+s_~7SS@c8OW zUe$h+Qd7j;SntUj{|t*>FmE>W_fY5;jr>quFTsr+Pfft56yioELG^B-s+OVG{D37Ry_3SwvpnrTA^6}w;RwK z0q^X?=N9s8D8%n>E__y^kjE}=qL7si-nMBFJ>#^YxRv71g30m6*uPCAFi>uQY~zC4 z4?_eh3z^zzEK78u5$h~IxE9hG?>@Q4%upsNm*1#}Zhe8<=&^NR;*~wy9>e@@rg73F zfP9WqTJyLrPFr2&%1kaR{}xp^XC7(4*A6HV`KLX>fG_hc@NI07AL)Om0V_Ec}>5De=gJ zQx5f(?F2oPHaoan%d1q+&*Wf_G2W@GFsN`{`*ODDHiD|t9r1bY&BwGz#X$w-X!1mW zSFF(u{&|KcZJL$h%_s$ft@^9F_JDf@s597|N!=zaa5AS&IrFjizq%W@dMmtUR zxkR72aXtN~YySX%PHL0%uUV@!hHN6mX{*EfEXmA+r&C{t3r@Y@V4__9-$7%|!W#<$k^S;&2r+3h>DXue&d_L5)**DjIonE(m zX$vYf@Kw<>ApYkz>9?%hOcO<26f*9}dR$R_RyB6iit-fo4E~aQgV_t{=hhqmBST0P zyBT0$CYPc1Ol%zTjk2YB-Ul>NKH~pY*uaFTe2(C;!3$hlgGnN>P2_R+FCNJkr;X5! zG)|fXkk4W2KGm`J)318%+&PO+Z@}Yb3m%VsS=?zA96}iBKq)W|U`_F3a&LI@Gdy?{ z3N;C{1+&>wJBdXxGW?}=05IYMa!7V@x4(|cEm+?s)C8WAV?%}4BVg4JG65^(F{%N< z83}Z}l#U6s89}`Pi2C5Bt6_dlTDs40m)F?c3B?@-7Ikd~QEwNhl!&RV5wbk^D_PM) zt#TS>k6r5J!)V)JWEY@3<%6|AW0_YJYKNuOas_Ve-HHy21H$iard^dDFWEIVNU$sqZAT> zV~jpN*C=il6h9%d`1F^w=hmkw-+{iT{(kt0>pwr#O^CW_e_oy)4?Xtg6W4#1?pb#) zow{T(U2*kADXD#S+atrDA{y6iqQsOv+D9cz^&!U-5e1r++m!Q<7q6<5OYRc;i)qTg z0hPf-KDuPVM2oX!V5f%$DX2<6kbEO}+_3K3G;E5%?62SZe_Nn95%1+dD1zIoR=uN{x3@^cHlE|hJb=wtF5>I|Pgyz)c&_{#tM_7;$5emL2>nlVar>?;!O2|Km6++*#xc`aIfj9k_)#T|M>T+Kt->DTBsBDk{8^=3+HPYl7$mb|s zbkSSe?>si(apB_AXAcCAIFeF25nNX|-p|OxOd=fK*&`CWRSd)!5Jals7|#nUL*_eD zWHaV8T1^=m>BvrRHAL{l;Z@1hlvV#KID03;&bj136<4-)L3jqO;-PMkp|EtxtK~m+r4}c0B6SD#oHvIp;j8S{BJ;JfE%x*WY~qYx6P>yalkDN~WYh>M|2esJt2@6msV!_qy-X$FKV$9kuX94S+n|Rs@@gYc-@irW4mq4vYR{29I5Ncd!5ca}qoX zeRb_Uxo3Ol(o!&yt6FM zCZC8kkV2QOcoQ9e`Uyk;oD@J+l(@3mMj&b@!L&mw&bEQ*@ z_@K{2My6QKgUwPJSdf+F!GI*R;i9D*l4$hhFGr}SHu-=gr zXHJjtdyP3)Z_(t;IOvom#0V@tW{jX_94gk^Mprcx7c|te7-1M2Jm)e_zo?0<;l#~b zOpV!{8v}}!gFH(;LRD)|0w);$^{GSQOxo#e*1FdXR9Pf1dpq)`vN_eDSo;n?v^U53tau2rr3O=;;h8!u)_wAC8dsL z&_zkNt@&C5jPGv2-qDXNqWF|17#5M1uvvZ}MOpiIcmT{tY07&y!`$^9Div5)g^;!Vm7WXO1rjt1P zT104zdwfsKprCfmBi5F(E(6UFA0OSli=KH>_1MVB^!2n4GzlP|gY@)MQ$Bs{%MM!j z%5&y4k;h%MXODu%g)f`gL?F56Nj8GPK3>jvLfDn`K1NBLLtLGc?ar+OBLW9WMMAlf zl^G$@aK7IhsQV38U!c*-_$_2%&O$%14s5RnyJ3k&HY-mf&Te$RpK8|+wh_E+ zr7DI9XA7i16jk{RU=T~kRUOR-w)}!_zVR#VaXWQ2?s96%;9S{IvD6aL727-v5V8E~ z3+U7(FVE+j?z+DLkGIlq0^M`Ry{gVCJzU;*IwLEEp#f}PZzGu#K_-eqZhB;eB6z%Q z_1EagMHW1I(QW;Em<0X)CG;4yv!GHy)MwQcZ5pp1B#$QV65^WwAXwwTfGi~hEqAojT^(`R0C4oxJ&BWFjB+Bo!+;La$WjjkrhVx*M_Kh0ZR}q9syq~z~K2ABp-Nvjt ze!dl0<{SUZpMPKr?E_7&fqah9g%`eg<)O2uE_wAuFQA{^ui$aY6sASLGmEB9W9_%8 zKLxM6$*w^((vMUVEEAE09FkG34d90M`-{3}P&Z6TJRxW_qot%mW`thESo87`$WSw8 z?Qy!08LzE9^zA@igUCPWmPD)A*hzduo(bSAtJCcryxOrReGgn=m#R;)RYWO8DDtEV z59ELiL)!vaf_Cxw4Qyjco*g0E&xF&O@rud6wf^7Rb#yOSynyU}RfA zw-FBHM!sgK;=WrKi=spNb*KU8mkJuwL65fcWz*kG4QDZi@2rEx)84+jqAS zs~W|raW9DNH}5by?!+V8sipBZ6`dSx8HX=tpRMWx#X3a zKNghbl8C5o5WBp)i1UHa?_KpeI&JBRxz9u%KmHt#JR;qH@6YM{W!-UIzVND*soU0k zgTA=>>-6l9mpR+11UyC%_XqF2ymd5*@a?ma!}#PxMOkpFwv@#|*GF~oj~i{cJ{p9- z;R0L%?j~oSf&yaDT`J?j)zvD5&Z$;swou>BA>om({eHV6 zk8|=nir_K+MT$F{8tb25U&YQ4fiKn3M99UG20Wg7<#{@2pZu0`vqJO>EQ$P|dCA%I z&9z^f(CNhOcOe)5F_Fk=W`e5rU;Id7yY9ZbM~Vprs4*4k#D6LLYHSaXE#FW~l{^Xi zL8^!oe{pMby@Iv7ZL&^wgB=@dpX$~+vTUpqxE=RT{^>JMs=qKg${(hEq)7nz9HKY8 zVcB0Ca@feKOaEX#{o;{lGI)%%Fiu;Yrky4f9acy?EoV?eV~}{RY@KVtVp)M$qk??s zPONecAkyRk`Q(dYsZF9RJYbiwb|jWu@u?drWcS3H{87y4@{|-jX<^N z09hZ*bj=uzx%XRJT0rrmO%Lqz+Q8`SJ`n#J0QJ2)?{BX~Q2C0}7qx$jn?Es#=wzaU z*;|+9xd*l?c#I%5u6s20w$|6t>BKzY%7LsiJHLs5zUGpXvtf>P|Jzlc+;7J}wpW~% z+XvDof*#oNNYRbzdJZW(E8sD{=avJm3|Pwb<~IUI0gr#O>dMBkPHQKPQ3zST#QN=e zdid)LWe3)*vx$st$j%*9B^0(xY3Go4iJf)GOu}jEx{*iX#c2AF)1?cE7#v+9opoS! zT+YX+B0B(yQdynf;f+O`MRLAJ1Fc*0<=<-X7%4W72aj?O^*oY*{q{Hn=Qnkq{}?8< z;4!XU4BDq~@IIHF5tg_Ab`T>@VU1D9xZ%x2Q5S{WLdQ1kIU-;xi-PT|A@P_`h(WHk z6XyVk$N-1@F3g~D&1|6>&hIs3Ur~y$nf?427~TLKqmXr?9%&3Y(x`GBSbjr*;8R1p zfAJ`d?#g{>%YXY%A6!rSNRt5aIYRMs9bt6z1DF26f+ms>Xy*>?B1auNBY&zRQs>!AR9SQb^BPA#Sb?;pMXOZ3tc=hNv+ekb!1Ts~tDkdXBPS-mp$k!RPX z16D9+rN+He+TbvUTG33wd!i^D?8~DRecMHMHIdhQ@4BCUeD4D^Y>GhYTkG#@|6+9a z!ewXBaf^>^!1`hEI&emT3L*B_IL-9K*WQwWSp<*qTZ^VC+`tgjwjk72`#X&>PMQkg9wYAyjy=2uNDJCX?a}Qu>>e@d`_;7@>HbYWn@~U*`Q6s!FYPHHE0Ues zuORN(iahFuFHUH(Tn5^(ep3dI?_RaMaj*}wiUaFFI#9P`0ye0bB_B$M7s)WFXm)4} zpv8mLnKCdt>@|=xVU1>?GjOntDLeQj+0Q3+KWvQ{kkkbgP+&W#hBh#nBXz1tdCJDH zeed7-tpkq{ICbDLPFwBTChoQ>;4#t(>9ZXzfzBWC{#+okYn_u{MNyXxZv&kO9^>aa z@~g%E5vbq^41n@qaR8pRDC9No&Nh>PJv_GN#@c*YPUCG{KzYc@qWj1A-!3n|)XKCO z$`r^s`n3V{67rCJ)pX2~hee61zgQh$V6*kiMa}Ja;3t`%CgnA>A2bOdp93VH>p1&@ z7t-#=Za)6YXY##y3#QYY7fdxBsO=d8A|f?lC-;o-=Mg1Ij`zBAV>}3N)yo&qnq`>n zl-6Q27cPmIt#%RiBmWYKQLm%S_R{XQ*ll2 z;YgS!w4~EWrTn1fnb9eH|4h~Ps*<)70enNqHx6#>k~{}=o94$&gz?_H zHq)K!e=ziEa(xunOU8|F1W2B?^yNwZ{W@Su-96;z{$|xpd97lcy80?vZy3D%J0RLp zlFOXdw&ngrAkRneNCF-|RkURUKu0Y+yakC1n%}rXYXprm8lWNCLo|j}S=^>ww&H@e z-v4y%XNLA|#Tvyjy7ha(b>oovk>j}L@!6WTD$`Ic>43;R4S4*-b)U`PvE3l1M@Vpf zL!`$aorn!;(i+HsVvoAc=?voRxVL9wE(3WSHWcc1iIp-S3MJ55rjWO)qF)ylz*Bey z`EpN)A8H&|T!NwcH}NzIcF~xb4m`%sb^JDwg2y?z>DRAb*8)f+{4_=+14iVU8&oke zPs5`ec_j5`#Fr?iQHxFO`eVNX&^`C;MIkr0pAQi>2hPq=$B8h?i{6S4e4spJKPcI% z{AlX?!9-XnyFBO{`XyPJj0}-2Q}+7^oa8=PCC;8_lt(dHxo(~N9$+j;rnD08`o+U0 z`nYHJ^qXiuXc9m^2Po{Fa>Hq_o3n7y2?x>7f1*1~9^Qb*7tNoRz{sd^-*I=;JZeEc z+T&dxsyOkGhTZiP1=3q;a!Uf~1g31jB^f{jsra}`Sz?s|iIvejG`3_|hw`&jisx%j zZTU#5Me;fT;vR4qdcmWc6x!o?1Z3X)!kZ>-e^ijQ_fe~$zehdyHO6X480{n+aQn*W0+pHS%{uTY-6wvm3d2_^uVWv zm8;Q(uHx-+j56N3=B^2eHjbABNZz{UPWrP|Z)yQ$@ZBY7S_F@g+D~=>`4Qd1xlI`} zb_H-?_BFZ}!Q%x89v|(%Bl7r;_g>lpz%HtXLrNlZQcdmc_E-Bs{FFufw&ee9qMH*1 zA|vm8y&w6BfbCfWj|caF$KtH2kATp68x~(NQz(K%=2{Hgn zk59md=`A2_5tQj6zN%fQ;0wg?u*@j~)tmN=cBD zsRf|{|IV5u()GpYXC)hvGXiq?YQw7K@W3(i$6VF%=6yJslLc0}Z2KI#F=V|OqFv_G z9lUK@{mRz4?1)T&6_`+WCu-gRNDbX?p~X- z!!#y%G!($0CrVx(X~tyFQxf<|x2#v0M_dXElLRsHjvkru&O+&ABw)!{e#M}Z5&Xm# zqu3-T)$2WTZo!E1t*pqXEOX^iA_q7i5A#k2zn1_?$gg*ld{7bP-NGOb{q=vEQy+0| z0~gKa9&J^v#h|OMe+Di0N1Gm`|Mk94wczo>2p);39_s5Xg7E>eUy0=NW93U{CRmYV_d>cN;>J4pvmWg~ z@v|NF(;d^Uq5Y)E2;{Gk;?&iH51qE^_x@l${p9}LdDEQunU155iHfGP7&wbk`hf?J zN;ryz4u|vAvh`u@*CyhpZhjse4&GHS*I^g~NO)}XM*PsR!uZ(mPwk{HfA+idrM2IE)~2fN3q>dS!|(qrUG?6J z>BQ3)<$fJE@bTa=PW_D2SE(9d6av{#awYGzj~*N6Wm5Jc z)dx2}OgA*(QP#Xg(71H@YiVH%9+_@f`A+)B?kx_rgubi(P!=ksr@{bnzCjP!5= zvggj5+a9BLfFuwnfGwu{N}0ADK=k|M2GGg0)tGezUmsq116{V_P1^Uc|AEad?Z0=% zs4#Ug3i<7I8|Xl2PSajTGyr}6q9fZW!pEH03;-T6$NIQfwr9=pjnUP771C$#N8G}c zz|Wphx4AMit#AWyhC}HO7u2J$a`iZqdv3DfFf!7$xV!xmSl{CJ z-MTiC_gtpamYmRnM-k1PPwy_kW1H^W6WZynXjn60Gv`iH8u5|_-BXHdF5~AqD?-ZAUwwnmB;lmc-trMEk`>V8ae@Ia}mr5TPnU9VVaF$v_h10=1iI zljg#B5+xjMxp!WUAe%T zN633*kY*Zn20R?3G1MU^U%D+zePrX7$}dZ`Lh;($h$0!lXe2xJ8@0flr#f9{{?RiU@CfRfDSuYL8(yk{M!ByWepsbb zQ$h?~FciG%NNfj0br1#|8yF6?8S?1)@ab+OR~5$U3Xf||4ll)RYh=PI)KYdJckI|_aAgbQA*UG4xM7%Z92L^-47?j}hs+CkO zXt$~|PT&0K_3PAIW8d~VCVTk^4*`|e#S_DF;N#=cPok=q`9oc5I>Fzdi$SL)8EcQoMfMtW%T zgY9_)Z&G&G*Q{-AOBRPlKwPNEXyE{a_WP1s{`)`VOR=mrs(9@DmM;N~GZIilpj9U> z$|`)qP$m}{C$>G_u}fw>VySqEYSZ9+hHg;GCr9vzJO^-9yGJ?iiY#CFhc5i-&d7oH;L?N-vx@ zO&u%L`@!yk*`C1&x)*LewC1@-Y|M{Oqnp_P)dJo9Co`&2d~Kk1%9>8KDu;jqcca?19)X;X$o1*NB|Y07re6@Th(6*;ooNf6Ta z=bc!U_lVaFh-9M}vEL1vMp|n0&^W-4(GBna0zKA5;qrz#wfa$zjYcmAv`c8#*Zr|P1_jAvgb&iARsD&@0E3bZidmQT-!9oO&@mq?X zjyv(Fy!KJm4%_CaHI1{Le(g<+b`GK=8y=UhIG-qk$DM8DvBsm&tb?al_$k*t_Ocy9 zA?I=&r)x&AH|*)iGY^_xNY7(Ugl_GP>*){Q`}^(GS-gw-IG)csWCl$H#pvgv6OV4c zRr!%?Z*D>4TUNZ0UVi#ZsjxQ{$I_gVaZM*A0+|O7ifJrF_nA(UQ=6lb4EBRTucvZi{Wq-tZaZZ&4%)o& zT^G{Xmz+-4Ti1f(`pD-hEodTLM=U&|833B!PLYi388@uoSlt9C($WSzp1b_qeE#5; z2gd~-BR#bFp%zTXh^+HKR0e|m4rKRBIpx0Umk7|_am`h^pqS^)AN+I%kCF1`J_h*6 z?6vNS0z2`CoX_P^T#}t*Ph3cEc-O@lG|o9G*5sN;DnJH_ z#QbyJhsc|0<&5-AW!Kcmrk2m}f(4l7XM0@1)MQYCsf9FrE|nBKh9J|Rz(o`A7|Y-N z%SUkM)dP+`Mw$eW&oXsWS4VGH@_R?nQ%{c4p50xqi|Za295vncVsHX@fb*}9=;tzg zgwSRRPKNYp6f#Yg?HxMWpz0uxcT(w8#v%P9m6PEMfEBR4bZ%rR6=}S$^hA}CHO)kil zWxYQ-TB9%BaxZ;;%{{I25y9izu09vDDl!0fhU}V*TD^MO21XzAxp8o__XOnyLhx9! z)@QY>Y{aRm*RT55=lqn_ND(~#*{aK-I)OfZ-R-@=?1E)yfKhgBfv=yb$?A`H4Z(#{Fsxt$_f zb1d8An$Ar90qtC>+eB=l)A_c_hyC;o+B|RnRY9504sd1Wi_?L2@VC8^d|@1{OljkB z8ce!j)koSWRs>w{TJ?JkIGC;ZOXBqOmV19Pq2B`>FU8Nu%x{3=oOvBcTzKNK-PBqt zWqeD|blW8cJcf4H*&A1WnD&M4yX!tW>yopeiL6Bz5Gmw=T5R|6QUs6hY{28pgJzL9 za{qeWO?2O#_nCANKo*wN4Yb-IMP>GqM}DbaMT%=7jTT^Ve~bxbQ#M!5rN1gaRH~SK z4w>h^&sbExWgdo3AJD;LS5_w!`Y8I-jDA#&N%vSF7hA!_NT2{(DNG-F6fhYiqy)RK zcBnGvw&Q`HLV*V!eT*~-AfIL0zJ25`jz8(ph0|wFpk!QoD1hQDyR?dyRNw+K1cFai@X+AtJ&_8wj6*ez@&GWGaU3{xcG|2O)DU`Fh$~UC zLX)Ak2*&t{LA4Ldb9ksz3^c1?8_V!TR97ZGt%BcrPZ&f-%cUa*l@`W$HW;p~Lje_a z6lhTHOgG*5^>)2ur1+i34m=u-onM8Npctg=(?r45YXB7;Mc*+RBRxw&w9k&SZnl>#Yc5(A4wfdL$%jcP`xkh=-G)g zMjj)0oY{V_v6GM0*MDJLpV8=cU-g9Vyof;?9n?pK{11`lrzxnyM~tMMy5z)y0|Ivg zrDn(WiRpJS;wV#vU%&hu<*CPR6a$527Pw!Je{T64)4H};SrQXELhfF?cr>FYj24>pmsvoAe^-gwmo zxrkOjvTxl$8`gcBo=u8iXhFN_N&^;~sP4ih0v3T{@d*teoTn4%p)C&;X(D)B0+B}n zkNXOaBY2Adl1Oj{lZpHhS`t{RoqUe*mKW=M<@?^6))032-+IGmX=7zmo0vx3Fy9CD zx&@K>j?JtRSqQ*CKAKfT&dK|)wj8y&u1w6=fH-g>h$_HTWdLhIl)k`5Q-!~f^U;kS zS@Ws|TueKVQ#hJ12YE={LE8^&m1@&K3#Tb{Aw9*Wt+G45>){8@cOQoleT*~-AfH8Q zcU?VX+NxKcHQRi$W8Q-4G;PKR<2}m_&Hq_4IH*<6$>9S<{(#O})H`dlS(=uHs)CJWC7^(0@2pjB-AsB*|H@Js(+K&Tsqi=ZTru#av$>O*bx^$k{wS_% z?!>aqqubxB%a8NaRS#sl3dj4jw*ihjA9(;;G5nulL?0tf0?22PM)yux_o{Pew^LVz z;?&i{=gYcBFA4gaBG=tR=zvvwtX{82NgN@{bdgBc#jS9M!C4Wx594M)MHG7douHsA z_*ijx+t)eQzhpJL&q=IU>$n{Q@;d^A`Zq=SF zr@mSb9-sC_G8q7F3Xpzb9qk(DNO#=wUHbf*4LJ%I!Q<7dE`d!=v@BWg>w7LT6Wr*g z^i}irn0t*Onfy%EtO1fk97rK-Nt`lf_m&{UvK=<_`ze!Lzzis z6Ac6j=v3ExQ+H<~rs=%^K7(O)j_oek!9UESz8ucP(N zUyb54SK|>FhbLs2%q~^-sk$eSM_&^KN2s?<65DO7kw;HX@A)aDDKqwZ2G2WZj(V}7 zWYT6I%KWtuGNKsZnoEn3e$kW6+?%)YtK!%}@;&qQv>Pk3gZe;buo!_->lc2^)W^;5k$xU45{)!K{uNakmiZ?7C7S#720X@ zD242Z8wPu8@2_*&C?swy8bKykyZn48@-HBktwT<#eWN@Hi)e$CUI7YraWe zS-X+;j{>l3b(}B@TF-EZ(t-M5to4`sLyOV|IoUbMWfMfpk+ZTNKR!Vb$Os-|K=T_%B29)>-A^`fgTOwnX-cWMKsS|3TJ zHXJM}k0igQOLyO0Kgds?vh?J3+N$LH#G~5|7(BLR+zIO-(a;f92D8MTb!USHsxo+t zk;e=k*H^(~>~m*cdUnIdIr&=WvWVRm;Rx`99gPiNnAVUR9OUfdNe-GN0#)Nrru+Cd zyZhENQ9VP{xBgdrSbxhUGZA?yLG-ZkV^amPzv=Q(oNdWmQP`h!?c3OGTS+nUE598F;X*6vb z4|p>57~?&I^DZ4cj5cQ@1C%E!fD#-P(u2>oKPm-&tyvkotT|(#u0!oUS#XQfA4Cds zDK6yaEXY$$mQ=X5K`aBNAcUI#rgK;|db!`E8JBR5DmmBI z1qPRw8qYrB;(hkLTdUk7V7%1<$4D)BTq)qOdn&GnjDYKxk3QLc)?>%hyL%nTBb&%& z+(|P=Fkf=wk?rr?!w=~=u^PRnLY$pc9qEL+i9yOu<;JzMF_o4T1EYOA)*DOIE(euX#ItZ8VY*NbglBa_&vvt$HVA9O5`!6|Kgek;I95A z?JITlME%kIcI-RdLI5IxH|vtB<2s%-nEOgEX#k|t$oW`!6h18VIn=|Ua@wlrkVqY0 ze6KySnfi_B{E69gCF$bMGgF0;Jh5zV+N9YFrJDU5_8Q2z`BKO%;@}q>(}W_FqvER0 z;TLRslCRO|C!j6NNdhDfGI=1=x&}P1Tm7XLoSd@sl~zuDrvyG?8*Luqw;yBlQNUx3 z>a%Uca@)wN_D1V(JiO)MM(=D(<(*8It@!=?%(fwc$4D|wwjDSKPHIBv1(AcIj|M!p zm1DZ&<7MQr1&)`T-Ta+Jvkp0kZ2y)=+1S3p!HP;>Fv-*|*tO!UYM+eBHNWL<>;71D zpkpbZCzwUK0*;~GFo(>{x1@-= zJ6H`CuQcs(82HH_!R#F78~^Ky>u#hW(j_FU0q&8iaPuumsd2FB0ikAYly?kqSX zTIS8eUO`KG*4Po(_?k4jZ9r;tJOX1N?nF>8~W|2EzAV;UyK>9+A3jwr># zt)7S8=S4~dh!2Ze@VNZ!!lD%RMH|m%z!kldbbL%X5ufmwV+IbC*S6H;WpaW7?{xjq5kIAg<%R!kslk?S-9g zYIg*K3l}eH!DGxTgU5zy;PI>`;&|@zrDSDP+8GG*E|G-R3tkP}Sp#yN*hTeaxr2b+y^ z4sW85nV^%mrx=YZ(pc9%kCImepj-o%U{Fp|5pW~f;4&rPzz#@yc^Yd0wm(OGWS$r6 zmMbTR=-B(Y`2ma}xLFMDLh$!k89{*OqMSJiX}g>HkR|qYVL4=%mP@_kj&w?=Pl4~K z#tYsHMUH{$`cTpZ$fdg!OdaHYoN9RI`XA9<>;Ij8o&cUF0go?eqJ_fyt)JMiPvEhS zVwv&p^K0&IL1g@%BmxfA?;sp7!jIkD4_4&X%5~T4q&ej7bMuW~n^5o=BNeYWeGwhE z_((eP*cY|!8ov|RP5ax~0_@lpU%BNw^wa;fi3GP<5ZX?Z zA?!_Z+sQdx$0%R~j}b&liZ6cRz`$b{f%K&PTFy1HSH5%oRlXm49`Y* zHoB%R?KQG}c$gGF({cXtv&YaKi3bEen7D6rhX>p{K$;aJJr#A>Ic=hxAtI0rlTK$P z!|3oMq+G4LIPK`88s#lMrPp!Ufj60zhg{qIvwjk3; zt4>z;Z1;JNlD@reqXCZ*WS+ZxNxOd3*t|fcohPdLaTpa(7YLjymzci!yqQIXZsA2hlJ28OW3P4qG6 zqMbM|7Gqpy)gC9%m@TNpjN9L5cJ1UHKmUp5&EcA1ZJdKN2_Pq!_U@gs^0e2@ps{8B_BLmJjU|&AD6mWx1~nTVlWR%AB zt^I_B07e_Fpmt}{m@Wdk*IxWe`kQNRY9h4{6nRAu`p)-WY(VxG8sK>AIHs+7il6t0 zVAiY|>zGO@oRc9Au+a;8j)OI?x%lLkSD`Pi`DV-Kfl!?OYzg@+i7V%&>%c804w zC?6M++Sd;m2HLP)hZWI_;PEXhE~4r%{XnYg8gmtN*F;1hXB<4kcQvpz=p0g6H?c42 zT};IE+U^^b(yq3>FbYG+I^LIK%Is2M6BAj#fO8&5>(_iGgU1No&P$ufc#pu?EpQ6% zyYq)bZKt^7D|j}k9t39u$fKTz&YYy4M~QT13byW;mEshx07=gM z(dy1xqu2C=`eoLyfrxuNhXF`Gr5pVn6kjRQbWY=s5fwft)|sJSVS6|q&Y)bMNg+=) z=G12u|B*0zDyLifHOWb?S@MwFPQHOmooA}tuwK_Gs)@NguaqcF0=@@Z`w={@Xu#v# z3?6C1z$4O~4T$_v1D@XXz6+a3U1g&eBC1Er(QzB8v?&#!J*J6MSL52jVN(Q9mtFO0 zI_=!!O`q!9xC9ORX-i&S0LYkMj6CKxY4VJ_nC=gFj1+fi{k?a-CimOix4;1?ge1wN z9+Nf7$-zbN_|>)FK49<|Nj{Ze2|W%x8$0?J?|*CkCc3-%8zvpM_~>@SAj2UJ8W2^1 zf$N>^@i3-a9=G_#4S0M5l+#c3^-`5|a4evPLpi%+7=(RE&8#0rbC4)G%F^O;XXgZb zSF_uJHGp09>)^zmcL@TieKUbxXLEve4mz6!j(M4Xpl__blWt$F(@)P^_FCO_m7JH7 z8ZbEfJ?!bLr!0Bp0K2V@bw6Rh3K_H@ZD^u)SFL&nOz)%#i9ALf)O~Vfew%mv&3GsE z0gSE+#}@P(>1og7y&v3lUj~mcl6vL)-UicJx#kim&?2X2pzqkV{#Y(iA>UdV>LnH* zRsoXT%q$R2VYPXC*|1Vf1^QBd75z)x$DrWNrLjeEwpVRijYfTLLZT(LMyx$y;2HyU_RyI>tr%qo=6GW2$asp}Z-jS8BYNC(0an1|p zO{HnmM@%{^Bq-s@33Gjzog&cSod{lf);PmN)eUT%F*O$h*|d3tTc`P0XIlBU5jZtY zU82$e)cC1s0#P}r3v%Aj76gC`pAVt{T$wsj8&p`yDK1o=l{DG4<3Osl(lt~OIdw(T zx!j;|sFUo!%7qFK6yr|5yL4Orariv}b<)q%xF_J2BNblU#t zy%!kp7^kgHGK=*&W_mlM26-(&!bAQL(fUmT14zd=&Edj+S(zE5>t$8DwVNm3u{pKXvZXBSJIu|zCw^CxB*jYcK zZ#VUR(|a!KraDts&P^Y@nI7Ey5FIG*5g^9DwjL)Q+kIZcmCwL!rv?>H2yh5N>tqLM zy1p5Cz3GFWZm-0(j&Hc?qLLwu@{#y+r2RgnDZLT#ue6Vq14U4wKEl92p;Xa#HS9_? zi3&T%_WoGq3lBtuGd8lBLf1G1D&iRGYUWMTsC2t;=1vG!6@@0)-#*1r3O_!WRAlL|Nv2j?fFT#&%zX8fZOBPE z8GWMCL1k0-%o1tZ-ZffI!{jw7CKIR*wkd%@Gr$>nagAK#-;|KwcFx~(GM4@nic?ST zy5ooRqfHMT5Kyd9bk^gv)uWDmLFOld$Iq?4o1Sg@*mdjMMmc>6g2+%9FW>N@`@I-= zyLam+?jHKO$J3UaK$l;2PV1;=4nwFO*RL_%`>ieJ{#&m;kB(gQLJ|l5dw1S{K;Tj6 z$M^oc1&}5}5b}O-RPjcHMQC!)dIzH~cQ@d1^>tsMVbDxy%aXkOkD5DPdL!Ncy`RyC z-~Vqz|5QtiJ|5S8zC+i)kyR^BeffbbJ>EIanF4(j!Q-D?vn;n={66E_8`jemD=w-# zk5zIGBNGfJlJVNQ9ax7S;hU4!z6t~8EENt;9fCJXYrfq(7%pW)q*vI>yf6tSE#GuD zthv9f0pgoC{iOYUaLXg@lu7v}<9W-QsN#~}#gb{`y6@7buKSGP>f(1@Kn15TzpLXc@m*dH{daTt8u*4ZDzAj0pqbp z(3~UYq&14(w%BvupNzK>%3bG)?3B(9JU&PtUU_57M~pglYaKnI$EZ^wyXFa&moyu| zSQHllwLy;_LcfmP8e`VS8FK=Gv=Q_ob9>RVZ|wbom*9-PIwV*GmRT4R0meC6$);E{YQ!m>oI@3AIwP0l?u8731Nl)Y z8!4zg&!|$&aaJ5u?-e+5-k0jGJAOoWuKyton<99O(^ijMsNgYfu=DExk3t{2emx!4 zfTwoqrXQ?miS1!we5@gq<96!m>fugZjhp1Wb;VNZ)KRzVz7-`lab{$-8+M61AE?7^G z(XIyIbl;%dKoddBR=h#9bYe=|6eU^tDjGBQgB=Gj-7tKJ=Ex*&`Flgo>!ZVu}YPBO*ts9y&ZA8w&wd&);zCK=9Z_6px_!ixzah z%{j`1CG|ycKZ6boj&z?^aqTVFM&Lrqz&+du=s$IN_z1t~{_H(+ zt|{rDJ@xS5d@X15QVCsCOCJUhX#z6=KGH$Z#;6uj1BJx+(?8v!yRH&#;gRWoMH5Vu z0CEDTi#|>>Yae6u@dY{hh(;B`l5q=3x9>)kZFBGn)P&thM~v`V$pe)NK&6C=VHg0E zYFsT3`PVq!1OU!C743aj9`b;eJt>Az)ghr$ClP$^W|il*N%sPSanWnUm+Z`@ z(ci!7HFWyYm*+GOZ2cwu^))vQ%@KZJ>o1U#PIg2<-QY{1u<#zK1OGq+9{+aLr)Zee zt}|mSRvFO|dA+OGyT>9Ji|a)raGZ!~jFDb*$tn6x&MK+g2gkcfm2~K?{d~tQcwDs% zz+<3KUjO-au;9cqUh2vjM5e)el4xIvsSh-2TBEj2egBg_XN^~K?8LbZV1~MDJ0<|& zwo@mA-BHx8lj0UwZ)^Hp1c(oAez*mF5ist{W;GEMzA;7>A^!)rK1?54^^qd&(q*qr zrrtD|wuhRwY|FNMZz~Ox;yS+e6DI_Nt;~bx>zcdivUjErpaBYq9tsh$X zkphIqv~gV~cqAkUBS_>#*j4kCzZp3!I{V@?QkiAH=_U3jp-kW}HXU) zCCksHMR7`~*z$cKYfr$iWchZoK$QERG%^A%27t1y0goU1pC4^^Sv_gV$@zW=5Ir2k zZ!UZ(m+PvE5lI?Q zZ*)Eb6vJit-AQUv+3+T?cPoh?_{nzmVSeYVvG|yq7@a zrwZCpVn=L$?UYq(5bZUu5#hX0vTQ7Ppx~T4owlP_Xs`j^Pg3xhfWX$ro-^Q4=u2zA z+is|H)S?%;zCo3?RjR$^&kuRm)%cl??$a7>x=^yNx=UT^y*6b|V!LBewDtzo8lH z@Zi=*>4D9Uw(S>z>_h@aPk*}VE$t^-3V=n{xkL)C(*`$!wy&R35bzkMREmDTZOzv* zc#Je>-eHah)H8b3Z}ee*;mk!zwhbAe9l7ubGJ}<%#|g_%?p>*sQw_7?9KQD4ueLXl^tGe_nFCEx*X@Vbs z!UnSG^W8vYn;Mx_ewoM~r^HSjS(jM!ZGQdm{)6V{xREEh^p#sZX)cD*QP#+2JDE6@ zqVoYdd>MFj&n|u%*F6%i|8M{4x>fWn(IkKzGF@=No3A?cHM1Au+Q-A&=%YGG9iciz zs);Kjen>i7m1>)UZI&LyS;}6NyKKQym93CYIPp+XeiD6DrBst@cM0S>^A>`=N2H*Q zL5CIP_Y}fhDX2o`)p*s1iVUs<7hMH@C9NtSChHbb<=E$>1(ptuUJvG}5>Sc)iZslP zbKbD*RERvrDAHqe-8E|`Y?|zW&`lryI$gc;QZ=sFKP!gN+KaA(#pvTOH_nMuS6_R{ zD^@;FgE zwg8u@Ehk14BS4JD?e8NKQ|5T-(yPu*Q&%I^<-SmnL}LyXZQlp^)5zmt`S}PQzqtDA zMcUG$^mNQY`WAqj+O^@YF0#Oa>^7dEUL?&dj>k8YP(uwJ2iFDe5z zrd9DWfb3+@KJd7-0gh)~dS>^1Mo1gde`HE4+ofv%Gq+t{?E51jaH1+n*-td@?DIE# zo-TXOn+$lYJ_9<~=5I>O*SU6wx!6#L{EUK7<5$wvYlF5H2WdhNAJ$$IA^0twUoM{m zer)tn2fMtvGUK>G>{|fk8`5TRsKL7Asn6(IG)^@|7qX%jM@B}%Xy|sy46NHjrJmCQ z$C!ECH0M`8xR=5+d8XqQo-*xS^eoaOfE+S4Z+qpzhfSp?pX_=`j6NPZdkU2Xv?3za zp%4F5s6QJ(FSz`>BNfmN$PNH=NC6c@$Q+;$8yuJobSf3rajF8~vZ~o40eGs6l(E|( z79D$8U@dwHr^@BgJ1iLU*N5z@GTMxx4XrscgGl<R|+usj*t{D3yK1XM{!*-?4Wn z|6lh01YWb^xDy2$KF77|UfO}jGf3u8^gQlM z@EB=JSGGBc)lfEI7!Iv+Er~qtOYj)!>(|}V|Lxq*#$|kEN8J0UGggdB?H`=&Ee%n7 zMv{1We2)ET!d7z;L*Q}Mkq3_)hlATDyj*pLe`I*))}0-oe~1>6PCWVfM9x4>JRm>9 z7U%{)W<&bEFZO8eE9$}H75`K6Y-gSG_#;oyM>qU$gWkdzzN+L8e@T55oaNgep0jab z56_9-ziON@Q)A=+w~(}{`>YN`@EG@7zVq_8cYStrsjC1EXuq$AXtZ4R>00HX`BQ6u z^;YiOwu5fjcuNN!-;wuXHpaD-=>b=^aeUp7A=gC!?5O1T(N?vn7hXKj!}2As?hEZd z%9#@l^NYon)ON7p!Rbu52yEmi+YnU&^TEu2Hgy;8FX!b7_R$vP8Se|p_GZWiL=evk zr^fa`P}s%x_SdtrXJx$4Uxr8b<*7S=NdA3~fBXyB_lPt>V_Gn};M{kwd&$cWS~Crv zy%j4L(V|6G{p)~nlh^QORw7UFS)W(HD3`F+eF@AWRYtWN zzs57!UkYWyM85y)6`%P9@VINg1COs-cQT!OaeU{a$kQy>oybE%&0q{t)&c9~?I?=- z1ON30-madZtvc@s$>dFa*&W=&4V%ALF|p z7nt-r$F>~h4?mr~hGtK`7J?oxSVD+V?Xx;r?D-kc zH(*zmxgZRLVj@eQO6Rj>F0j_6%?3W;O+7twm5r4BrR_hvo2IvKE172&Ou}v z1>l3UUIcl;rVazvinLV#V-cXtzGCI2Oi<(_l-XGX5K)=zL&lN{YyoBj;4L_;2*S*D zk^EpDs>7yhQfR23mX0GbD`B8ka%EVvEp`6Ol+V0?qDqQO=6~k@rW<|);4ygx5j?J5 zb3_ML52k%VVH8>sFcV;|5y^K(GmuIi z`#sDG$|HD;p2q~TQcYjI=3DgD0q_`Uc|L`bp)RWfkSpPS#Q1<*x8L{^T1Yyn14DI~ zAA-h!Q>`K~u)V>$zf%N{zqR3C^&y}=bJKIRA6v`^atkb{P_cgr(fiuIiAKLtP4cz*1hx4)h8}{ z=dN8kVh>$)0KE5c=o1JAtFC@HkRZUKxZg#$Y#wBJda#O1nwsvr`(Zlo-Di}!y>t7n4w(I24~m?B{N&zJuX+Gk`2Ad~T`%G}I-nRwjyp2z)>V#sRT_lV>qI1$z1gM~%` zcA%YGM=umb@VFYl<2SFpdC>D%sy1fpC<2*P^x3f9iywF2_ETC&dRhOgp!s@U8(Z%`> z$6)m~+6@>E>&O3m=7CSmFze+@>3i_h#dmzZWbI2zzA)0LsL7;c){~DLwi)9sw3{44 zR2~Kh%AR1iZ7SPkVoPy(-lp5#cQ)Cj5==8xzt1Pfpq9Om$Xd`b54Gg{xW&L!le~m@ zFo;Rk-I@^dRkvCZKv5`;hQegG-}h6hPF(%Ht2WTnL}LKCK(u)A#5-Sj^2$S>d}6v> zJM3`mUL9_Yah;Q-nS`fpc|%gd6w7A@iU8MAQAWVP{zDp=Y`Bh+Ya%iBm|YVfw5QYn zN(F##@!~TTWoC?IEH^ZGYVku{_N5hDJ76BJkekM`=gU0s99Uaq#V%H;cCiQ)-;^Sh zDW~&GSjHuASpAHEZ%^qB7oE}p$kVeT63^qFgU1-cDYTFW z`^-l7-~DI@u8y%|ws_iI;{1El#vjr`(y1MIT%O;xXF#OWPUN0*8S~wj9UVxB-o;cz z=nu4suj+`v%$&p;sGO9#uSoYDgZ$E)rEj0h;4y}*#(j@%ax%}6ndfA+N~plv=+}6> z`?3o%cue(vXXEYk_g7y}vlEwk`kcY)m%1&^L*P?ou^z|5LhpY(dF_j|UeT4#;H<;_ zLaii2F`M`6@cbS;UeS3Tk2tt=Yz*6;&GRVq(zWRzH1R+J5-ViR6X@t$*Z#}MG9y5X zduty*#aBT^Ox!`I8PQieaE{I{rWnU(t9aFSH1+<3RWh*I4#PEtXRm1wRX$cRX zv1J)h)>5cJ$C9yYLojO3gu7N03g9mFx4IagQ!&=ySwcI^^J2$;ZzlKrhHTQt_)@3j zV5r8=iL4SkuVQ+CBj-p|WwZcUN^MbW&6K-_w%`9#^SX{M!N>mN@BQ@#dKzgAAQy-x zh~Ia_>ZSC^L+M1MczDi=l@cNBr``}Dcw}?E5VKh!^43IMQ=oeFx8a2p!x<-+0k5#; z7hp1J0Yp>_t^#Cy^AT}ztC@Isfomx6hW4on5;A>KDhYXJGlu?wz$tvpknsi?C7SBj zFc}tsVw=cVtygnA;&)A4WD@yWhzLVr^njz$BW`qkqbQ!V`p);Ich&VPqrK-bhON#H zNFz{u;mJq$Am-RLhxdQ-+6v(*8fV|X=^pyxHQ(9iVDkQZ9_ayO7@<&wBt<-Zbs_20 zGfyf#1F9_ls~Vk-LVtDpKOT1ZOas|UL|lg_e0k`P?Z7NPQ% zbqr|`V|*4n_tQO)3Lf&9H$S*hWn%Oy zt~vSm9w-WEEFr|D+lTd!;!+QhbTliNYk(RW9`z4yetd4*D`dHt2Ki%(F64Vwq3U-gYN*sb0cR0BzW1^>6n-MuOP)sy9wQj&f#OjKD6T$X z6|L%k;)(;)JMP+mI^?`dXzkfA>i@oY&CT84w`pHd;+tXhH1krFmQ}9zb)amaLv&9% z`55y%c;zSd0x12~2$8w=$t$n#!Q&Zl66+}M&%Pi%OhJF6T>IFcU0c9o94oKC@a1&Y zMK7miE7D;faX;jT|LAY``-7O~LlHE_{f>UYBvECW!8i3bp!cPc_l;79_GZ2H(sc$r z#@Cq46+A}T30_TSBc{*bujKC%_0f>gaY5rd8^2ErNv~XYiZDc=v1}qS2tzRPzZlNN zm`!qF$JYH5JVtL`4<7TLNAZ?jclDR)fxG7h9%C8HmM=ASgE4TKDm@d&!mnKZwgePA zpc5BK1P&M5UHsKqQ8d4#~mxjR(UiVOMNm1?IAWJYzA*Xm4$z6yQE9Ghne-29bweD8mu4o zO%v3d{zS0oZVa;BpCz|Si1ICbFSH`0DUV*t4TG(A1B?zoed zo5OPsJji+aRPB8<8rK6JYv587G+MG=w=#v0Rd?Uiprg99i|xWzpoSL`B?`BT zmpTIS5v&jdA*W^6aD0By_n=^QezZ;L`Kg&8 z^yZ6S*`E~qwd?lHJJJ$B32q$baZ$~+=zaVVEhHU#;t?9Y+Sh{ywrWlh2j)qmqR;fn zzrLQnzv-?XJih0$H&JO14)QQOUiOCKGcTb=L}o(b^#9afe}#T>+kO4dxHt3S%g*f= z8VC%c!;U(*56P8u&t!@Q^?4WnGQIA?)5|q6NvSz^)ktKQg9ffxQ&v3{@n63;?c9rB z)A91k@;io%{>_GKXg>77-47Wk;CX7cDO+g9mMWrv>HoLkleCZ&UrTcOx>MmwLx<+e zRd}8BJuHA`%h7=6{e>d%i|=_ntn>60{om=C|KqA_>E`R_E<0mrDX|4kLhO{IjLrxg z)5)c3^#`vv3G_Eh*_N153xaN-dhem#gXZQ@V@gGj`NnH*pi4LWMn0IQo==$FSufP4 z+)KJU=~F#>eol)W#zuZh9~3}dlGKr8CTketT}zgTEOL1m3d9g~`x*>a2bR;K z0L+(bg_Yuo)b4V1HH!>&Sy;xycBiTkP zT2V|k@jkk~1=E)M6HK;0@H5_V-_MZw9z1Ti^uv$Sen4XYxd61{z(wyn;+SRh;C;y` zKlqSEv}7?;aE8CC++icG26&LS*nvS;MbiZ;Lzhs9ppotbU28^$>WeAE08G5#jM91) z$9W)ws)uHO6k*0~5S7a+p)3sn+S&(TWx5yz)Bu!hz+G8&UB&cJD8Q+OevxsHqw;wLC%zSvTnqrJ7@iC`ahxQd5qw3zOOd9ZPT6fZc-7Y z)7MsBErymf_R_T<{l_`&&zldOv;MUv@}+5n*4=LAS}?|R66lZbXM1)9Jf_f7)%DkX z^vfN1+=KTrf=V=tvy6KHt%Ysu{_;Ji63Wx_rGjc^g}`O!vBRXX+1GU*SH))Ouk~LQ3-) zIo1)K@?pd?J{C4MtUsJ5SLFAT$9lKl-+3PQWAGSh3?TQCV)*LuFIax|qYqD&YX=>A z0FEvo9#N7Nk^0qXxI7~qWHVwtxS5Et-B#Iac@?3IYuuN~mexr?PdG�@-$%M77W} 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


X=1uzZwAkw(RsAyk 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

+6O%ue&b`@XxG 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 Q|8!MTdilIk(K6!y04H?-EdT%j literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/Contents.json new file mode 100644 index 0000000..5472a49 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "hot@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "hot@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/hot@2x.png b/BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/hot@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..086356e07038dd97111a0dafdbad5695770ac2d7 GIT binary patch literal 2717 zcmV;O3S#w%P)9wfsbHYuE2>X?y+A_UxTxKuY?sl&9|~ zba-3Zbm?PlVR>6eF!h=4OOJQvdhklo|EVm=EcX)GuYYp6>$?F)5+sz;l(zMSP#o>} z#XFzCCl;ztODIb+#~_g>6TqNAm~D};Eg=FSn}pn~_YCNrT{UT1BAZM17t0}8K(%ZV zj!hEPN?4Yj^1~xrx<`&|=XTwkBn7MPO&)@G5a0S;Uq9 z{mb%;1-TS}Vq06PC-Oa*StKxj69&9HAn92ol?1C8e%#aFy?@0ud>_yv%Dez>h9Ms& za%g5yi5dmy!IB6J!0Tv3 zfXpJ28v&BR7t2Hg|G}yx>A)Ae2I_u&i+RMN0K%jyTeSOky>>mDefAV?NjEnaUXa`m z6VkE?JPJuOI0iO}TIOIyn}j#iCh;XUl4gMHz6N(7kxi?B`TJ#dD)HL=cYIn8PiT%#s)h-zFajuo&;&*RU_M$MyBUMbqlN(8HHzyp z>9LaD{y_VV$`nJ7+_mqkcQ&2<@n!E<3jwH3Y+m-czn!5`Lx-t-ZB^f6;UJ0IDzKs$ zR1D6?vqTsJQi zdtlacT})cN+QU@~2!*{OW+K*5;dYVFG57#xY(Dr-f zhY(Uh{TZiyz5s)L_Z3gTG7WUodDZh9+BWLZlBS$z{7naj6(6mI`$A~sgnf>I`DN2a zVDUVKorZUo=3xp)TzVRQXW4#{cSbhP?(Vv$=oZ`IY=GiN>x=6`-?x+ub3fbIye94x z>|NFHXJ8Tnrq#S_g>hi8GFJ0Qp)s-Y4Y*1TU9%WwJO?zn5|Rp!zA@1JODdH}gK;Sp zbu^?uOSjO-+2JiNKfe0Sy0X8TJj8-j`eG@3vo)3Ib;ko`p~&V^1V&4sWgm=`k%I-m z>QL+XmO-*F1krXEB@lvx1$jsqr= z9~h)|91}!IuHeNAt*{0uSGMN%(yXLn2Ea$}sqfMy3=9?4?DRHXJBVAZ76wk04O_U(+T@6+=o)GVZLoB0t%cA7R3Ajb48_aQ=@eCD?Yb50cIIw~&Is)e)QE-qXTF7FRVscMC>k+o0>BbjRT_XY$mr8h>LgcOJ2m*G5StsqtP-66 z$3DuZKisGBJcs@c+D4DgyZ#_elbIO|GT?t+n|QgqEBqo-dE|WYca?mGQ89~=IjxvA zm^2M@rU4{TZ2(!gmswVO(=m$PN#lRr!13fsA#_q|8#u#$?1UpCzIW? zp)U9Qlh&x56j2t;;U8^REF%;%$|=5s!P8kjte~wkW_56_a0Hg@dzGIG9Pu!#e+B1~ zOGHy>Cz0q5!AHR z1W;Hm`(Dwxm|XeWcAAyZ%=J4$eSCT5Xlr+2m!yoKM9!?9C4{RTONqm*0iac5Osm-M z0GyIWq=jv!h^DM;h3qow#?-uf%bvWlTYg@M*_#1yu9QF6wEx}XW1fB{RL}!v#9@GW z1Inp2GD7^z1-=&IJ!cmoyMrAAvrLUrEe6ZLc>x*2v`WH`P9VDL<@PW6@y9n!TPYUJ zUHt0JC%!#;daIqDqJ7xmtVkkQDr7t{{|#YAIDmq9Z)O5mD@DBbF>5U3I>r!z^^ld7 z1JzY5i_D=6-R3{y2c3(9e9x;-y?1(O2Q}Hy?ZB*%0aC?$@fpN-jUb1fiOL|(x}!jd zbqb0QhC+wAoW3ILmtt^|Zu66Kz9;-BvaX)pbFyG(`{V>C1ULz?={Z_Ci1=EijIVN_ zSQf>n1@uH}@8P(bRx~j=e)?NaytLu_FZ}g7-NK}|ns`2i2NJa_4&SqP|8F|Z`=z7Q zoF<)BCMWb>+>txn;Pz}sm^paG&NO^j%!~l=hB%oL#NJNx;FTiH?EvNcI;RsjbG4@BQF01 X4(Ptnn#YfG00000NkvXXu0mjfoT4X{ literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/hot@3x.png b/BeeReel/Sources/Assets.xcassets/icon/hot_icon_01.imageset/hot@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..aa7b8c88081c2838997333f2496871a9e5f1482a GIT binary patch literal 4923 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Contents.json new file mode 100644 index 0000000..5c4d3b1 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Frame@2x.png b/BeeReel/Sources/Assets.xcassets/icon/hot_icon_02.imageset/Frame@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0a51961d5cd83d7693642f0e232893799c272480 GIT binary patch literal 598 zcmV-c0;&CpP)yXK&(JI5Pb7R@}&q4T7lRBR$xl71ndB2obf}l*WCqT9vc$I zFVD~JX7Ao}-vRzRsEiPwck2*z1Sj3Qzow)|#@>OquvINSqYP8qZ z6B>5?aQUKl2%>#R+2o6EvlM}ToSi9rnCRT4W>p2q$2vJ#kHG zu7WZqcBz4z|5Llux}Ozfzk2U zQiRgCib}C(Cty^q4@kv*LynZiqr{;5-WvUSmXBBt*iN7(=zNu}1h4UeU$Yuj5yTKH zQ*BKqu|?xq=Oo$b?2Hn8Dd89&#?-&|unL??w0UzGJ3l*~CW#)Nco> z$)2Jc<_{EsMLeWF_1eQ+0z;ykXh}krMoWXD%JcKWnHhHTP7Pbix*CcZY7pUZVXkb@ kquMqdqx4Q_K~#7F?N?ip z(m)hFHyJ)g{m2q<1;7e~6^yPxT!Bo<;NTC;kIFz5xB`b2h%104;0{>Ad`MZPCf81f z$E4GpbOMxRmFFXb?oQ|A^treD0{`)kflv_K9<)GIf$QJU$Ln10}5Uv522W>jBq;q7DohImv0*S&A=t0Xyu|LKdMc z(`mu9lB7o6g_z*d@|g;<2qo1qL0Ot7>*cOz^loD1DMzn-T%oi*D#iyhah-1dEU4dC zyyM?w&S3}=Wy$ygHei~H31<->f2wvzOP4e9w1k+-nNJW_G`d=#6fEWauzP11H$?%c z3RxVkf@nGXz}wyH@T)XSO#?(rZF7uHd%#G8ROIbbSc2QPb936@uQa+&6bFv_LZrbB z8ps0nY|YyWDHkfz@t^C zgrzYuq1!sn{8x$SVAyS%D%9F7^r#!8?so}7QVBvMMv7ovH7JBUg-jz$Y3=bt?%W}% zZPX>JR6CIKEDsqYp&cn1<}!hKX{S6LHpOIB_-}^CKWerfJWK1`Oj6_a`|yAkX7L4V o@f%HXy%Zld!6}fZ`aA@G04@v{S)U%kp#T5?07*qoM6N<$f`e9KR{#J2 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/play_icon_01.imageset/Component 1@2x.png b/BeeReel/Sources/Assets.xcassets/icon/play_icon_01.imageset/Component 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bb06bfe29398d21f6f2be450dcddb0c6ab121503 GIT binary patch literal 1390 zcmV-!1(EuRP)~fA8H3A&rC#N}*Lr>aZY$P@SQ{u+)_@Q7LVQmTpZXCK$>)!~nMHR6;Zo1}RQM?(Wz3d(K%-e2y>v^X`xRS?+XqaxP!}{=D~l z?{^HkOaU_qVLeMR#1wFL0vVdG%Ie|^GH21| zqq#|Dmi;{MOTYrAlfuC}(q&W72aq)yoSpXL(k%rf@rE4yK5j1C3cn)mD`3Bh=i*1i zrULf6crL9(^c0X1#*nl5u;0b2!60w(k<(s@g?l|u*>)ga9Wr?u&c=e*tp*ExY^CQI z;7u6N00KWhA%3`9e{Gk5LBzevh6VWtWf&PXU_5yU#tsidh$&mf$Yi}Mi~765fy+9@ zTe-akE4QBPy7qqNFw9;&7FHo;rKv&_iL85}W`Sz3Y-0g5ao=2r8_R!q-Xrm5FTO6t z9D@+D%L;2rWXQ$^(8zb+{?+u}`qM2X?&lxp;o$>cGb)|9R;Z|1;F|qzL8tqEbm2$e z&xX*gYgVW%kTP$Whb{Nbr^*^vZa+~;Cj_VhGMy*^<*?-}M1YlBYjExAFDiZpO||;I zL<=zU?t(6<|(snu%#i}wT8glC!%YUl#08oo(T&bYA zuKujzqi#q$jvP)w#Hno9Dn61$YK@O_*_Ov*QD_Hu{CGY4n-;g0<$vkI43iKue*g79 z<<`9xks(X)xR$NRt#8T%(@PK_$sxv+iW|^tVl5z9VXuj`fK$^iL$Bd#k4OwTG%Dc3 zx#Q4F(eETJs|KyFHPxDX-XtPI*M|(EnGWP1Qw7LnHI{6CdK#pMk z6&x@xmAniQhTL`LgV$i@%n^023yxq4+PSHWF`@)nY$ff4C7$Jl{X#ivQ#y)svlou3 zV?dN?%dnVa`EtohlNDwl0+5Sdl5vhKFGytkyGKVAFc6$2Sz*mUhzTmrHH9&?z^>lJ zHvTum?8dr=C4Ql?^SDvn$*KfYZoHjdlH~<$OPe(0SpR$fY6)>BZJh$tB1t19%zZJENyFr0SaYd z%^Gh8Z4Ud;QJaIypwVXkMw^yvB9rn5w&f4?l{?G$@3+;<*P>EY#I32m$jpgyQb&3oHNJIrLl})%o!Dq*wE3{Q_mCxM w2UsAVJ)uvYpjrlIP&rt>Hq)$07*qoM6N<$f*jhC;{X5v literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/play_icon_01.imageset/Component 1@3x.png b/BeeReel/Sources/Assets.xcassets/icon/play_icon_01.imageset/Component 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ba60c83271f617ec4de9429b2fdd2667a3f88b18 GIT binary patch literal 1957 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/play_icon_02.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/play_icon_02.imageset/Contents.json new file mode 100644 index 0000000..392dbd7 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/play_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Component 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Component 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/play_icon_03.imageset/Component 11@2x.png b/BeeReel/Sources/Assets.xcassets/icon/play_icon_03.imageset/Component 11@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f460e9bebdeec4d7f9c5f8debd583658694ace6 GIT binary patch literal 1183 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 N002ovPDHLkV1gbHeLR9p;9;7U0bOvtTf%K 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 T+AI-#00000NkvXXu0mjf7PY0l literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Component 14@3x.png b/BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Component 14@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..197caf25ecb66212d0221f2ebb4c4917674a8039 GIT binary patch literal 2897 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Contents.json new file mode 100644 index 0000000..0e6f35f --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/search_button_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Component 14@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Component 14@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/Contents.json new file mode 100644 index 0000000..8bb64fe --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "奖杯 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "奖杯 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/奖杯 1@2x.png b/BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/奖杯 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4f1d1e922e58cb1e1421e595ac710e6db11209 GIT binary patch literal 2611 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 Vu17UUjjR9w002ovPDHLkV1gs-_#glP literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/奖杯 1@3x.png b/BeeReel/Sources/Assets.xcassets/icon/top_icon_01.imageset/奖杯 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9e31d738791b3ca92ed2e1caf58f829de78cd2 GIT binary patch literal 4558 zcmV;<5i#zGP)zGI>lM5~Bzf2qb7VqG$tFB$CzzwZ$~GSjv*NR$HMzS*k$Fu@?K4>Vf5X1+I(;^zIjT&ZG2+abyUO;mnw83}6p|y2uoU_cCUV8_-gO!EMWm*u2%_)$^o+!E;O#eNXZIcT^;l7Qw92*WQfQcRhE-!6_--Z z;WJ1xf}g-!EDhWzH>lOVMf%4GHRd20CGSI(=8j$mD#BavI+tMAmRc9Iw_8Jo6FcdLr|$0)j%boD6LQzK=n;%%Wu;JWcC51cBAxO z(<)tXR(P$0|Ls2l==vtW@%Tj1VUd=h#B+jV z2MA%)xVWQ1NEM3U0#!8zr~xd`+noS42sm<$rZ)4m2J9eUVE}XEos-D8%h8!7evIb_ zjCtTQjz5YZj1A8Ta6L{mjW9aQk#2zLL8PMVStDfYf$!vg}4WHSXNm)V}5W z(uR2~_RG&TMFzekPVMG2`5J}n2rit}E6JN}oECD9)EI(-u~6D+%Gi-T^HealI!S0z0Ytmc93{{Tv$sW`T8Molu-02B!&;H=gliySF|;dWhA(m{3D$c zPwB;!VK6AhT`=*MXz$v7FF+hsn5Q*hbuVhcg6mMl`*rS8fKWOD9z4hwNe13GmY^r% zBV>qJf=K3DBqvr~pIPS(yJ0KqQr>@nFL>(*zH8ro=M7)xL(g$K`3m*CF__5NI~Oc- z|588AGjjs|_o4i!{`M~GYmjCE?ivYuQ%Lx<4i^l48%vwGYeG?a3>_8b1SwQ^9ydVE zl$lu`ZMgHD00RfLY746eS%c`Xzz~o#q|G3G6z%x;csHuB-GTOX zH9-B<%DF)5sEN%v%_sX^mwm!H(OFDZ$XFd&#-3O%V{EoajQ*1~rs zZ}x^dk}ynbDGI`-ZlW3T}q& z_L+RjBqSz2D+xQsG2(ELX?4h;mURHp<@ji%-$lmARCWxtBk@~wnsg=|GA>hEMk5MC z;g}k;Uud@M_o22CTS;+XMEp2Nie@F9kc|X3-i8=oM?x{Z%p!pztv$60 zPx3pfnIN2*)3

wD)&0OQYy02__acI?6R)2RQi|)SkmoG^NrsZ1(Y5cb)Z)E2JNB z(5*^hB&Sh#s;U^wZTJi0a87EFY(z8G4_n+!m9)6U|1&`2wZt=p1=2u~F;s>ub6}3vN^PH3&qfKGd>5;aoSQ#SOz=f2U{)AX*o>e72ivtEnhP2g79&kg$a_ z+66HFpZL2$r;~-k!PEZ>s&0x8;gw`={_&g!PVoCQ`h=(o@MdYlWCheXEsXQEHKAFx zv$m>sg(_OSJkV1o`;Q7q6{&)nj^;I+*FzPQ(T`}T z_E1{emu||AT)D+iQ;_uW{;_TdMazHmBY3+$8DdnaoR{X|jLwE}H2lUOvv~BA!=w{ASnG?V>(rN$*PHSuYGL zzB|(M{>L|LD7uL+e);!(m~MGx0S7@#t}E`#Csze(TwiU2k`=RHEm7kcr%dt;b`i8? zvu}NC;EaFC$3AvNbb8{ky^-{z57JZnxyTM<%H`V6{a9>NN_x#!XZQ4Pr+-l`_(t3D zC>gVOTUGll`=8n5Ci=RM^*-PG3e7t)FBZ#LKx>L%g-Jlla9(&tP^6@YFI(J~jB
VO!>sY5UmLl=Kqsi-R%0u6Q_M$o) z3%6nX{FSbzRJci*^b*64jKeY{iZbn72_}XG1#>jBBp+@32w`jvBfle<)`u{e2%*VD z+CdDy03?OUNfrJ^=Sx(hFo6o2@<<1>;?uCRb)BjaY~L|Smua`Hb#6ZSyZlG!@+q5( z0W`x`fK0xO9&1!50x>MIL$#%BhoVaRv60R$ML%v&4r?jWG6@4Im2kjxs9A#=)3Fd> ztWQ^E$wAC7PGABwz(r^Z=o-deI6(izfRziepeL4~>1B6#KP8pz*_XKqsdr!>&`x<%f7 zkB5C1_>ugxc{5lTB}iKvh?{O0SaRpqm3J7sXv#P+8HZ5~rCCfor^8a% zbSh9Z6_T`J*@7i#XW`XY+8w}z7Nv>11iE+#bVNL& zG9^_cSO}y+wq@{|R7UepKHqP^hcVnmF^dbgfEQ`!qddB!bLo>?=R*6109Fo8hD)kljl^<(v_z3@J=#)g@3&JY)mjM)VO3bCD)sRtvM= zv`P@N%TyQ@Hl^Wwg=G05ky$_5{`?wyp>0b~sJ2~X(ID$;=~)#xNdqxE62_Ys_L5*` zlq&oXMX8pCD-(Y`ZZUghtNqz~4tLEJta=Pw_@J*pb@fM9uW#BV#x0hSA9Czk(p z)D3-y54((7vSY#xXj%U$qhh2JEb10doAFf|``e$XXu4r5g zU^x`%p2r&Ax8gmp&+Ya++rpi#LMSR`TSSzA^~v@9C@&uJ2~)q(o;^aDeO0x6=!x*P z@A!*}qfo~CRyr;gu>TD551XO!s}EXlxP#D2@`4kpqh_&=1r7Eb9oQLmtRMf9F^@(4i_NVAhGi`l(bLpf=?}eJA4frnSwh+pr1kD;_QWj2TI77KnZ5F z_Hyvvc+vXAn?LI9023YHBFB6Jmc#e@{Lok7pVz;K+@J3g^%#jbI$2s+v9#M-{Ows0 zjJoYG{pNQPo+w_6fj>q@L&cH>Ec>_EiixK&H zgf1LP8|?nB0y7Oj|4qD{nR)%~=ag#u#MI9+LB(_NDLyX_cHRIp;+l%y&lL>8`mBBp zLd~Qp86B z^z?QoH;IyxR9*vRlLnw;t}~8Hc0@%u(5&;{xXbIFm_uR7f~M%kKVI4vT+_jdF&ZV# zo;|NlLWQ~ZoSar{eOox|bw4EB8BROlFgCJ9u)tLa0D}9;!W=u->VZan zKF^)V;%NA6%4I_@1S7+V?{zHx*N;O5qhi3{+_q`$-~Ih{M_{}kkqu&+KdGfxEfgS8vgdraRjks-PxN&FSuNF) zsCO`AXVUko{wTbgB|&O{LcTT2dZ{ zuv~vj+f@a^B?0OWtxYVC8!jPYISJBT;a!!Fy$`nE`2O`(PjXj8lv7eKf(LdH)VNdt sONQAxwIU?**n!NAo4=4eT*=~p0MSwBoW~hH&Hw-a07*qoM6N<$f>si_2><{9 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/image/Contents.json b/BeeReel/Sources/Assets.xcassets/image/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/image/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Contents.json new file mode 100644 index 0000000..b84ecd9 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Contents.json @@ -0,0 +1,50 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 11@2x.png", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "bottom" : 548, + "left" : 350, + "right" : 136, + "top" : 37 + }, + "center" : { + "height" : 95, + "mode" : "tile", + "width" : 1 + }, + "mode" : "9-part" + }, + "scale" : "2x" + }, + { + "filename" : "Frame 11@3x.png", + "idiom" : "universal", + "resizing" : { + "cap-insets" : { + "bottom" : 806, + "left" : 477, + "right" : 238, + "top" : 80 + }, + "center" : { + "height" : 134, + "mode" : "tile", + "width" : 1 + }, + "mode" : "9-part" + }, + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Frame 11@2x.png b/BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Frame 11@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..07e8e1582f5ea14fbe262cdb979b9693d3ffd1d7 GIT binary patch literal 9006 zcmeHtS6oxu*6#xK*ahJz76e5N3Mf?p>4J!e6a&%;sDO&nizJ4if^6I(dN9(7iuB%0 zAci0yNZ(2m2*H5B#*hSo5JP}`b7k+ZJbVxL<-Xi|9{9QDT650P{{Jz?oH5?k`uz4S z`?f$3wEcpG*<}b4XM?}|P5%IIj>)3Q;GfNb7S16MwEHOhCwAfTkvZ^EEadX}vruWb z>0znmtTUWd`K#)Sy1v3--yJD=-OSfs$*l$05J&sL&Jap4{)W7a~n)3&` z`%&Y!S$!8ztRtV>ZSs82r<^?V){I;7A%&qM1|`@L*V&PO9JAeEa$mvypuH;hcx2N^?+2Y`u^z)s2Nz>QEe6r%@BI7kzN4nqH)`fm^X z|K`w$$IF;n>*4$&Ts2hi9FiM_#RX*_~PDoU9uI z=<`Y{i%goETh)|_5tsmGMO*$!sN|j3mw*YETWa;SBh4x?EVXsBXeeuG@TqUr4xU$_ z)XQxOAMWs-^wWpQmr|&4$4KRm4qv|=1%^jNFDCq-MJ~P38^yp3MK08ST&`evWWBlN zJ|zZ%)X=vrIOK_G;a`%bhQ!{iq;74bz{IvX=bUuBNKLWgujR;&_hgQ@q*P8v2|W}?BYhRIBues>-5qc5oFoYHd}3Lgj9scMGyH_^ z42l|}UkVtjrwY&5>{JEH?fG4bDLfsAPJKx@HIR52F&9DSUl(%el%Z}HST_s2vK(QA zP^zsMo?lHg@BQ&;MMVl|mf;-Ft&#oVeZXf}yJ0096M##YnkE{xmFeBQ0(bF<*w!6#=_fC*zDChP4X&@tWPh4a;Vu-h^L4e;znH zdT&~K&_o<+aK`#q)KkqDWk_&T-^&q#_*SwBS#RM*;{}b9`Qk5RxmaW6*XG$&VC4A}wjayWO9BDs`g>0b#U0 z>@$b7$U`D@NKNx3YNsmh4Fsomn*N2T`%z!R5+|z!A@>6Q0%L*RZTFT@RwC?rt5MaF zMC(BunUd_XG$Idgk{`2HKvq5|532&6`%_HV5d`h7^$@h{57*?#Kq7f{=^-o{|1(LO zlNU1W7cT;`QugdSviN);EVaE{Aw(+<`F~J79%I~mSDZU+4@Jn3pTp)98iyHJ&QPqgUjNtCWI z@LcYBxUj{(aJ|0lcpVKZY;QK?N1b2cn^Hyd#L*bmbobzn)jGK1ZTZz}Bv`zLVHr?I z=`iQj?o1xK*yDCXj?bkE(#POPq~uDmD0$g(Qwgr}c@md^a8EQ~df@G9;rA|qfVu_N z4LKK!pIY+}*hMYS>1)*#SdE4l?Ana^at|&lv^u#dUpV)0%wT@#^M24ZNV++j9+%Km za#X3u3X&FWA|GG@^DZIdmw-u{=RE{YZz!_nC;kSi=FGR(J-(_Z-zx5A>OMBI?7bX5 zT&6E9IGjycvHdAw^lSCnXAdVlPz+%Z@soCqfc44=x~`Sz8oyN88|7A=d_hn)He#^I zL;wprGlJ(9^5gbiYP#TPxO?*854+DEFyDNvQ~l+ql3Ani98z+BN~JF@1GmE9^!5bc zf@gVu&mhT9u|{~kZ!?Tg7lkuDMpe|TkQa1of$E6f%n=v^sll`~t5lLrwe2v#A+vhxg>{1bB)G>r1ox3%57-IBZ>#gXLI&NN>y5 z*Duib=CVcz_DWwxmFrOER4F(6#SD5gcR){1nmiEX1aJM!I%Im;#DP#MZw_c9dD$7S zoA6r&-R7@Bi0;h06ur@1Dft!jfVuN#Vu0T(%M^+TNL0SDAqIQDTFfNK7F{XORrex9p5 zhgz1_GCn@e1sP8azb=nD%APIzux%lz_Py^#*Nq*=*6+G9XRj7>P&~c*u2!zQoXrEPx?unwAZ?6va93EjUA) zE@9ZyUq
!oJ>w`=<3)>>|u_tp#0!|;~(XMHp;5!7#XL! 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 CN=`=r literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Frame 11@3x.png b/BeeReel/Sources/Assets.xcassets/image/home_header_bg_image.imageset/Frame 11@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..73d769caa40ba0a1c213d12acf2541e4a71144d4 GIT binary patch literal 14780 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 b*F0g_gaYF(1?1 z674^hcIf9lYtu5@#y!1R-sPfs+a=SNFSqm;rZ2bS7eD^N{qyIan*Q@IO}FD;|EK4F zS-PLM<6m_9Y_~L7dHwux``#aaw)$?zKRDXjF1LQPzHQmhb|0JG$n<`HmWk+RzY=}> zCiI{GzqL!t-pCMY*nf3u40AvHHm-X&pe{Lpt zERSc2PRp3}lT9R#y8~ojz<7J(;h5>n(ZSiyC4evv{9u>cKUN11r4GY1$P z1OY%EKze4PpMLPPWZDb;ld?wJyR~rx#NI!&fbnj2k1cdiN-zTh8${kvSIRIrA3=jm zQqq!u!a9h~!64arDS%KkBo_Qp&I7gNr5`Z|pR-j@?<%Jnb1Y!|YS#Zxa~YU@@LDzj zLy+a;fIb3b1O-=?@#gLbe?bO#2aXKD7$j5FJb*z`uI#%F{=ET$`+$_KmTw=n z@=?3B)2~^U5Af-I%QTsJ0L;CE!r0>4z#$75Z)H;%Wru#0!&4ts77Z+b!~(d;Cc=SE zI$=KPhuiR|Pp8&^V9xD+OLr~58Axsw3yUfzE5|6itisk81cx{I$O#cKV8MCxsrBco zY~h~;j5o4VT#Tc8_|^dgTuySZZ+u{akV?Ah(3oQHM@%b&bcyCHv71{F zl1Ev?g9l>Zmm#=N`Vs%k`X`p=0ENpZ2gQ<7Z)9@`kC}3~k^|Tz$-p33XK|Vb`apl< zOtOURf%A|`O|JAo&k^cH=9ZE!cA;;I0?+MvG%BY;^$zKjJsAyA&_D5pj+#5sg! z5fmT&qm0px3m7kMe3r`(3w0gM;3+_;HW<01iNiGe?X1+>Tq9QU(-O$NOsFAOs*f@fVwg?tX@J zpp5Ief+^rPkx@bcFnT|)n(lzOQh)(LvVifzHcI+~#AiHk8T@R6n-9K$6u}Z0fWgU7 z_rV+)H2M=<{fetP*(srhr#*XnIHS!S3_b6n%yH@M*`%QP7+c&YpG51RyXI(<5QK|0 z5~b2fkKdd%zDfTqV7#jF`FXu0)8foh}dih9z!+nf4le~GlIoX>z{aZTu z7!muh%6)S0;^E!~tQ$Hu3-|U3L6Bn(kYi`%(BBLOcmzs9LiO|w5Z@MKyteVPWk4G7 zc#&&49`b2)c<(jpK7}W{KS4QH0Uv)NUkwCXo0Hhom&kyCGnY=;eYySnaXVhzS-#b~ z-P*Wp6aZ-V5}LK+6(;e*uPE|O>%5qM(LiwV#f6&!q`y!V?|^7zYv*+0 z`yEupSOAweWS$~FKwqXiYqS8%8&WT76-soA0$(f{{mb1Q+SuU7%;Uv zg_GU=iYujr`tY{E+4kwWSW6}Sjl#|tyUD07p)_CLKI8<5`71hqGrYG^*y0$CN}r;= zxtIRMVvHBHJMP7S1^DDUYEqd&j+OBgY4&Y@7vd0sI!2*(j6z*4dUVy9?INMT>5k|V zkvZAQ5}N_!vYA8QK+)L3d<>OQ&O&TVX}%VF-}5NG48{6+jrj^Gfaq*t46=anYR2Dj zZNemnYsd!RkKB_^-9V+KjM9wG5b>Bkzd)__$H6_&o#;e=J2XN>0P?RTM z9a!Qn7|b9dJ4B&OHVIjjsQMUeQYvP%!SA^qI-{Uy6>EgnWRyprF6tZfS7-wu{z@&y zW(lWDT*z1>7BJe}#kDeqv&Og17`M;Y1&o)pX9n*0g`$q^(fNEmIame!h;mMpY%xfw z%?F$Tqb;>y3(G41csn*g#LxEqV;g?R|ki&#@FS1zlD7_gFLV@ z{6(L$D9VnLcMbyZCv25$UoOsi+-&Zm4cb^W>#T9B_k-JDb8t}l7HuypF_y3}aDbxi zHN_f@>X9guP`;H9+4?C5$l+dH{(;;MpmM&V8- z<#&+keD5VHg$oC5IY?uTuLh7VsTO0rj{R(E80z&w&7x0nDHnC%Te9kNm|yVu3O4rG zjV*QnM2|rE`xGr=bWI5*)c9-h4nOF%Z9yQqFe_bFm&2~qA+=n@KlKshiTMy1>V z$60TbQQsD0ypHjMi~JqmL}|owED}oJ2R`V2cZNw|^8zuc`W~M3bx^|LM{Ht#MQh`dTZ*dFT{nsAE%JER2x>Z!QZT{yk!<14_yWcY z+tW_8oFhkvPpF<(oiq5 zga?THiOPe|;im;82nYks?jV5mPh48mn+paqP>RW>KD+I}Xy+Ger!hk?#Sor##-MS{ z75tdNg!#UCky0P9RtlDde3*Z+<}u#cCPWc~J~H&_8mlkF_GKa(=lzb8couQm4LEV` ztYFJL!oM(~w39v2$I$PE$_%it*+V6g1B7FSTXJ`G&Oc#5A)#PWPx5D|vam*^_Qn$9vh$HO7BF7J9x5rhQ|QFS z2q6PesCb48I^Q&agbtgYC0lq1HXU)|ly2z+gOlx#@=H407ne-7Hp&5k0NL5L&w-bl za!Ea@b3ge_!r>;$_d`U1P?m&TCt=%IUAv^z+gJ>@DM;MKhOz>FhCfYJYp9%(eA4Sc z%BT7fBL_7VRFje%+t9NHc%))cJnDxJ_*cSKon|px`k?( z*(M}&V+JYV+6>!zbV}9)-#genqB#AIq~_K-IBPN=#2xOK+aQ^+h7Rss9S8lM$tVJU zgP^Sdgr)tW`!okX#@J#P4cYefQ3s!*E*k7La=k}y&fAEIJ&^#044bRPJKtCLGhAA& zW#?~hI>J##9h~o;dH6~nU@_Sz>OT<5r%Af`8!nfELC8Qw=5$Ac90Sz{sr2|P$~M~; z2j1iEVA%6zq#limmyyt~VVbHo0x9Kvm)t|DvPRBjT+Q!j0P*|*<*2ks)(~{UDJ2yTv(mdc!sJbPY=#M(df(AE$584fPWF2Ask;?(pO$({o$Bbvoq4T z$0mo_EoTkO%BL$ubjktI2KDB?fMhjdXi)862lMXIXxADy1P64q17gFs^HNI1I~SX? z7RBqVIX^A3oWdY+=>=YU2h2jj@qNsit zIleErP@TU>U&BDs5d;3mo>5hxypsxw0erZI_2vCVWpTm5WoA-G!CSz;&hxsn+u zXt+l~a5ylA-9h%ff*|CT?;PR)T8!~p_K+OL69YuESQ5p_0?hdpAH*)Nypr7p>gI#g z>)q{JeV#!FyYCj>|E`O5p)tW8GEA95n{c+VW#tCIWC(4SZSF$BklW&fZ{hdH=RcaW zQZR-~DPRoT3?V^be`ajQnQ=`oV7!t&$r|Hx8sjq*0I^e{VTJ*v7o~)<@U8m_Dz$Xb zI1suYFvuuzr@K4Ri9}}$4#1dn+7h(N7`C+Bz=7+qbOkNN4WKln8B?I_i|u`esMHJ~ zz!ZLc0prDNij85gqjWm3h7G7GYxuxtXbI%j?t8-e+k7Ug`popMKf;UMMP=5zN2DTLD}@otmZGB{vM(w1UUtU` z5gYmOL`Ej@G6Zar9tR4m@KwmbA%>3K_K$Vi@Cm>^z{&iO&GVEQ`kzPcAgKUxwos>= zsBCJmae#y17)#8DpMyY3`5%TU;IKSrg$jU_SoIn&V7#KC1Ug)!6V@0&)PwiAG*V!_$|b} zWruN#&&n7QjBy0Sqr3%-7qwGxpnoxuRH~PRGInca{3=&}qc0;zaF|~aX5i4peOimZ z|Gl{nvMUROv}#Rm1b;KnzV6g+wCoH$)Tm%uUn;I1F9jbNCJ+T|Qa8x*3{;wDKh!4(@yl z4_5^PJwd)QVeH(NHqq;qDU#BnD9Ge6M-@d7_V-3z;Vyt2yl=Te}iqDCwnMp?t#NaSD&wl&=J{0how0s zmk<0tQ_kr_NO|cf2Y$*YUYj&27h4=sZ3I@EnvKdoq^+?zY!8j zHH$mFf@??2rr_{pBfAe=^&d6>3S(5M`wLS22$V{|1}q?_v;!fZN;Hc39wy=+XNse* zVNyyEBopQckZ^o&0pnflCxhb=bBxg{Z%p@=63VsWcIisVB32E8q{=5T`Ba_l<5B4D z?=hrt=38t&riO0wyhx{>2j!QPdNcb6n1e@fSjrvpob7H`vJ5Dzcp{V7#M! z0vs_fg5YpYU@FlnuZ+p}7qpA}*r?{aG~RmC%zalrZGU8p>@@lw1}=uo3@ zu%k?yJd5>D208D8v5nOnHx>6bAr3jDC0W9|J{k1l{)EWMbzY3|_EtbJTyhZH^En9T zIW%v4M*CJfR3=U2(5SzS7rS``@VH>hnI!wo$qb`^fk-VkMj-+HefEB*g7Ru)0R)6R z1k3`)FJO~#Y8NP%q4zXbaM+-d7_@eQXmma7jDx1aF_+x5K>GsDG;_$Oh*AO5iFKyR zrx6t?sib6cwC6tpsH#&yq#psGpe#dnZ2{vKvB%&b8$4`siViDs3H%O3MkZY{S*|)N zgxm5YK+>OZA4C{mQ{`X?lu^P6h^%Y8SJY859s?w{xtl*2;6un1$ToI;0pl04luzRY zn)@9-wwP_NTS{p~M8{CAeZL!92@QpEtgWIcKpeQUj=+q9Y(m zw5l+PmMdizFn&Qph8Qmea3u73O!S4!s?y4Rgb^V)=g~jAm!}-;b}2vsEQ0N$Ix>MY zC?=3sf<4H7#qxSe$uwn>00);m|9xahsbAQ9Fr2Xm4#07uFZ=))Q4qD7`ySR9gufhI z;f&jtQ}Rg-6QlFb>F3nOI9rr#Kk5M71Or6AvjQK0;^hMvw4zeKwiO9AM1S|p|A@83JUWWRo&0vdiay|eeWfTL$NCA%sl`k(~{027l zJql=!(yHe&tj`q!pz!ISji{8)RA_kzgtuetQ1C-kz(SdYT|Q~F5J-YSZz6vKIB7Xuyoi&0*gbuls)v}VzVdZ%E3f3~aAHuePji!LG zlNl%^=_PJ&0pmBbX;{|>#Ne2_@6n5(ys`o4D{^rm;z4RzNH;18DV2cH%7l;0f;-o@pShmd!028R)M;v4L~0lR}9X|pVGxp zM8?)lA>Ly%00{`hOx@^%P{=H+fvl+m2&VqeGu@X5`GwhL`8+u33mD7L&H!@AAN&tW0AX|~ zpZ|6YG=SqhjcEN~{}1PR0p(Qb2O-(53BF}BJM%wAfPnwevvGhGkVs*QV3nQ(aQT-% z<7$ipA37|Da+By){bvDV*}0XO>2d)9f=}Z*2htA)5Q;pZF?_{Qj-Xs-JQ1~}5g9Tq z%qRI&K+*nPz*zRso(u10hCpGi-Zf#kH>w#lRMZvUIqTS+({jQ!ONL^TsMZ3;vghmo zf_v98qpb8DSY*u4(*(siDvo_f{cg#6 z8X1$zGXKKa9LNI3vY%u30CM*_Fo|7vI|JI2-8oC-*`4|pFqZvXdln#OeDKV%=slF2 zw|{a{bMAm*z4N{7pR-2*@nSweXL72d$BaNR6;U*|Lc(U@TiUu?37}%O**?uYeS1fk$L91A~|<2s3&HseAwm zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZkrl|D?djqeQo;E4&ci_IaFK?KyXT28$a;vf zXepF1h^ok{tUR!g`2|C{1A7aXkJg9R3a=b0`PbUCIUEq)vinx`xih8`-SM-2KKu1H zYj?%suT`}H`{!J>Tv;5F9{5~=LE_RXzm>)D&)1#vyK`aYH@x~6{+wwL!KmG=uo6eBXH|=dk`tFDIJPglXJ^c1-o&E0r)(kUNm$mKB zk^UFSV35w=e=PH$JtxDncS~6RYcR~%y|}FH{<-(IBD@Lr!gPPUW=QyE$HJh=Vdo&! z#6O|s0kewY4+hV{!{yUH$bMoW&^>(Lf$lpTyL}x~!%pih51G&0FTGx>Ep2z;k8bvd z*e$FxcCHrt{jHZ*K4G6%@86=|;y@{zsaDJH|8w}j_-y$V%lmRqbN&i2obg;){L2Ka z&~Du;8GG^H$J+Qe+z%_YySlSR^GkFS|AzRe2i|jkTa}mQ-D+QT?^AaZzfU0d4d0xm zYlp(_Ntwo}{WvgX%8fbB@!WrY3)duYMcvWQdZOPvSFk1_M>TFo?}YD9xA`Rayse3Q z!~Q7J>Oh27$KM4k@)FM0o9)GZCt6-&JXWCi?eOM@%+A$cPQ>f@Z7$*q~6>ijraK;VQQO29Z{s=Mb4sQzF`ryAP!|rnVo>i>>&okWEyE`G|Zq;79 z74iG8SaLMnwS2SdoaMg`yD#|%mNVR#o4rv!{`$Wa(f^dpqU{do>12QKHdxjE`@?VZ zM_LT`?oYkp@4Wr*GW*m2W6}i~-Y>plSvJR*H{L$;_I}0X591;q)K0Nlo@6iEFSqu> z|Lw1BT;zY$d(AC&x4eAG_WR*~O7C(l?lJC*?>w6p-{e{O?P2EI-c_4<#ETl=U!GN{ z^X>ALz2BPZZvS6=?mXj%{M+Y0#c=)IvRCTQ+JAcUHe1FVdQ&MBb@0463aC;$Ke literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/image/text_bg_image_01.imageset/Rectangle 49@3x.png b/BeeReel/Sources/Assets.xcassets/image/text_bg_image_01.imageset/Rectangle 49@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4ceed5dd1b234c11dbf862542710c46be431d852 GIT binary patch literal 2000 zcmeHIX;c$N5T2kB4RXA46#@Yj!Ky^GwvYr-AQWhUqFhqok*GAS1q4DoxD+g=7%bIN zN=qU|d9hp)UpRuO1W_YK6DV>ePb`Fx0HT!$3L5C7KX&)q*_nB>-|XxZg@*;2 z;_Pt%U>Y1m-3MSqMtFSnDm0&0{n&z*HEBVyOn`M>hJgtv+fGA540B(gA6%6=Orp(7 zhHt1Zz_k*ScXTX(aZ)hVH}W`U=E-Q3Rm_Ky(PQ2pi8H}^lQosngS!w(tKXw_j<(pB zf7GIW&!6Jvf}YNa5s&F%3yYxy`os$zmuZ(!c7!YJ(2YnRhEoLbM5k6Mr{!W(^WZ>V z3!%gW{&wZ0^IBK~1Kl2LIf}o+@%E~Ts5tpOEC{~Xl{GS8)63NK#F}uQKDe_AL{5?v z$0wg0e{Mx~&lo8cV}Kx|b9k4Pw-%zS`ivNj2_yY?hw*TV-So}$LJFT!lA7hu;Z`cu z2a6nlWG){hP`Q06Wv=q18<|gnJwI)W z;Pq2Au^2e?W=DT)p{&jb?!Sy!-Z9i-1b+Gh`;$z z#2fWWmxtHo6+q2WcC1Fs^#(7mN8+85TxIQY7yS@8KU&(H8G=MEfpzyM4ZwpBU5JOEd*4p0GBtcTg1b9XW>%DAjW?TI$lSsnA9OP$2kJ6HcYV?j$bJ| zi_%I^EQl6|E99y;w8Z*zyCbe z?ve>X!k3*~s9DWhg&!OYaOT<*?V_ymGnXbT;x9?VxElBYwd=G}6*w!&rJ4W_1 zKGn836;W4(FAK$pZ@jALzPVMD--Ds0+OX0MHR1UI86G}bN~w%Dl_5j7!1e5Qk6sLo zXycwSZ}MDBMGm|+i#Av~!i0Dy`y3+7!`KarH|UsokL903;qYZG)_5TcD}KzgN)AE_ zECv>j{D$y^q-2yV4;H7ulvKP{Tx}ZKdB(v0e#Gk!8{dQfO+vrF<_78*=)2%2?-djh z$XBq?*R*NK&zvVmC^K4sMVaG2WLU-7l}XjAqxyEBWzDnc`>m3-d*5QG*yq2*0bdvA(ot?#sM!o7Z#LrYWm~Tuw z?u=*4t~YBZJ9X7W*(_=fPdU2uIiY8zWI8*&%m1zMhJ2FofylaC)PNy4AdGs|k5=$6 DY7rAY literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Contents.json new file mode 100644 index 0000000..3458710 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=Default@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Property 1=Default@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Property 1=Default@2x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Property 1=Default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..50bbff7c6850fc62208af340511a428080fdfa78 GIT binary patch literal 693 zcmV;m0!safP)yg<7NZ3Yy?3$&V0G5~R)Q@FCnu!~Y1_y7=JN(4&hUCn#bhs1;h@IkcxtwCR zC_6D~#*W$pD&m>F>9*79%oWdz+!L{bSb~k76AQV`!j2SLUl7Ga=n(R{e$0X>9xjGN z5rRq-4;OKC8`gt?23Y)RwHhS2xfaj>lYBmZ9c04SKvu*H!c6=zkTvmwAQO8*oI&wh zv8;);vBupBTLXULvHyaNOX)H3G;HuQu{E$*EZT?S`~7~KQie77nAlFyzIh-k;su8$ zXeXy!h#kwa+Hl5WZiZ!mLm7ij)a&&b=M@CABmR%N7CJR98uL1=!m*YTC&L&>n+wtm zW(yv(vw-3ng7B3htW0I-HsE5ma6`%+ObU0TaZ)fbkT%9Z+86_AV+^E?G?5{5&XHY7 zks1=!R8mJ<7G|UdApV=w-^ejGX#$NWeWxn@LW8d|Kb1-a*UItZrbVZLAFQ76EYK%| b!4S$XSk_a%IT@;h00000NkvXXu0mjfz>_Ww literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Property 1=Default@3x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01.imageset/Property 1=Default@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9653c705f83a627b20520ce88b887d5a780da0 GIT binary patch literal 968 zcmV;(12_DMP)HA9cc?G8jr_^ zcXxL&dB(e-larH!(P-43wJ!*Q#`X2}7xKsp@<^5(2CeA*{{DX4>2!XQC%g&L$x-;0 zrbN8w9SrGkpeQTUKlnV_INHQLzkB^TZ z_=%eA6C?F7VD~5I-y+N4+!q+{E=`Uxn(ly{b6k9r+`vNK((}s3OL9ZFx3@=_D*2xG zfZT#6axQ53F_M%^&>c&WJ$s! zPMF-5Zb7pmNkdQ6ttNFQ{6f6o(DSF|Qf8o-Bn`xj!mW04U-8bpu=5u`x`Y1klt@M0m~ zX7j9Egyacdg8s%Ih&kdsg?WVoGJlYRd1@VAx)`s-ngpPevR}yqzQ!Qq83FE&(jbB~h#(CjNP`H{Ac8cAAPpi&gRiIgZGNT7~sO!*3h_0000mY<7p0Dx?SjDc}Yx#f*h5L@3%u z1l&qZ)HX!>77|9{0_MppLn(9iG@T5FC9e!8Btr9TA+;|c@Ni_}=lNSv$uqc*Nqv9QGav?h1*oMEW=X~&KmF{u zBK&8-0ZEXbAg+ke0yrjul4n2Xk6*huB0>qU16mWoMjo+|lb0p_0E&ixb0|`rU2*vV zA>g|Tbw_0!f9;VO?ve$6^z!=U>)GdQ-3RR}ELqE~eZ3CQHq;Dc0}_afENW&e=uAWk z;vgit=GGy9xxs3-W0sFYiVrNp(}n)|ymkeVfxWSrs59s5PObtb0sBO5;{{IgLvd1WG1pqD1BPkhsi?nA~5;18Hu+qhekJ{a3E71aJccQC~Ik6DScD9DpfzCfCE% zLQ4VFREi^4tB>&5D~apH8CYd-IdV5B??1we8S;#kp8;aHk0>4rdb{a#TlebA%E9cz zvcN%$miSr7v<HVlY&eM>rkI^`nwBJd^2y3-PE+tA9vI z>>;1|eiX)qXjgSn$XsrFwdo8hO`+kg$5VO;vR=@?okIZ3j4yB2b*tafP-K}rgoGx< zJ;Z`AbjrLz$upD-O`kMK2|MtlKq}NkBe&K*fsn8Tu-jy4jh$exK?hzNT?H2f%#2L>D9h1xG6Ov98fjb)O4 b#wy`2fPfU7I$x7r00000NkvXXu0mjfT+`eX literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01_selected.imageset/Property 1=Variant2@3x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_01_selected.imageset/Property 1=Variant2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d32e42693eb1b0dcc76ec6455481fe879dd0e962 GIT binary patch literal 1503 zcmV<51t9u~P)aDsso44eQs0n7+yz}zZL#3o9}~dN;OAVhdQTMhE7<5jj^rvx$&v2;1rStyZ$N0-R&gUwNx2Dn zQH~~ONx2A$EJu^0q|61ymZQl@Ql^5&mZQl*Qf7h@%h6;kDHB1)Vx_d)oVx%>UY%1 zYmOh|^huEgR1f-zB&IfaGSUZ)WbbdXXu*--~k7t^Mm3 zqI;kg_-q3?X;s*sRs0Zj^V2m|7Ypv&zs8nC@WqzJ!*MoSS>Xk%E#5k7#}>NBN{*?G zO8lQZjZ;`P{HpIjY^XzEZF9i8H||cfz$W&%JM8|9ryFG&ynG3VWa)y?pbzH;giUy>JC#dbL9}tgLgBL8?3%>9vP6kX(U3fp4KmecpgHK>Em;$qUtlC^VMm zc^X+?yyleG8;6`1`8Q}k4hq~^#^z9Gomt8?!TiZ2GHkOFIaKHTNx3AhGF(y3zMlyL zqwFO0`T&kMI2ilN&Eo>nDN2KD%~9IJc3klGVZDwPeS+MWOfeeCwWAIJ9d(+h1-i$z zx5*Tv@uIMHZ|#JSK11p}j!L%7Z&ZqlCrD-Nr296-m*23#!RXgsp;(_5F`B11-jn1k z@KOlXzySTZ(y5eCpT1<<|2&)M@H+L5#q*%?^1oh(`v;Q4d89vco6DIbFlnz|1t1bN zmi05QEmQ~NC9ie>bda#cDU!blvBmvLYucL6oH=uH=Rc!aO0s5<_!$5I002ovPDHLk FV1iNu&D{V1 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Contents.json new file mode 100644 index 0000000..3458710 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=Default@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Property 1=Default@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Property 1=Default@2x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02.imageset/Property 1=Default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e765a71aa4ceb2ea4ca053b9ce6c011c57fa3dc8 GIT binary patch literal 1262 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 JPDHLkV1gt?6(j%v literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Contents.json new file mode 100644 index 0000000..239b6b0 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=Variant2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Property 1=Variant2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Property 1=Variant2@2x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Property 1=Variant2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c522556260229d86c2ddc9b99863cc43092987c0 GIT binary patch literal 1487 zcmV;=1u*)FP)j}WkH1j# zOI5~1R8?Y$D1Qaa!f!zpSy@SBWW*O=CIIhv$2;CJOCThKe`q7q_8|{Qt4NSRgsgo= z1P#8pK=_NVm8Dd*0tsQP3DhZ{PPOlMNx@hCnjid4auM*H2+ziy%*YdH`s;^4u+KxJ zVLVi{gN096ZNLZ^dIGJ-zp~`0Z)|)Pk_1w5$@zH%LqZMHxkVd0q_8}S@dQ{{(pSiN zu!#l^I7b@KJ7BTt=dLA}U6u0Y@gM}3EcAzp@vcFDkngv;XGj}tWNAl5B^!z?z!~ z^c(dLDEIXoz+t38BFI~Y^7O-r$PN2Idw2UQL7rTlwAJr5GIYkxX_<7-3EX{2y>_A03PtD|dUKkM~XV~(SpcU{eV4+yCa=CbXYGI6oufg>|q(pte2d!wMIxqV^uLO)ppGq%2do%WH_56*jVOX?`(Og9Z;^>X4n8 zIyV59zO!&HYSr%Y*l_^o=qvNp|>LV2>iY zJYJ2H&jmxjj6ydw_DSDcgOMm3?x(5$Z*fj&4W$Qma9AfoVC(VozLl|}JHR-nR#*vy z(kzAb0uS1d>uVd3@U#N6%9sqhag~sbCCUuz9ATrjGk?&%DGF$mYe3Of!DzaYP~t_= z9XISLS3DWK5bAh#h!{W}BjhNB6#c0P)5Ps^tU^SIFq*JVJaJ!4Kp=GLw4taR`Z5z4 z(F1{SGrX6651)T|q@hLtHkh&n+L-e;SBTNNMzakHGb#vGg zx?lo9^)peqX1cP2c=~to#Q{|EI2W(K#xng7Od#doA6w?(>zREh1w&W>CIG8zSp9B~ zdM+wZvJa4br){u>$wDZs>$qcla8+%qg|#G(*)><7y?8@ZbsOgLI4HZ{>;cxUdQsnLED}j|TT!v55z9X}2r5^1ZHqJp@6Ilc&2dvLwkij|54TsCJ zu9jdzz)*R1twPLz=nPZtGlOcIX&7#y<*1HDSiaZ8h?z3cJ@h{dmK_zGEjg1nyz`6l zar?MlLWMgp62h$@$M|WIf8Gs>j!U}^RR?*M^Mo$isfAKM!8J)diwP^K(V^A&-$+p| p)C{Q`M8D!YA1bpn`W^o#{0GA2y<@mr;35D3002ovPDHLkV1m`uv|<1N literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Property 1=Variant2@3x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_02_selected.imageset/Property 1=Variant2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3843b4bec12e7b23ea904dfe39a54105ebd851 GIT binary patch literal 2109 zcmV-D2*US?P)1<*zDL#(w(y+}*GH>vjNUm|=z)W|(1y8D^Lv0SIHjzqDSw z^Pr3bMMQW=K*fY*4k6T)2VV)Xwp=)=!Wb|zf-djY%cSTT5^eHj7ol&E!^hPK@UUP( z^-nyh!w8ToLFZInwDpfyK=67nQaXcgyh4PBd0SR41m#Ig0;;x!TX|Vj<^)}OYfKF7 zj)0g5#G)(<_p&A`GlI@J@Y)_7@XIoc2^{e2q;V@tw^NV-Bmmom)8M*{54D1O|37v79`~5qO&2h28h+ z_U}^i3RUZNJOON8xoZb71O~F8tJ}vVQtAvw2noRa#8s2~M6H(`1a-vmr|id}wu5PR z+4{5x1E6n$#QzKY%_iQ+c;K)ru8J$3Q;GAhd&f*C9h-awy7?P3$? zT1^NUmcotjjwiuga-z1yoKKlV(!?=2UIQEz6uyn`nyD?w*6?x?$q~qXxtiWd4QSr; zN#I1YZ81_PiKOS|c$QvXvxS{sc#q$N&y$KEu^t4GDJB>km@WN1l0m!n&)q;KiJRO9pt@|IZkRv(t>3%%Exrh~wYoI-Ph_{dy8Y`lDcuU>M0-6g z$X5cVha5q<&5Al!14pND+&g-nXy84ux)uOm?qg zZ-Nv&g((BIeW_NpeGL@DyH)djOFs*(sdptv{5L6Wp8_m~-HfG=#EQS*-9(6#8Z%sg zOM}1;FYr}C7dCAhDv~hS?tF`73wzy@qh^XIC+hdTUK{dB{Kh~mt*F2t+ z$7SoJ(j=&vDI+Ic9=zhW?sJQ#L}Tfk4G*I(qBvZH9P+n**Iw8+Vq8N<-#3MY$;{=o zPf)y!;06AH!oKf`zXaNeY3k_Il8WPHi%*bWp@Z4V$+493*`uKIIpx5r>|%F?-zqI) z8f_^rF8E>9QV?k&*}@`g%A4j5)=jp}0`}uSU@F1!g{(sbbQJDzw21l9)~`bi+e>pN z`|&f`4eJRO0aljnlS=5YDRQwEDeOkIu-M;?7_l1LVym%}wQrk)aLI7ME_E2Wq=v7U zNnQ*&P_$9EC`C3v- zC^{rTy}G-R<4xiiKCj)FnpiXo!XF~GNd+T;-ytPnGSpYThgvYraavDW>${J8Qwoz3 zq;4s87o@s*De}e*I8IQzwO|LW6DrFe1@Bra*-#$|S>&dNe63=Z8MRMd?^~qfq02&;#<&{w)PTlWQX=63Oe)j>v@WDA?LljLJluwlx$WCI7f?K3@b0;pu+r z^_@Ow$ORGrpPC>(%@}lcC{@_+HAOM;kU1lJVYiLkUBjy}&kLiWHAM}^z&L=w-rQg2OB4R-?a%2Rq*&~uPoSSU} z4I$-^Y^^4YrUfNTZ$vtj2AA&o@q}&rN3ON7HOLN?2F+b8KH4HRO40!?n=tFRXXAFY zJZ7Sk;JcX2$;695rIQCFSHy(5hJkT{aPLkntd2szQk_Oytb*=nvT|dQ9`?u}K^Rx~ z`n!3#R2-_)Xp8H1mldSZ?@zvu0D*qQm3Iz7xEB;h>6ghj)p?5DK)%U*NfJpSaHnAt zzCnTA>MXQya|urld!6LMee#@%KFBn14^cm52_|T*dtWEz5O#J$p4lgR!vNDvj~R85 z%Z~T9-5ReoN}$p#ez7DPD1n1&*M19UZ_+v|cyYU4>GrFc5!}K=5@TSqbyT23pw1K0 z#g#_oWcT8lqW#)Fzj_6^!%SGr?~gn9riD*Xw;zFIbeYD4#X@CTh%pEit0HI2zssr+ zZPZGKW?BuV6m5Et{9r}lpugw|h6%V)c;t(0zW_Rl_LBS&S!E{c5r8g*lR(otM#36s n`Xc{zM5keb8D^MahA#LYl8!v(vnDm#00000NkvXXu0mjfY##H& literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Contents.json new file mode 100644 index 0000000..3458710 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=Default@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Property 1=Default@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Property 1=Default@2x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Property 1=Default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3eef094457695448c26864be391c09993394693d GIT binary patch literal 1186 zcmV;T1YP@yP)wvMYyfEtu3KKm(J|3Q(oyAfTr34`3x3{Wd4jlVO3kwUIy|4;oAr!7 zN88)m0R*`eHz7hZ=lZ0E6IIBl&1Z20m|xb65o$4BSy{O;yWxVsMV;zJl~}bc@$)oM zktac2M70ukbg_Vi^IHWlTfQ$IV6d9h20L^ke%PlC+A6IAAX<|7Ks*5ET-tvWKRm}A z6{;69tN&9<075L<)M%P<;gvpUUP;{nv-+igz8Bh-lg2tJ38XBlEvP#H!{I6gQXb56 z4(I3RBQtr3o$*%5492IYrysJ!oB$@Pyp;bCCcZ>zT26(KRE1Iuy21fVsSZwKqD?zX z(<1Sb=wO8XnqC1KCG{Hgwv+&40v2pDZS+ME8}o!HdTE+w#DVC{=eCa%L(duRWAR7Q zH|w$Z&AITJ^EePJx41b0EWW&NbB)He^_8k*$M}dMAdTFXtZ^>XYh&iT+nh@yFi{x( zQ9s0lN0MO>USq&_s0F{z)Ai3Ds$k5K3vY$FkSkyZn$Qzd;UY8|4X6Iv4zS}ZhQMGb z1s(#1$P-nTe1y|mGLDG>ufW)VVqhE7To7oyy+Ylk5g6#uJ1A|F2y03D0`xoQBf3Yi zCTV7_j#3q82{{2Q=`NYP%nHG8tfcE9C5xnQc1#A+0yp|AOPf;~{XnrH%7jeBkY+^Y zjwb+(DT0&*<41Z-klGg2NdQ$Ixd<>)^f`^Gn4V@#*jkjO28!4tseKI38N6YkBpKA+ky@+dHw{6;0c{Pme&sstYQz$b>s~}wZZN=UuSy%q2Yb0 z$vy+A9(1$c(gfx|_@6ekbtv_V$>{R|UcbmcfOZ~#MyV4S4HO<~i+K({xni-rA+T6h z+o|j~E8QngZV+k-69y*Tb~V}}IRCAgVTSjJKSCEdy&5LhI{*Lx07*qoM6N<$f+OG$ A@c;k- literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Property 1=Default@3x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_03.imageset/Property 1=Default@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff7c8cc180b81664f7fd460c2d57070d55c97ab GIT binary patch literal 1712 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Contents.json new file mode 100644 index 0000000..3458710 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=Default@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Property 1=Default@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Property 1=Default@2x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04.imageset/Property 1=Default@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0dc571b168d98763ffab247a93311a10aada0b62 GIT binary patch literal 1264 zcmV(@uWPmw%@3i(C- zSP?KmeZ9QAY$8blj`Rl3{3a$RsG^Rg2&nx)p*?v3fXFe3Y?mQoML^9s1#ih<;E#`w zZ`+)7g#@6JE@p-s&6U9-#NK#Ov>Let{-N+O3Q1%V7y{vA?|-pbg7V1o$oSy;DtG5s#2EHUj;A3Nk7)G$T+i2y?+qyjo(#Kq(~=A<+uWPT%8{XMMS)zg zM?%Hxc^`9dFF1Svzp86_baX`LrOCANE$A4z7EKd%3O%wE1nN9)_scJ4Uo;m?kIV-3 zGLPFWQnHOe)09o^>G#U+!afcP@(vY-^%&g?fzk_MobZzV| z0&0l@t;oUU;>m!)AetmsKS&GorryMiRbsikIIm)$L0Vn9pfGVgbbc(Bh(nVY=OpWZ zz-HYsWLik8m+I7?pPz@bv$Ov}@Mo&XotvBch4L?EU6k{<+rqmE$NSgJ%uIxOQHJ2| z^z`(`_4V}!WM6@}14sSTtf&4*ywQZ;1}g}u2? zP`4@h_I;>Mx#Kj|0r3rd_l^41B6Bg6o<$Ju#?EI5|0)`CCd&)H_K= zy(6@Hq5KA^Oh6;S=$M;mTp=8;gC`AU_$B&iN^+I0gujdH+m<>^)W#gw75y&zEk$pR^f zN(5qPkp&*NWo;%}oA04YCshQG(Gvk3JVtpVQ@?rg;O)v^QjvPNSAI}vTE6}MS^kJe aRKRb~iA%7~Ykl(o0000cNND-}R|mw?5~V$N&QjFu?m^NOEFrZOt1R8d~7-%gamS z^z<~8F2c^vPUZgoewoKb?8`;a>gsBBbaeC*hZR*6j*N_~@BrmEwOZ{~-T@@#;o-p> z9v=3do}Ru%?7Kx}&L1Bi-$+J`N)CX8gUHJX8brbbzp}o*9>Ad8JO<^#*4CDf_kM-P z_$?b^sKAS8^Sorlu;hc6a^8nQ-#0ckzDmhJWgMu=@l!7KBnR>m6vhkSG4z&3^c+aq z14-YcB&cWaM2gsy>i7+$-M&C_AQwUSaK@W3QWT7hjm@8&oGjw+6VC5Pu3cs=i(}9` z`RvGh4#&sGKcQK#;CE5pk`z2YKkrKpbB~cd^$bf!?&3XW%*_8L_#! zxr7>V)+2QYv~_KIdiuZX>+65A+?a_VHTI}U@8YkSnHjmdy87Gp25W-oIXzBJ3;yiv zYzUHm*j#KCgH%BNSNaFmv-{Mk2A2@(tJE;$2){=FtC^zmaPg2RVxOP(FqKxl&o`3IZ4X5r@KPS(|W(=2g)MZ$-fm z=e(y`L!!8#4{zi$W1z=bw_8ToC2O3vy}m2GHnzokmqAP!VYiH*FA&G@ci(2x?Gz?uHy8+JKlxk{aRwE}B?_n!I!o zRD4=Qle>_DyJOKdTT z1gWKpB)6z|MrkAFy9wwZclO6-SM8D>oGKe%1lr+FX^INdVjOZ3n=Zoc4 zw-Ca!0@J-lf>hwrG0a^xJ7Nh60W?w^ft8cxdGH>sN=)xb8}M2!KH~$wYx18t5&WF? z0+sN2sSMgfd(X8cfKc0=4qD!jmYG2qRN|1^CL{$`>p^hCT}={I1vSGYB;$-8>QxTnC>NFRv$fO$<4OLXs^`(_VM-L(69c##NEdr-?rkBHz5|l9`?4%a zqVljL#dLp8I?q8|&D6BxO)-W5P0M z$sr1f@ELaeFt|1l8=B~{Z}J+ef-k%JIgaKfT|o`FJ+p|g;3P`{MD3+zi@tg3FBO*Y z>IansG{;b4QyRn}PhC5uju~`4vB$0pmDlBtLz^a7I!HbTwyqKHB4#NBMWH;ZjEu0-bC8JA32GtIEi)@@D#z|<2K6T5%MC?^ zPD$P!BS?qVC|XTUz34fPra5`VuppeAoD91;2Vj5!1{k0${15x`dM%@$V|f4o002ov JPDHLkV1hhyO5p$i literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Contents.json new file mode 100644 index 0000000..239b6b0 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Property 1=Variant2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Property 1=Variant2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Property 1=Variant2@2x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Property 1=Variant2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..818365bd651f210eeaa4eecd4da050b9fd4e5550 GIT binary patch literal 1379 zcmV-p1)TbcP)=Rh41Wy(wCop6DUY22# z=ZTTJQY9fG$pVRAv+%dzA*t1>ue!Sa8sH6YSPPhD(8#Hs0a2Gn571HVNhUiiqcw&N z;-2cc%;cXE8OE=CStryNMfFD~>Age(qe-m}NH;N$EK_0o2kZ}F4Lm;oRPlw5K0~dl z`Rs3lMeiGs03;)CyvO;{1~E*U7wsRPhh<_TM$-)ulwgMtN1+UCB(26m01!v0~*sY^9#N-tI*vFe@b3*o*KJ{JtAlbdK7>}_!9G0MW8nok)Bais-Utyu!aD3d=p=Y$hMsX2 zC|iCNxG6TF1)BcU297!H7$Q0DQWL5irw2JhBNr@i%wsDndpU!SVJ-pCmF4m~&f&?p z{}^ca#Lg}WHhK#L(%avWY|hVCLWS@WFMtezbCkDetWTr(o$**G^m-DNWr|F z$-M#rugXj-n! zTNh;<_}(o9Q6v$z=SE`QKwsh}l!6;}4BPw~=}4e8F%GKS6|sVMBYOZ}+8)wim)iH? zuEMlWgc>^HJmOq-D3CGhf$3z&p?rvNqb}YFzm*VcADHt zgywj3BRLOep6{b36NMSQK}Z$?{t~!Rf*ruE!MPS87M#Fn7c;+KrFqYYPQtDiTpyICu$?mhuJ8v8)wZEKsit^n*AQ67TRx3 z!ZA3aaT=q>4%>QSFEk3AO{kylM0hrz9%q(qugMBCQ_}1SevE0hK0McYl8A|qmUywK z$N3kNwY6@7+u@rziYp0{t9m+@fGij0!40MCQ5hI7#xzzs?o+ew==kwEkSgSAoiwc!b;?}Bc1-b%Qc%@J}dYcNraAT3UH}OaK5g&Ks zFd_g8Je>Y75lK`|ZoBM4a33c7-)mm}dfdaQwoB9hkX-Pi#lt=p)b<6ReNlcMo)6iV zqo`@2uAp`VISp{{ZpYf+0Yl`}F_-002ovPDHLkV1ntEW@rEa literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Property 1=Variant2@3x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_icon_04_selected.imageset/Property 1=Variant2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b504ecbcad8a486b782b5ec1a1bd92a6fe14f7 GIT binary patch literal 2018 zcmV<82Oao{P)K-}9D`n~Tz!4`1ER2+FB2Hj9fzb(!PXL?%d;*ITAWne1i6L1Sp8y$nFUx2X zjM23|3y^ zX$?|@3o2$ajqh9XdYt*iBIx?=^$ICG;mfn;OAu=0V@Y1S&hztStkz)$Xp(Z5^A+U~ zypQeqG3w~+^~Gm@p2LWUMbMR7U~;G!GNj5AdLL&(vF6h#6ai_6Ulv1#RhOKzbr=x} zVgQkHLxvPdd0(!)wH=r+F1`FdlXC*$O)M1(aMoPkJ7MbzznAnsnf`HwIm z$af>b_We6lN5C?_s1AkT>WFSmk_LK4SNs+v3D_n7;Bx;b=wYc=@zySs9Sm}{F8+Q zz*15ppsmi|KCrzzI{?f4*H6C@IYiarv>+a)H2q=*{JlXg5~V~UVs@B+(P z9k5s5R8rT^ky8#b>waSnhI~lF`E~11Tt4~T)*Arw@1BpB!Z0Z;ZYgp6iUJV zsNQ{K6%)ysXL7oM8n+hl^f1!cD1%xC`2rpeB1iW_Rm`Lid=m^lBxFH*N3ynI1BVin z@xJfRlR=IOS(Env8)}b2RqO$()*uMi!@`qL335D`SgIm5XeQbM5lE29(uHRY9}0@i zwb~I#5C@)b;jth@imW#1QP`e7xO(AdTd~0^LE1}q06Gb@OGN#!62zInH}J^dqg^Nh zY|x`H&OP9W{}1c?{cl{~{k|fRFH96vmqfZx>YFCN<}2jC{W_BB*Z@MvDW9?)s+>al zl|NsZbPCtexZIyNa{31m`V*Lh5Tee}r{iWB_^bvoAW3*%>6MlV*nou5@Z=$MS8J>U zK`yyWK30X4M&?C1iE?zSIw3!0iKDc4yTQ`6lT;|AKn)1T06{1>8=E1nNfGQNU18`( zi}14iNWmZpqHNd4DjbH~qAoS6CFgW~lH~M567y29L|?scs&jHkjvy{QJ6f&U3V74P z;N_5iBB&yz=QQ*PE%O{2>c=WHE4gFCf$>q1nmnWk%Xltowt3~|k6_H* zZa{))1o0G6<`|{~DTS+llyJoL^uK3OF+Z}A(+byT)lC)!B1sLNW7P3Juf0DFJ3x@~ zof<>|!H2ZTJBO z(6m7+7VI#dD8zkHsZm3r;825tyF$H&no95CIFQ1FX+f4AYJ#r~wXhl|fDQ~b8p4bYF{a~Qh>@HW?j@CW8IYjPNuH+U zR5%IsiIm^pDW7#*c~Y&C+4+)kE)6N}?TYEg_HMTB%|J_PoaCI?9tr9{=G4ye zUwQd2mj35Df4(|w(XEp>&Hf^!-6j23tRn#e)2k%yINe7O43d?aZs7gR3pr_&>QbxD z@u8kY_FjE1iLx+NyS~eBlY))}n*L>$Oy%jrC>>sHX#r_cx94^$l5&}px_1b=_VO3q zHirO9-A&lncfW00RL%4uFFI$TIiagY{(uL*8~nu7$Idwib*?=4)~t`oCP`Ue!!Ky0 zmaO%#_94DW=e`X=(!I(N=x)ykzFzHr!a)b=qL9=)+yZYCsoHY-!gZb>OkI&JmYwh$;1sN|qR5C`~hyprn(-wqVyCe6O9Mv!z4i zJ3J;@Bn3hs2`pBNU5SUJ<%HGba9F9vs1vBoQDUg1fN|6&Na{M*hS-OH_*$<)8*I3x zd|ZT3NJ>I|n3g)(zyz)R8`KmK)^I(Hq!y}d><`)4){M_0ghV|qB_{}-h22>@qfAhq z!bb%AF0D>9+1WNAxhYNE&V&K`w|DEHmhZyO*s+aHPQeGXicIY>A8dVU<>SPe@*6oWuNSLSVDqrMtF4 zq>Hu=)28bWbtJBz`SexlXtVscI8S)O6Xq8G1CZUfzu?-|F8}}l07*qoM6N<$f=8ae A5dZ)H literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/Contents.json new file mode 100644 index 0000000..7dcd974 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "选中@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "选中@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/选中@2x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/选中@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4d55f76856a9722a53e162172d3405f43ff6be99 GIT binary patch literal 5202 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 M07*qoM6N<$f(jYSl>h($ literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/选中@3x.png b/BeeReel/Sources/Assets.xcassets/tabbar/tabbar_top_icon.imageset/选中@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..55fceec1134b1ba7806cd52545c21d596519eb0b GIT binary patch literal 9786 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 UgjHwCSpWb407*qoM6N<$f|T`l*8l(j literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Base.lproj/LaunchScreen.storyboard b/BeeReel/Sources/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/BeeReel/Sources/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BeeReel/Sources/Bridging-Header.h b/BeeReel/Sources/Bridging-Header.h new file mode 100644 index 0000000..4e44453 --- /dev/null +++ b/BeeReel/Sources/Bridging-Header.h @@ -0,0 +1,8 @@ + + +#import "JXUUID.h" +#import +#import +#import +#import +#import "WMZBannerView.h" diff --git a/BeeReel/Sources/Info.plist b/BeeReel/Sources/Info.plist new file mode 100644 index 0000000..0eb786d --- /dev/null +++ b/BeeReel/Sources/Info.plist @@ -0,0 +1,23 @@ + + + + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + + diff --git a/BeeReel/Sources/Localizable.xcstrings b/BeeReel/Sources/Localizable.xcstrings new file mode 100644 index 0000000..793624e --- /dev/null +++ b/BeeReel/Sources/Localizable.xcstrings @@ -0,0 +1,94 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "Browse Genres" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Browse Genres" + } + } + } + }, + "Categories" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Categories" + } + } + } + }, + "Fresh Stories" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fresh Stories" + } + } + } + }, + "New Releases" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "New Releases" + } + } + } + }, + "Popular Picks" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Popular Picks" + } + } + } + }, + "Spotlight" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spotlight" + } + } + } + }, + "Top 10" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Top 10" + } + } + } + }, + "Top Charts" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Top Charts" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/BeeReel/Thirdparty/JXUUID/JXUUID.h b/BeeReel/Thirdparty/JXUUID/JXUUID.h new file mode 100644 index 0000000..242e0b6 --- /dev/null +++ b/BeeReel/Thirdparty/JXUUID/JXUUID.h @@ -0,0 +1,20 @@ +// +// JXUUID.h +// 设备标识符 +// +// Created by 曾觉新 on 2017/8/24. +// Copyright © 2017年 曾觉新. All rights reserved. +// + +#import + +@interface JXUUID : NSObject + ++ (nonnull NSString *)uuid; ++ (nonnull NSString *)idfa; +/** + 重新安装app后,会发生变化 + */ ++ (nonnull NSString *)systemUUID; + +@end diff --git a/BeeReel/Thirdparty/JXUUID/JXUUID.m b/BeeReel/Thirdparty/JXUUID/JXUUID.m new file mode 100644 index 0000000..be414ea --- /dev/null +++ b/BeeReel/Thirdparty/JXUUID/JXUUID.m @@ -0,0 +1,47 @@ +// +// JXUUID.m +// 设备标识符 +// +// Created by 曾觉新 on 2017/8/24. +// Copyright © 2017年 曾觉新. All rights reserved. +// + +#import "JXUUID.h" +#import +#import "PDKeyChain.h" +#import + +static NSString *const uuidKey = @"com.JXUUID"; + +@implementation JXUUID + ++ (nonnull NSString *)uuid +{ + static NSString *uuid; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + uuid = [PDKeyChain objectForKey:uuidKey]; + if (uuid && uuid.length > 0) { + } else { + uuid = [[NSUUID UUID] UUIDString]; + [PDKeyChain setObject:uuid forKey:uuidKey]; + } + }); + return uuid; +} ++ (nonnull NSString *)idfa +{ + static NSString *idfa; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; + }); + return idfa; +} + ++ (nonnull NSString *)systemUUID +{ + return [UIDevice currentDevice].identifierForVendor.UUIDString; +} + +@end diff --git a/BeeReel/Thirdparty/JXUUID/PDKeyChain.h b/BeeReel/Thirdparty/JXUUID/PDKeyChain.h new file mode 100755 index 0000000..45c8eb1 --- /dev/null +++ b/BeeReel/Thirdparty/JXUUID/PDKeyChain.h @@ -0,0 +1,31 @@ +// +// PDKeyChain.h +// PDKeyChain +// +// Created by Panda on 16/8/23. +// Copyright © 2016年 v2panda. All rights reserved. +// + +#import +#import + +@interface PDKeyChain : NSObject +/** + * 从 KeyChain 中读取存储的数据 + * + * @return NSDictionary + */ ++ (NSDictionary *)getKeyChainData; + ++ (id)objectForKey:(NSString *)key; ++ (void)setObject:(id)object forKey:(NSString *)key; ++ (void)removeObjectForKey:(NSString *)key; ++ (void)removeAllObjects; + + +/** + * 删除 KeyChain 信息 + */ ++ (void)keyChainDelete; + +@end diff --git a/BeeReel/Thirdparty/JXUUID/PDKeyChain.m b/BeeReel/Thirdparty/JXUUID/PDKeyChain.m new file mode 100755 index 0000000..b4a6c3d --- /dev/null +++ b/BeeReel/Thirdparty/JXUUID/PDKeyChain.m @@ -0,0 +1,100 @@ +// +// PDKeyChain.m +// PDKeyChain +// +// Created by Panda on 16/8/23. +// Copyright © 2016年 v2panda. All rights reserved. +// + +#import "PDKeyChain.h" + +static NSString * const kPDKeyChainKey = @"com.BeeReel.keychainKey"; + +@implementation PDKeyChain + ++ (void)keyChainDelete{ + [self delete:kPDKeyChainKey]; +} + ++ (NSDictionary *)getKeyChainData +{ + NSDictionary *dic = [self load:kPDKeyChainKey]; + if (!dic) { + dic = [NSDictionary dictionary]; + } + return dic; +} + ++ (void)setObject:(id)object forKey:(NSString *)key +{ + NSMutableDictionary *tempDic = [[self getKeyChainData] mutableCopy]; + [tempDic setObject:object forKey:key]; + [self save:kPDKeyChainKey data:tempDic]; +} ++ (id)objectForKey:(NSString *)key +{ + NSDictionary *tempDic = [self getKeyChainData]; + return tempDic[key]; +} ++ (void)removeObjectForKey:(NSString *)key +{ + NSMutableDictionary *tempDic = [[self getKeyChainData] mutableCopy]; + [tempDic removeObjectForKey:key]; + [self save:kPDKeyChainKey data:tempDic]; +} ++ (void)removeAllObjects +{ + NSMutableDictionary *tempDic = [[self getKeyChainData] mutableCopy]; + [tempDic removeAllObjects]; + [self save:kPDKeyChainKey data:tempDic]; +} + + + ++ (NSMutableDictionary *)getKeychainQuery:(NSString *)service { + return [NSMutableDictionary dictionaryWithObjectsAndKeys: + (id)kSecClassGenericPassword,(id)kSecClass, + service, (id)kSecAttrService, + service, (id)kSecAttrAccount, + (id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible, + nil]; +} + ++ (void)save:(NSString *)service data:(id)data { + //Get search dictionary + NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; + //Delete old item before add new item + SecItemDelete((CFDictionaryRef)keychainQuery); + //Add new object to search dictionary(Attention:the data format) + [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData]; + //Add item to keychain with the search dictionary + SecItemAdd((CFDictionaryRef)keychainQuery, NULL); +} + ++ (id)load:(NSString *)service { + id ret = nil; + NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; + //Configure the search setting + //Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue + [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData]; + [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit]; + CFDataRef keyData = NULL; + if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { + @try { + ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; + } @catch (NSException *e) { + NSLog(@"Unarchive of %@ failed: %@", service, e); + } @finally { + } + } + if (keyData) + CFRelease(keyData); + return ret; +} + ++ (void)delete:(NSString *)service { + NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; + SecItemDelete((CFDictionaryRef)keychainQuery); +} + +@end diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerConfig.h b/BeeReel/Thirdparty/WMZBanner/WMZBannerConfig.h new file mode 100644 index 0000000..c4279e3 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerConfig.h @@ -0,0 +1,109 @@ +// +// WMZBannerConfig.h +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + + + +#ifndef WMZBannerConfig_h +#define WMZBannerConfig_h + +#import + +//#if __has_include() +//#import +//#else +//#import "UIImageView+WebCache.h" +//#endif + +#define BANNERCOUNT 500 + +#define BannerWitdh [UIScreen mainScreen].bounds.size.width +#define BannerHeight [UIScreen mainScreen].bounds.size.height + +#define BannerWeakSelf(obj) __weak typeof(obj) weakObject = obj; +#define BannerStrongSelf(obj) __strong typeof(obj) strongObject = weakObject; + +#define BannerColor(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] + +#define WMZBannerPropStatementAndPropSetFuncStatement(propertyModifier,className, propertyPointerType, propertyName) \ +@property(nonatomic,propertyModifier)propertyPointerType propertyName; \ +- (className * (^) (propertyPointerType propertyName)) propertyName##Set; + +#define WMZBannerPropSetFuncImplementation(className, propertyPointerType, propertyName) \ +- (className * (^) (propertyPointerType propertyName))propertyName##Set{ \ +return ^(propertyPointerType propertyName) { \ +self->_##propertyName = propertyName; \ +return self; \ +}; \ +} + + +/* + * cell的block + */ +typedef UICollectionViewCell* (^BannerCellCallBlock)(NSIndexPath *indexPath,UICollectionView* collectionView,id model,UIImageView* bgImageView,NSArray*dataArr); + +/* + * 点击 + */ +typedef void (^BannerClickBlock)(id anyID,NSInteger index); + +/* + * 自定义pageControl + */ +typedef void (^BannerPageControl)(UIControl* pageControl); + +/* + * 点击 ,可获取居中cell + */ +typedef void (^BannerCenterClickBlock)(id anyID,NSInteger index,BOOL isCenter,UICollectionViewCell* cell); + +/* + * 滚动结束 + */ +typedef void (^BannerScrollEndBlock)(id anyID,NSInteger index,BOOL isCenter,UICollectionViewCell* cell); + +/* +* 滚动 +*/ +typedef void (^BannerScrollBlock)(CGPoint point); + +/* + * 自定义下划线 + */ +typedef void (^BannerSpecialLine)(UIView *line); + +/* + *cell动画的位置 + */ +typedef enum :NSInteger{ + BannerCellPositionCenter = 0, //居中 默认 + BannerCellPositionBottom = 1, //置底 + BannerCellPositionTop = 2, //顶部 +}BannerCellPosition; + + +/* + *特殊样式 + */ +typedef enum :NSInteger{ + SpecialStyleLine = 1, //下划线 + SpecialStyleFirstScale = 2, //首个变大效果 +}SpecialStyle; + +/* + *pageControl的位置 + */ +typedef enum :NSInteger{ + BannerControlCenter = 0, //居中 默认 + BannerControlLeft = 1, //左下 + BannerControlRight = 2, //右下 +}BannerControlPosition; + + + +#endif /* WMZBannerConfig_h */ diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerControl.h b/BeeReel/Thirdparty/WMZBanner/WMZBannerControl.h new file mode 100644 index 0000000..3efdc11 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerControl.h @@ -0,0 +1,26 @@ +// +// WMZBannerControl.h +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + +#import +#import "WMZBannerParam.h" +NS_ASSUME_NONNULL_BEGIN +@interface WMZBannerControl : UIControl +@property (nonatomic, strong) UIImage *currentImage; +@property (nonatomic, strong) UIImage *inactiveImage; +@property (nonatomic, assign) CGSize currentImageSize; +@property (nonatomic, assign) CGSize inactiveImageSize; +@property (nonatomic, assign) NSInteger numberOfPages; +@property (nonatomic, assign) NSInteger currentPage; +@property (nonatomic,strong) UIColor *currentPageIndicatorTintColor; +@property (nonatomic,strong) UIColor *pageIndicatorTintColor; +@property (nonatomic, strong) WMZBannerParam *param; +- (instancetype)initWithFrame:(CGRect)frame WithModel:(WMZBannerParam *)param; + +@end + +NS_ASSUME_NONNULL_END diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerControl.m b/BeeReel/Thirdparty/WMZBanner/WMZBannerControl.m new file mode 100644 index 0000000..97d0901 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerControl.m @@ -0,0 +1,170 @@ +// +// WMZBannerControl.m +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + +#import "WMZBannerControl.h" +#define bannerPointSize CGSizeMake(8,8) +@interface WMZBannerControl() +{ + NSInteger _numberOfPages; + NSInteger _currentPage; +} +@property(nonatomic,strong)NSMutableArray *imageArr; +@end +@implementation WMZBannerControl + +- (instancetype)initWithFrame:(CGRect)frame WithModel:(WMZBannerParam *)param{ + if (self = [super initWithFrame:frame]) { + self.param = param; + self.userInteractionEnabled = NO; + self.currentPageIndicatorTintColor = param.wBannerControlSelectColor; + self.pageIndicatorTintColor = param.wBannerControlColor; + if (param.wBannerControlImage) { + self.inactiveImage = [UIImage imageNamed:param.wBannerControlImage]; + self.inactiveImageSize = param.wBannerControlImageSize; + self.pageIndicatorTintColor = [UIColor clearColor]; + } + if (param.wBannerControlSelectImage) { + self.currentImage = [UIImage imageNamed:param.wBannerControlSelectImage]; + self.currentImageSize = param.wBannerControlSelectImageSize; + self.currentPageIndicatorTintColor = [UIColor clearColor]; + } + + [self resetFrame]; + + } + return self; +} + +- (void)setCurrentPage:(NSInteger)currentPage{ + _currentPage = currentPage; + [self updateDots]; +} + +- (void)setNumberOfPages:(NSInteger)numberOfPages{ + _numberOfPages = numberOfPages; + [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];\ + UIView *tempView = nil; + for (int i = 0; i +#import "WMZBannerParam.h" +NS_ASSUME_NONNULL_BEGIN + +@interface WMZBannerFadeLayout : UICollectionViewFlowLayout +@property(nonatomic,strong)WMZBannerParam *param; +@property(nonatomic,assign)BOOL right; +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param; +@end + +NS_ASSUME_NONNULL_END diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerFadeLayout.m b/BeeReel/Thirdparty/WMZBanner/WMZBannerFadeLayout.m new file mode 100644 index 0000000..50a3ea1 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerFadeLayout.m @@ -0,0 +1,97 @@ + +// +// WMZBannerFadeLayout.m +// WMZBanner +// +// Created by wmz on 2020/6/15. +// Copyright © 2020 wmz. All rights reserved. +// + +#import "WMZBannerFadeLayout.h" +@interface WMZBannerFadeLayout() +@property(nonatomic,assign)CGPoint collectionContenOffset; +@property(nonatomic,assign)CGSize collectionContenSize; +@property(nonatomic,assign)CGFloat last; +@end +@implementation WMZBannerFadeLayout +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param{ + if (self = [super init]) { + self.param = param; + } + return self; +} + +- (void)prepareLayout +{ + [super prepareLayout]; + self.collectionView.bounces = NO; + self.collectionView.pagingEnabled = YES; + self.itemSize = self.param.wItemSize; + self.minimumInteritemSpacing = (self.param.wFrame.size.height-self.param.wItemSize.height)/2; + self.minimumLineSpacing = self.param.wLineSpacing; + self.sectionInset = self.param.wSectionInset; + self.scrollDirection = self.param.wVertical? UICollectionViewScrollDirectionVertical + :UICollectionViewScrollDirectionHorizontal; +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { + return [self cardOverLapTypeInRect:rect]; +} + +//卡片重叠 +- (NSArray *)cardOverLapTypeInRect:(CGRect)rect{ + NSInteger itemsCount = [self.collectionView numberOfItemsInSection:0]; + if (itemsCount <= 0) { + return nil; + } + NSMutableArray *mArr = [[NSMutableArray alloc] init]; + if (self.param.wVertical) { + if (self.collectionView.contentOffset.y>self.last) { + self.right = YES; + }else if (self.collectionView.contentOffset.yself.last) { + self.right = YES; + }else if (self.collectionView.contentOffset.x +#import "WMZBannerParam.h" +NS_ASSUME_NONNULL_BEGIN + +@interface WMZBannerFlowLayout : UICollectionViewFlowLayout +@property(nonatomic,strong)WMZBannerParam *param; +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param; +@end + +NS_ASSUME_NONNULL_END diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerFlowLayout.m b/BeeReel/Thirdparty/WMZBanner/WMZBannerFlowLayout.m new file mode 100644 index 0000000..e85813e --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerFlowLayout.m @@ -0,0 +1,227 @@ +// +// WMZBannerFlowLayout.m +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + +#import "WMZBannerFlowLayout.h" +@interface WMZBannerFlowLayout(){ + CGSize factItemSize; +} +@end +@implementation WMZBannerFlowLayout +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param{ + if (self = [super init]) { + self.param = param; + } + return self; +} + +- (void)prepareLayout +{ + [super prepareLayout]; + + self.itemSize = self.param.wItemSize; + self.minimumInteritemSpacing = (self.param.wFrame.size.height-self.param.wItemSize.height)/2; + self.minimumLineSpacing = self.param.wLineSpacing; + self.sectionInset = self.param.wSectionInset; + + if ([self.collectionView isPagingEnabled]) { + self.scrollDirection = self.param.wVertical? UICollectionViewScrollDirectionVertical + :UICollectionViewScrollDirectionHorizontal; + }else{ + self.scrollDirection = UICollectionViewScrollDirectionHorizontal; + } +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { + return [self cardScaleTypeInRect:rect]; +} + +//卡片缩放 +- (NSArray *)cardScaleTypeInRect:(CGRect)rect{ + [self setUpIndex]; + NSArray *array = [self getCopyOfAttributes:[super layoutAttributesForElementsInRect:rect]]; + if (!self.param.wScale||self.param.wMarquee) { + return array; + } + CGRect visibleRect = CGRectZero; + visibleRect.origin = self.collectionView.contentOffset; + visibleRect.size = self.collectionView.bounds.size; + NSMutableArray *marr = [NSMutableArray new]; + NSInteger minIndex = 0; + CGFloat minCenterX = [(UICollectionViewLayoutAttributes*)array.firstObject center].x; + for (int i = 0; i=0&& + cellFrameInSuperview.origin.x<=self.collectionView.frame.size.width) { + if (minCenterX>cellFrameInSuperview.origin.x) { + minCenterX = cellFrameInSuperview.origin.x; + minIndex = i; + } + } + } + for (int i = 0; i * _Nullable bindings){ + return (evaluatedObject.representedElementCategory == UICollectionElementCategoryCell); + }]; + + NSArray *cellAttributes = [attributes filteredArrayUsingPredicate: cellAttributesPredicate]; + + UICollectionViewLayoutAttributes *currentAttributes; + + for (UICollectionViewLayoutAttributes *layoutAttributes in cellAttributes) + { + CGFloat itemHorizontalCenter = layoutAttributes.center.x; + if (ABS(itemHorizontalCenter - horizontalCenter) < ABS(offSetAdjustment)) + { + currentAttributes = layoutAttributes; + offSetAdjustment = itemHorizontalCenter - horizontalCenter; + } + } + + CGFloat nextOffset = proposedContentOffset.x + offSetAdjustment; + + proposedContentOffset.x = nextOffset; + CGFloat deltaX = proposedContentOffset.x - self.collectionView.contentOffset.x; + CGFloat velX = velocity.x; + + if (fabs(deltaX) <= FLT_EPSILON || fabs(velX) <= FLT_EPSILON || (velX > 0.0 && deltaX > 0.0) || (velX < 0.0 && deltaX < 0.0)) + { + + }else if (velocity.x > 0.0){ + NSArray *revertedArray = [[attributes reverseObjectEnumerator] allObjects]; + BOOL found = YES; + float proposedX = 0.0; + for (UICollectionViewLayoutAttributes *layoutAttributes in revertedArray) + { + if(layoutAttributes.representedElementCategory == UICollectionElementCategoryCell) + { + CGFloat itemHorizontalCenter = layoutAttributes.center.x; + if (itemHorizontalCenter > proposedContentOffset.x) { + found = YES; + proposedX = nextOffset + (currentAttributes.frame.size.width / 2) + (layoutAttributes.frame.size.width / 2); + } else { + break; + } + } + } + + if (found) { + proposedContentOffset.x = proposedX; + proposedContentOffset.x += self.param.wLineSpacing; + } + } + else if (velocity.x < 0.0) + { + for (UICollectionViewLayoutAttributes *layoutAttributes in cellAttributes) + { + CGFloat itemHorizontalCenter = layoutAttributes.center.x; + if (itemHorizontalCenter > proposedContentOffset.x) + { + proposedContentOffset.x = nextOffset - ((currentAttributes.frame.size.width / 2) + (layoutAttributes.frame.size.width / 2)); + proposedContentOffset.x -= self.param.wLineSpacing; + break; + } + } + } + proposedContentOffset.y = 0.0; + + return proposedContentOffset; + +} + +@end diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.h b/BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.h new file mode 100644 index 0000000..10b42a8 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.h @@ -0,0 +1,18 @@ +// +// WMZBannerOverLayout.h +// WMZBanner +// +// Created by wmz on 2019/12/18. +// Copyright © 2019 wmz. All rights reserved. +// + +#import +#import "WMZBannerParam.h" +NS_ASSUME_NONNULL_BEGIN + +@interface WMZBannerOverLayout : UICollectionViewFlowLayout +@property(nonatomic,strong)WMZBannerParam *param; +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param; +@end + +NS_ASSUME_NONNULL_END diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.m b/BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.m new file mode 100644 index 0000000..3574942 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerOverLayout.m @@ -0,0 +1,158 @@ + +// +// WMZBannerOverLayout.m +// WMZBanner +// +// Created by wmz on 2019/12/18. +// Copyright © 2019 wmz. All rights reserved. +// +#import "WMZBannerOverLayout.h" +@interface WMZBannerOverLayout() +@property(nonatomic,assign)CGPoint collectionContenOffset; +@property(nonatomic,assign)CGSize collectionContenSize; +@property(nonatomic,assign)CGFloat last; +@property(nonatomic,assign)BOOL right; +@end +@implementation WMZBannerOverLayout +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param{ + if (self = [super init]) { + self.param = param; + self.collectionView.bounces = NO; + } + return self; +} + +- (void)prepareLayout +{ + [super prepareLayout]; + if (self.param.wCardOverLapCount<=0) { + self.param.wCardOverLapCount = 4; + } + self.collectionView.pagingEnabled = YES; + self.itemSize = self.param.wVertical? + CGSizeMake(self.param.wItemSize.width , (self.param.wItemSize.height - (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing)): +// CGSizeMake(self.param.wItemSize.width - (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing, self.param.wItemSize.height); + CGSizeMake(self.param.wItemSize.width, self.param.wItemSize.height); + self.minimumInteritemSpacing = (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing*2; + self.minimumLineSpacing = (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing*2; + self.sectionInset = self.param.wSectionInset; + self.scrollDirection = self.param.wVertical? UICollectionViewScrollDirectionVertical + :UICollectionViewScrollDirectionHorizontal; +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { + return [self cardOverLapTypeInRect:rect]; +} + +//卡片重叠 +- (NSArray *)cardOverLapTypeInRect:(CGRect)rect{ + + NSInteger itemsCount = [self.collectionView numberOfItemsInSection:0]; + if (itemsCount <= 0) { + return nil; + } + + self.param.myCurrentPath = self.param.wVertical? + MAX(floor ((int)self.collectionContenOffset.y / self.collectionContenSize.height ), 0): + MAX(floor((int)self.collectionContenOffset.x / self.collectionContenSize.width ), 0); + + self.param.overFactPath = self.param.wVertical? + MAX(ceil ((int)self.collectionContenOffset.y / self.collectionContenSize.height ), 0): + MAX(ceil((int)self.collectionContenOffset.x / self.collectionContenSize.width ), 0); + NSInteger minVisibleIndex = MAX(self.param.myCurrentPath, 0); + NSInteger contentOffset = self.param.wVertical? + self.collectionContenOffset.y:self.collectionContenOffset.x; + NSInteger collectionBounds = self.param.wVertical? + self.collectionContenSize.height:self.collectionContenSize.width; + CGFloat offset = contentOffset % collectionBounds; + CGFloat offsetProgress = offset / (self.param.wVertical?self.collectionContenSize.height:self.collectionContenSize.width)*1.0f; + NSInteger maxVisibleIndex = MAX(MIN(itemsCount - 1, self.param.myCurrentPath + self.param.wCardOverLapCount), minVisibleIndex); + NSMutableArray *mArr = [[NSMutableArray alloc] init]; + + for (NSInteger i = minVisibleIndex; i<=maxVisibleIndex; i++) { + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; + UICollectionViewLayoutAttributes *attributes = [[self layoutAttributesForItemAtIndexPath:indexPath] copy]; + + NSInteger visibleIndex = MAX(indexPath.item - self.param.myCurrentPath + 1, 0); + attributes.size = self.itemSize; +// CGFloat topCardMidX = self.param.wVertical? +// (self.collectionContenOffset.y + self.collectionContenSize.height / 2): +// (self.collectionContenOffset.x + self.collectionContenSize.width / 2); + CGFloat topCardMidX = self.sectionInset.left + self.collectionContenOffset.x + self.itemSize.width / 2; + attributes.center = self.param.wVertical? + CGPointMake(self.collectionContenSize.width/2, topCardMidX + self.param.wLineSpacing * (visibleIndex - 1)): + CGPointMake(topCardMidX + self.param.wLineSpacing * (visibleIndex - 1), self.collectionContenSize.height/2); + attributes.zIndex = 925457662 - visibleIndex; + CGFloat scale = [self parallaxProgressForVisibleIndex:visibleIndex offsetProgress:offsetProgress minScale:self.param.wScaleFactor]; +// attributes.transform = CGAffineTransformMakeScale(scale, scale); + CGFloat angle = M_PI / 180 * 140 * (1 - scale); + + attributes.transform = CGAffineTransformMakeRotation(-angle); + + if (visibleIndex == 1) { + if (self.param.wVertical) { + if (minVisibleIndex != maxVisibleIndex) { + if (self.collectionContenOffset.y >= 0) { + attributes.center = CGPointMake(attributes.center.x, attributes.center.y - offset); + }else{ + attributes.center = CGPointMake(attributes.center.x , attributes.center.y + attributes.size.height * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress); + } + } + }else{ + if (minVisibleIndex != maxVisibleIndex) { + if (self.collectionContenOffset.x >= 0) { + attributes.center = CGPointMake(attributes.center.x - offset, attributes.center.y); + }else{ + attributes.center = CGPointMake(attributes.center.x + attributes.size.width * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress, attributes.center.y); + } + } + } + if (self.param.wCardOverAlphaOpen) { + attributes.alpha = MAX(1-offsetProgress, MAX(self.param.wCardOverMinAlpha, 0)); + } + }else if (visibleIndex == self.param.wCardOverLapCount + 1){ + attributes.center = self.param.wVertical? + CGPointMake(attributes.center.x, attributes.center.y + attributes.size.height * (1 - scale)/2 - self.param.wLineSpacing): + CGPointMake(attributes.center.x + attributes.size.width * (1 - scale)/2 - self.param.wLineSpacing, attributes.center.y); + if (self.param.wCardOverAlphaOpen) { + attributes.alpha = MAX(offsetProgress, MAX(self.param.wCardOverMinAlpha, 0)); + } + }else{ + attributes.center = self.param.wVertical? + CGPointMake(attributes.center.x , attributes.center.y + attributes.size.height * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress): + CGPointMake(attributes.center.x + attributes.size.width * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress, attributes.center.y); + if (self.param.wCardOverAlphaOpen) { + attributes.alpha = MAX(offsetProgress, MAX(self.param.wCardOverMinAlpha*2, 0)); + } + } + [mArr addObject:attributes]; + } + return mArr; +} + +- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { + return YES; +} + +- (CGFloat)parallaxProgressForVisibleIndex:(NSInteger)visibleIndex + offsetProgress:(CGFloat)offsetProgress + minScale:(CGFloat)minScale +{ + if (visibleIndex <= self.param.wCardOverLapCount) { + CGFloat step = (1.0 - minScale) / (self.param.wCardOverLapCount-1)*1.0; + return (1.0 - (visibleIndex - 1) * step + step * offsetProgress); + } else { + CGFloat step = (1.0 - minScale) / (self.param.wCardOverLapCount-1)*1.0; + return (1.0 - (visibleIndex - 2) * step + step * 0); + } +} + +- (CGSize)collectionContenSize{ + return CGSizeMake((int)self.collectionView.bounds.size.width, (int)self.collectionView.bounds.size.height); +} + +- (CGPoint)collectionContenOffset{ + return CGPointMake((int)self.collectionView.contentOffset.x, (int)self.collectionView.contentOffset.y); +} + +@end diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerParam.h b/BeeReel/Thirdparty/WMZBanner/WMZBannerParam.h new file mode 100644 index 0000000..af7c7c1 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerParam.h @@ -0,0 +1,142 @@ +// +// WMZBannerParam.h +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + +#import "WMZBannerConfig.h" +NS_ASSUME_NONNULL_BEGIN + +@interface WMZBannerParam : NSObject +/* =========================================Attributes==========================================*/ + +//布局方式 frame 必传 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGRect, wFrame) +//数据源 必传 +WMZBannerPropStatementAndPropSetFuncStatement(strong, WMZBannerParam, NSArray*, wData) +//特殊样式 default 无 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, SpecialStyle, wSpecialStyle) + +//淡入淡出 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wFadeOpen) +//开启缩放 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wScale) +//开启卡片重叠模式 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wCardOverLap) +//卡片重叠模式开启偏移透明度变化 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wCardOverAlphaOpen) +//叠加模式透明度最小值 defalt 0.1 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wCardOverMinAlpha) +//卡片重叠显示个数 default 4 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, NSInteger, wCardOverLapCount) +//背景毛玻璃效果 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wEffect) +//隐藏pageControl default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wHideBannerControl) +//是否允许手势滑动 default YES +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wCanFingerSliding) +//图片不变形铺满 默认 YES +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wImageFill) +//开启无线滚动 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wRepeat) +//开启自动滚动 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wAutoScroll) +//纵向(cell全屏的时候有效) default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wVertical) +//跑马灯(文字效果) default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wMarquee) +//点击左右居中 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wClickCenter) +//中间视图放最上面 default NO +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BOOL, wZindex) +//整体间距 默认UIEdgeInsetsMake(0,0, 0, 0) +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, UIEdgeInsets, wSectionInset) +//自定义图片圆角 default 5 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wCustomImageRadio) +//整体视图缩放系数 default 1 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wScreenScale) +//毛玻璃背景的高度 (视图的高度*倍数) default 1 范围0~1 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wEffectHeight) +//缩放系数 数值越大缩放越大 default 0.5 卡片叠加效果时默认为0.8 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wScaleFactor) +//左右的透明度 default 1 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wAlpha) +//垂直缩放 数值越大缩放越小 default 400 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wActiveDistance) +//item的size default 视图的宽高 item的width最小为父视图的一半 (为了保证同屏最多显示3个 减少不必要的bug) +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGSize, wItemSize) +//item的之间的间距 default 0 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, int, wLineSpacing) +//滑动的时候偏移的距离 以倍数计算 default 0.5 正中间 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wContentOffsetX) +//左右相邻item的中心点 default BannerCellPositionCenter +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BannerCellPosition, wPosition) +//占位图片 默认 - +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, NSString*, wPlaceholderImage) +//数据源的图片字段 默认 icon +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, NSString*, wDataParamIconName) +//滚动减速时间 default UIScrollViewDecelerationRateFast +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, UIScrollViewDecelerationRate,wDecelerationRate) +//自动滚动间隔时间 default 3.0f +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wAutoScrollSecond) +//默认移动到第几个 default 0 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, NSInteger, wSelectIndex) +//自定义cell内容 默认是Collectioncell类 +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, BannerCellCallBlock, wMyCell) +//特殊样式SpecialLine 自定义下划线 +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, BannerSpecialLine, wSpecialCustumLine) +//自定义cell的类名 自定义视图必传 不然会crash +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, NSString*, wMyCellClassName) +//自定义cell的类名 自定义视图必传 不然会crash 和上面的属性wMyCellClassName 二选一 此属性可以传数组 +WMZBannerPropStatementAndPropSetFuncStatement(strong, WMZBannerParam, id, wMyCellClassNames) +//自定义xib cell的类名 自定义视图必传 不然会crash +WMZBannerPropStatementAndPropSetFuncStatement(strong, WMZBannerParam, id, wXibCellClassNames) +//系统的圆点颜色 default ffffff +WMZBannerPropStatementAndPropSetFuncStatement(strong, WMZBannerParam, UIColor*, wBannerControlColor) +//系统的圆点选中颜色 default orange +WMZBannerPropStatementAndPropSetFuncStatement(strong, WMZBannerParam, UIColor*, wBannerControlSelectColor) +//自定义安全的圆点图标 default - +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, NSString*, wBannerControlImage) +//自定义安全的选中圆点图标 default - +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, NSString*, wBannerControlSelectImage) +//自定义安全的圆点图片圆角 default ImageSize/2 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wBannerControlImageRadius) +//自定义安全的圆点图标的size default (5,5) +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGSize, wBannerControlImageSize) +//自定义安全的选中圆点图标的size (10,5) +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGSize, wBannerControlSelectImageSize) +//自定义圆点的间距 default 3 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wBannerControlSelectMargin) +//自定义pageControl +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, BannerPageControl, wCustomControl) +//pageControl的位置 default BannerControlCenter +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, BannerControlPosition,wBannerControlPosition) +//跑马灯文字颜色 default red +WMZBannerPropStatementAndPropSetFuncStatement(strong, WMZBannerParam, UIColor*, wMarqueeTextColor) +//跑马灯速度 default 0.5 +WMZBannerPropStatementAndPropSetFuncStatement(assign, WMZBannerParam, CGFloat, wMarqueeRate) +/* =========================================Attributes==========================================*/ + +/* =========================================Events==============================================*/ +WMZBannerParam * BannerParam(void); +//点击方法 +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, BannerClickBlock, wEventClick) +//点击方法 可获取居中cell +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, BannerCenterClickBlock,wEventCenterClick) +//每次滚动结束都会调用 最好是关闭自动滚动的场景使用 +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, BannerScrollEndBlock, wEventScrollEnd) +//正在滚动 +WMZBannerPropStatementAndPropSetFuncStatement(copy, WMZBannerParam, BannerScrollBlock, wEventDidScroll) +/* =========================================Events==============================================*/ + +/* =========================================custom==============================================*/ +@property(nonatomic,assign)NSInteger myCurrentPath; + +@property(nonatomic,assign)NSInteger overFactPath; +/* =========================================custom==============================================*/ + +@end + +NS_ASSUME_NONNULL_END diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerParam.m b/BeeReel/Thirdparty/WMZBanner/WMZBannerParam.m new file mode 100644 index 0000000..c49e3cd --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerParam.m @@ -0,0 +1,106 @@ +// +// WMZBannerParam.m +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + +#import "WMZBannerParam.h" + +@implementation WMZBannerParam + +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGRect, wFrame) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSArray*, wData) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wScaleFactor) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wCardOverMinAlpha) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wCardOverAlphaOpen) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wFadeOpen) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wEffect) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wVertical) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wImageFill) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wScale) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wRepeat) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wAutoScroll) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wHideBannerControl) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wCanFingerSliding) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wMarquee) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wCardOverLap) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wZindex) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BOOL, wClickCenter) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSInteger, wCardOverLapCount) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wActiveDistance) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGSize, wItemSize) +WMZBannerPropSetFuncImplementation(WMZBannerParam, int, wLineSpacing) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wEffectHeight) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wContentOffsetX) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wScreenScale) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerCellPosition, wPosition) +WMZBannerPropSetFuncImplementation(WMZBannerParam, SpecialStyle, wSpecialStyle) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSString*, wPlaceholderImage) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSInteger, wSelectIndex) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSString*, wMyCellClassName) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerCellCallBlock, wMyCell) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerClickBlock, wEventClick) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerScrollEndBlock, wEventScrollEnd) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerCenterClickBlock, wEventCenterClick) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerScrollBlock, wEventDidScroll) +WMZBannerPropSetFuncImplementation(WMZBannerParam, UIColor*, wBannerControlColor) +WMZBannerPropSetFuncImplementation(WMZBannerParam, UIColor*, wBannerControlSelectColor) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSString*, wBannerControlImage) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSString*, wDataParamIconName) +WMZBannerPropSetFuncImplementation(WMZBannerParam, NSString*, wBannerControlSelectImage) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGSize, wBannerControlImageSize) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGSize, wBannerControlSelectImageSize) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wAutoScrollSecond) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wAlpha) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wBannerControlImageRadius) +WMZBannerPropSetFuncImplementation(WMZBannerParam, UIEdgeInsets, wSectionInset) +WMZBannerPropSetFuncImplementation(WMZBannerParam, UIScrollViewDecelerationRate, wDecelerationRate) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerControlPosition, wBannerControlPosition) +WMZBannerPropSetFuncImplementation(WMZBannerParam, UIColor*, wMarqueeTextColor) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerPageControl, wCustomControl) +WMZBannerPropSetFuncImplementation(WMZBannerParam, BannerSpecialLine, wSpecialCustumLine) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wBannerControlSelectMargin) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wMarqueeRate) +WMZBannerPropSetFuncImplementation(WMZBannerParam, CGFloat, wCustomImageRadio) +WMZBannerPropSetFuncImplementation(WMZBannerParam, id, wMyCellClassNames) +WMZBannerPropSetFuncImplementation(WMZBannerParam, id, wXibCellClassNames) +WMZBannerParam * BannerParam(void){ + return [WMZBannerParam new]; +} + +- (instancetype)init{ + if (self = [super init]) { + _wAlpha = 1; + _wScaleFactor = 0.5f; + _wLineSpacing = 0.0f; + _wContentOffsetX = 0.5f; + _wAutoScrollSecond = 3.0f; + _wPosition = BannerCellPositionCenter; + _wActiveDistance = 400.0f; + _wScale = NO; + _wRepeat = NO; + _wSelectIndex = 0; + _wImageFill = YES; + _wBannerControlColor = [UIColor whiteColor]; + _wBannerControlSelectColor = [UIColor orangeColor]; + _wBannerControlImageSize = CGSizeMake(10, 10); + _wBannerControlSelectImageSize = CGSizeMake(10, 10); + _wCanFingerSliding = YES; + _wSectionInset = UIEdgeInsetsMake(0,0, 0, 0); + _wDecelerationRate = 0.1; + _wScreenScale = 1; + _wMarqueeTextColor = [UIColor redColor]; + _wEffectHeight = 1; + _wDataParamIconName = @"icon"; + _wBannerControlSelectMargin = 3; + _wMarqueeRate = 0.5; + _wCardOverLapCount = 4; + _wCardOverMinAlpha = 0.1; + _wCustomImageRadio = 5.0f; + } + return self; +} + +@end diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerView.h b/BeeReel/Thirdparty/WMZBanner/WMZBannerView.h new file mode 100644 index 0000000..f84fafa --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerView.h @@ -0,0 +1,55 @@ +// +// WMZBannerView.h +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + +#import "WMZBannerParam.h" +#import +NS_ASSUME_NONNULL_BEGIN + +@interface WMZBannerView : UIView +//背景图 +@property(strong,nonatomic)UIImageView *bgImgView; + +/** + * 调用方法 + * + */ +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param withView:(UIView*)parentView; + +/** + * 调用方法 + * + */ +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param; + +- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier; +/** + * 更新UI + * + */ +- (void)updateUI; + + +/** +* 手动调用滚动 +* +*/ +- (void)scrolToPath:(NSIndexPath*)path animated:(BOOL)animated; + +@end + +@interface Collectioncell : UICollectionViewCell +@property(nonatomic,strong)UIImageView *icon; +@property(nonatomic,strong)WMZBannerParam *param; +@end + +@interface CollectionTextCell : UICollectionViewCell +@property(nonatomic,strong)UILabel *label; +@property(nonatomic,strong)WMZBannerParam *param; +@end + +NS_ASSUME_NONNULL_END diff --git a/BeeReel/Thirdparty/WMZBanner/WMZBannerView.m b/BeeReel/Thirdparty/WMZBanner/WMZBannerView.m new file mode 100644 index 0000000..80a8ce9 --- /dev/null +++ b/BeeReel/Thirdparty/WMZBanner/WMZBannerView.m @@ -0,0 +1,701 @@ + + +// +// WMZBannerView.m +// WMZBanner +// +// Created by wmz on 2019/9/6. +// Copyright © 2019 wmz. All rights reserved. +// + +#import "WMZBannerView.h" +#import "WMZBannerFlowLayout.h" +#import "WMZBannerControl.h" +#import "WMZBannerOverLayout.h" +#import "WMZBannerFadeLayout.h" +#import +@interface WMZBannerView(){ + BOOL beganDragging; + CGFloat marginTime; +} +@property(strong,nonatomic)UICollectionView *myCollectionV; +@property(strong,nonatomic)UICollectionViewFlowLayout *flowL ; +@property(strong,nonatomic)WMZBannerControl *bannerControl ; +@property(strong,nonatomic)NSArray *data; +@property(strong,nonatomic)WMZBannerParam *param; +@property(strong,nonatomic)NSTimer *timer; +@property(strong,nonatomic)UIView *line; +@property(assign,nonatomic)NSInteger lastIndex; +@end +@implementation WMZBannerView +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param withView:(UIView*)parentView{ + if (self = [super init]) { + self.param = param; + if (parentView) { + [parentView addSubview:self]; + } + self.param.wFrame = CGRectMake(self.param.wFrame.origin.x, + self.param.wFrame.origin.y, + (int)self.param.wFrame.size.width, + (int)self.param.wFrame.size.height); + [self setFrame:self.param.wFrame]; + self.data = [NSArray arrayWithArray:self.param.wData]; + [self setUp]; + } + return self; +} + +/** + * 调用方法 + * + */ +- (instancetype)initConfigureWithModel:(WMZBannerParam *)param{ + if (self = [super init]) { + self.param = param; + self.param.wFrame = CGRectMake(self.param.wFrame.origin.x, + self.param.wFrame.origin.y, + (int)self.param.wFrame.size.width, + (int)self.param.wFrame.size.height); + [self setFrame:self.param.wFrame]; + self.data = [NSArray arrayWithArray:self.param.wData]; + [self setUp]; + } + return self; +} + + +- (void)updateUI{ + self.data = [NSArray arrayWithArray:self.param.wData]; + [self resetCollection]; +} + + +- (void)resetCollection{ + self.bannerControl.frame = CGRectMake((self.bounds.size.width - 60)/2 , self.bounds.size.height - 30,60, 30); + self.bannerControl.numberOfPages = self.data.count; + self.bannerControl.hidden = self.param.wHideBannerControl; + if (self.data.count == 1) { + self.bannerControl.hidden = YES; + } + [UIView animateWithDuration:0.0 animations:^{ + [self.myCollectionV reloadData]; + if (self.param.wSelectIndex>=0|| self.param.wRepeat) { + NSIndexPath *path = [NSIndexPath indexPathForRow: self.param.wRepeat?((BANNERCOUNT/2)*self.data.count+self.param.wSelectIndex):self.param.wSelectIndex inSection:0]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self scrolToPath:path animated:NO]; + self.bannerControl.currentPage = self.param.wSelectIndex; + self.param.myCurrentPath = self.param.wRepeat?((BANNERCOUNT/2)*self.data.count+self.param.wSelectIndex):self.param.wSelectIndex; + if (self.param.wAutoScroll) { + [self createTimer]; + }else{ + [self cancelTimer]; + } + }); + } + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self scrollEnd:[NSIndexPath indexPathForRow: self.param.wRepeat?((BANNERCOUNT/2)*self.data.count+self.param.wSelectIndex):self.param.wSelectIndex inSection:0]]; + }); + } completion:^(BOOL finished) {}]; + + + if (self.param.wSpecialStyle == SpecialStyleLine&&self.param.wData.count) { + [self addSubview:self.line]; + self.line.hidden = NO; + self.line.backgroundColor = [UIColor redColor]; + if (self.param.wSpecialCustumLine) { + self.param.wSpecialCustumLine(self.line); + } + + CGFloat lineHeight = self.line.frame.size.height?:2; + CGFloat lineWidth = self.param.wFrame.size.width/self.param.wData.count; + self.line.frame = CGRectMake(0, self.param.wFrame.size.height -lineHeight, lineWidth, lineHeight); + }else{ + self.line.hidden = YES; + } + + +} + +- (void)setUp{ + + if (self.data&&self.data.count==1) { + self.param.wRepeat = NO; + self.param.wAutoScroll = NO; + } + + if (self.param.wMarquee) { + self.param.wAutoScroll = YES; + self.param.wHideBannerControl = YES; + marginTime = 0.005; + self.param.wRepeat = YES; + } + self.param.wFrame = CGRectIntegral(self.param.wFrame); + if (self.param.wScreenScale<1&&self.param.wScreenScale>0) { + CGRect rect = self.param.wFrame; + rect.origin.x = rect.origin.x * self.param.wScreenScale; + rect.origin.y = rect.origin.y * self.param.wScreenScale; + rect.size.width = rect.size.width * self.param.wScreenScale; + rect.size.height = rect.size.height * self.param.wScreenScale; + self.param.wFrame = rect; + self.frame = self.param.wFrame; + + CGSize size = self.param.wItemSize; + size.width *= self.param.wScreenScale; + size.height *= self.param.wScreenScale; + self.param.wItemSize = size; + + self.param.wLineSpacing*=self.param.wScreenScale; + + UIEdgeInsets sets = self.param.wSectionInset; + sets.top*=self.param.wScreenScale; + sets.right*=self.param.wScreenScale; + sets.bottom*=self.param.wScreenScale; + sets.left*=self.param.wScreenScale; + self.param.wSectionInset = sets; + } + if (self.param.wItemSize.height == 0 || self.param.wItemSize.width == 0 ) { + self.param.wItemSize = CGSizeMake(self.frame.size.width, self.frame.size.height); + } + + else if(self.param.wItemSize.height>self.frame.size.height){ + self.param.wItemSize = CGSizeMake(self.param.wItemSize.width, self.frame.size.height); + }else if(self.param.wItemSize.width>self.frame.size.width){ + self.param.wItemSize = CGSizeMake(self.frame.size.width, self.param.wItemSize.height); + } + int width = self.param.wItemSize.width; + int height = self.param.wItemSize.height; + self.param.wItemSize = CGSizeMake(width, height); + + if (self.param.wFadeOpen) { + self.flowL = [[WMZBannerFadeLayout alloc] initConfigureWithModel:self.param]; + }else if (self.param.wCardOverLap) { + if (self.param.wScaleFactor == 0.5) { + self.param.wScaleFactor = 0.8f; + } + self.flowL = [[WMZBannerOverLayout alloc] initConfigureWithModel:self.param]; + }else{ + self.flowL = [[WMZBannerFlowLayout alloc] initConfigureWithModel:self.param]; + } + + + [self addSubview:self.myCollectionV]; + self.myCollectionV.scrollEnabled = self.param.wCanFingerSliding; + [self.myCollectionV registerClass:[Collectioncell class] forCellWithReuseIdentifier:NSStringFromClass([Collectioncell class])]; + [self.myCollectionV registerClass:[CollectionTextCell class] forCellWithReuseIdentifier:NSStringFromClass([CollectionTextCell class])]; + if (self.param.wMyCellClassName) { + [self.myCollectionV registerClass:NSClassFromString(self.param.wMyCellClassName) forCellWithReuseIdentifier:self.param.wMyCellClassName]; + } + if (self.param.wMyCellClassNames) { + if ([self.param.wMyCellClassNames isKindOfClass:[NSString class]]) { + [self.myCollectionV registerClass:NSClassFromString(self.param.wMyCellClassNames) forCellWithReuseIdentifier:self.param.wMyCellClassNames]; + }else if ([self.param.wMyCellClassNames isKindOfClass:[NSArray class]]){ + [(NSArray*)self.param.wMyCellClassNames enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[NSString class]]) { + [self.myCollectionV registerClass:NSClassFromString(obj) forCellWithReuseIdentifier:obj]; + } + }]; + } + } + + if (self.param.wXibCellClassNames) { + if ([self.param.wXibCellClassNames isKindOfClass:[NSString class]]) { + [self.myCollectionV registerNib:[UINib nibWithNibName:self.param.wXibCellClassNames bundle:nil] forCellWithReuseIdentifier:self.param.wXibCellClassNames]; + }else if ([self.param.wXibCellClassNames isKindOfClass:[NSArray class]]){ + [(NSArray*)self.param.wXibCellClassNames enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[NSString class]]) { + [self.myCollectionV registerNib:[UINib nibWithNibName:obj bundle:nil] forCellWithReuseIdentifier:obj]; + } + }]; + } + } + + self.myCollectionV.pagingEnabled = (self.param.wItemSize.width == self.myCollectionV.frame.size.width && self.param.wLineSpacing == 0)||self.param.wVertical; + if ([self.myCollectionV isPagingEnabled]) { + self.myCollectionV.decelerationRate = UIScrollViewDecelerationRateNormal; + } + + self.bannerControl = [[WMZBannerControl alloc]initWithFrame:CGRectMake((self.bounds.size.width - 60)/2 , self.bounds.size.height - 30,60, 30) WithModel:self.param]; + [self addSubview:self.bannerControl]; + + self.bgImgView = [UIImageView new]; + self.bgImgView.contentMode = self.param.wImageFill?UIViewContentModeScaleAspectFill:UIViewContentModeScaleToFill; + [self addSubview:self.bgImgView]; + [self sendSubviewToBack:self.bgImgView]; + self.bgImgView.hidden = !self.param.wEffect; + self.bgImgView.layer.masksToBounds = YES; + UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; + UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; + [self.bgImgView addSubview:effectView]; + + self.myCollectionV.frame = self.bounds; + if (self.param.wCustomControl) { + self.param.wCustomControl(self.bannerControl); + } + self.bgImgView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height*self.param.wEffectHeight); + effectView.frame = self.bgImgView.bounds; + [self resetCollection]; + +} + +- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier { + [self.myCollectionV registerClass:cellClass forCellWithReuseIdentifier:identifier]; +} + +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ + NSInteger index = self.param.wRepeat?indexPath.row%self.data.count:indexPath.row; + id dic = self.data[index]; + UICollectionViewCell *tmpCell = nil; + if (self.param.wMyCell) { + tmpCell = self.param.wMyCell([NSIndexPath indexPathForRow:index inSection:indexPath.section], collectionView, dic,self.bgImgView,self.data); + }else{ + //默认视图 + Collectioncell *cell = (Collectioncell *)[collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([Collectioncell class]) forIndexPath:indexPath]; + cell.param = self.param; + if ([dic isKindOfClass:[NSDictionary class]]) { + [self setIconData:cell.icon withData:dic[self.param.wDataParamIconName]]; + }else{ + [self setIconData:cell.icon withData:dic]; + } + tmpCell = cell; + cell.contentView.layer.cornerRadius = self.param.wCustomImageRadio; + } + return tmpCell; +} + +- (void)setIconData:(UIImageView*)icon withData:(id)data{ + if (!data) return; + if ([data isKindOfClass:[NSString class]]) { + if ([(NSString*)data hasPrefix:@"http"]) { +// [icon sd_setImageWithURL:[NSURL URLWithString:(NSString*)data] placeholderImage:self.param.wPlaceholderImage?[UIImage imageNamed:self.param.wPlaceholderImage]:nil]; + }else{ + icon.image = [UIImage imageNamed:(NSString*)data]; + } + } +} + + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section +{ + return self.param.wRepeat?self.data.count*BANNERCOUNT:self.data.count; + +} + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ + if (self.param.wEventClick) { + NSInteger index = self.param.wRepeat?indexPath.row%self.data.count:indexPath.row; + id dic = self.data[index]; + self.param.wEventClick(dic, index); + } + + if (self.param.wEventCenterClick) { + NSInteger index = self.param.wRepeat?indexPath.row%self.data.count:indexPath.row; + id dic = self.data[index]; + BOOL center = [self checkCellInCenterCollectionView:collectionView AtIndexPath:indexPath]; + UICollectionViewCell *currentCell = (UICollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath]; + self.param.wEventCenterClick(dic, index,center,currentCell); + } + if (self.param.wClickCenter) { + NSArray *visibleCellIndex = [collectionView visibleCells]; + NSArray *sortedIndexPaths = [visibleCellIndex sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { + NSIndexPath *path1 = (NSIndexPath *)[collectionView indexPathForCell:obj1]; + NSIndexPath *path2 = (NSIndexPath *)[collectionView indexPathForCell:obj2]; + return [path1 compare:path2]; + }]; + if (sortedIndexPaths.count>0) { + NSInteger center = sortedIndexPaths.count/2; + UICollectionViewCell *tmpCell = [collectionView cellForItemAtIndexPath:indexPath]; + for (int i = 0; i < sortedIndexPaths.count; i++) { + UICollectionViewCell *cell = sortedIndexPaths[i]; + if (cell == tmpCell) { + NSIndexPath *nextIndexPath = nil; + if (i>center || i self.data.count*BANNERCOUNT-1):(path.row> self.data.count-1)){ + [self cancelTimer]; + return; + } + if (self.data.count==0) return; + if (self.param.wCardOverLap||self.param.wFadeOpen) { + [self.myCollectionV setContentOffset: self.param.wVertical? + CGPointMake(0, path.row *self.myCollectionV.bounds.size.height): + CGPointMake(path.row *self.myCollectionV.bounds.size.width, 0) + animated:animated]; + }else{ + if ([self.myCollectionV isPagingEnabled]) { + [self.myCollectionV scrollToItemAtIndexPath:path atScrollPosition: + self.param.wVertical?UICollectionViewScrollPositionCenteredVertically: + UICollectionViewScrollPositionCenteredHorizontally animated:animated]; + }else{ + [self.myCollectionV scrollToItemAtIndexPath:path atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:animated]; + } + } + + if ([self.myCollectionV isPagingEnabled]||self.param.wCardOverLap) return; + if(self.param.wContentOffsetX>0.5){ + self.myCollectionV.contentOffset = CGPointMake(self.myCollectionV.contentOffset.x-(self.param.wContentOffsetX-0.5)*self.myCollectionV.frame.size.width, self.myCollectionV.contentOffset.y); + }else if(self.param.wContentOffsetX<0.5){ + self.myCollectionV.contentOffset = CGPointMake(self.myCollectionV.contentOffset.x+self.myCollectionV.frame.size.width *(0.5-self.param.wContentOffsetX), self.myCollectionV.contentOffset.y); + } +} + + +//定时器 +- (void)createTimer{ + if (!self.timer) { + SEL sel = NSSelectorFromString(self.param.wMarquee?@"autoMarqueenScrollAction":@"autoScrollAction"); + self.timer = [NSTimer scheduledTimerWithTimeInterval:self.param.wMarquee?marginTime: self.param.wAutoScrollSecond target:[YYTextWeakProxy proxyWithTarget:self] selector:sel userInfo:nil repeats:YES]; + [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; + } +} + +//定时器方法 自动滚动 +- (void)autoScrollAction{ + if (beganDragging) return; + if (!self.timer) return; + if (!self.superview) return; + if (!self.param.wAutoScroll) { + [self cancelTimer]; + return; + } + self.param.myCurrentPath+=1; + if (self.param.wRepeat&& self.param.myCurrentPath == (self.data.count*BANNERCOUNT - 1)) { + self.param.myCurrentPath = 0; + } + else if(!self.param.wRepeat&& self.param.myCurrentPath == self.data.count){ + [self cancelTimer]; + return; + } + NSIndexPath *nextIndexPath = [NSIndexPath indexPathForItem: self.param.myCurrentPath inSection:0]; + [self scrolToPath:nextIndexPath animated:YES]; +} + +//定时器方法 跑马灯 +- (void)autoMarqueenScrollAction{ + if (!self.timer) return; + if (!self.superview) return; + if (!self.param.wAutoScroll) { + [self cancelTimer]; + return; + } + NSValue *value = nil; + if (self.param.wVertical) { + CGFloat OffsetY = self.myCollectionV.contentOffset.y + self.param.wMarqueeRate; + if (OffsetY >self.myCollectionV.contentSize.height) { + OffsetY = self.myCollectionV.contentSize.height/2; + } + value = [NSValue valueWithCGPoint:CGPointMake(self.myCollectionV.contentOffset.x, OffsetY)]; + }else{ + CGFloat OffsetX = self.myCollectionV.contentOffset.x + self.param.wMarqueeRate; + if (OffsetX >self.myCollectionV.contentSize.width) { + OffsetX = self.myCollectionV.contentSize.width/2; + } + value = [NSValue valueWithCGPoint:CGPointMake(OffsetX, self.myCollectionV.contentOffset.y)]; + } + [self.myCollectionV setContentOffset:value.CGPointValue]; +} + +//定时器销毁 +- (void)cancelTimer{ + if (self.timer) { + [self.timer invalidate]; + self.timer = nil; + } +} + +//开始拖动 +- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ + beganDragging = YES; + if (!self.param.wMarquee) { + if (self.param.wAutoScroll) { + [self cancelTimer]; + } + }else{ + [self cancelTimer]; + [self performSelector:@selector(createTimer) withObject:nil afterDelay:self.param.wAutoScrollSecond]; + } +} + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ + NSInteger index = 0; + if (self.param.wCardOverLap||self.param.wFadeOpen) { + if ([self.myCollectionV isPagingEnabled]&&!self.param.wMarquee) { + index = self.param.myCurrentPath; + } + }else{ + if ([self.myCollectionV isPagingEnabled]&&!self.param.wMarquee) { + index = self.param.wVertical? + scrollView.contentOffset.y/scrollView.frame.size.height: + scrollView.contentOffset.x/scrollView.frame.size.width; + self.param.myCurrentPath = index; + }else{ + index = self.param.myCurrentPath; + } + } + self.bannerControl.currentPage = self.param.wRepeat?index %self.data.count:index; + if (self.param.wEventDidScroll) { + self.param.wEventDidScroll(scrollView.contentOffset); + } + [self setUpSpecialFrame]; +} + +//拖动结束 +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ + beganDragging = NO; +} + +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ + if (!self.param.wMarquee) { + if (![self.myCollectionV isPagingEnabled]) { + self.bannerControl.currentPage = self.param.wRepeat?self.param.myCurrentPath%self.data.count:self.param.myCurrentPath; + } + if (self.param.wAutoScroll) { + [self createTimer]; + } + [self setUpSpecialFrame]; + [self scrollEnd:[NSIndexPath indexPathForRow:self.param.myCurrentPath inSection:0]]; + [self fadeAction]; + } +} + +- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ + if (self.param.wCardOverLap) { + self.param.myCurrentPath = self.param.wVertical? + MAX(floor(scrollView.contentOffset.y / scrollView.bounds.size.height ), 0): + MAX(floor(scrollView.contentOffset.x / scrollView.bounds.size.width ), 0); + } + [self scrollEnd:[NSIndexPath indexPathForRow:self.param.myCurrentPath inSection:0]]; + [self setUpSpecialFrame]; + [self fadeAction]; +} + +- (void)scrollEnd:(NSIndexPath*)indexPath{ + if (!self.data.count) return; + if (self.param.wMarquee) return; + NSInteger current = MAX( self.param.wCardOverLap?self.param.overFactPath:self.param.myCurrentPath, 0); + NSInteger index = self.param.wRepeat?current%self.data.count:current; + if (index>self.data.count-1) { + index = 0; + } + //取上一张 + id dic = self.data[index]; + if (self.param.wEventScrollEnd) { + BOOL center = [self checkCellInCenterCollectionView:self.myCollectionV AtIndexPath:indexPath]; + UICollectionViewCell *currentCell = (UICollectionViewCell*)[self.myCollectionV cellForItemAtIndexPath:indexPath]; + self.param.wEventScrollEnd(dic, index, center,currentCell); + } + if (self.param.wEffect) { + if ([dic isKindOfClass:[NSDictionary class]]) { + [self setIconData:self.bgImgView withData:dic[self.param.wDataParamIconName]]; + }else{ + [self setIconData:self.bgImgView withData:dic]; + } + } + self.bannerControl.currentPage = index; + + if (self.param.wEventDidScroll) { + self.param.wEventDidScroll(self.myCollectionV.contentOffset); + } + self.lastIndex = current; +} +//淡入淡出 +- (void)fadeAction{ + if (self.param.wFadeOpen) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + WMZBannerFadeLayout *fade = (WMZBannerFadeLayout*)self.flowL; + if (![fade isKindOfClass:[WMZBannerFadeLayout class]]) { + return; + } + NSInteger current = MAX(self.param.myCurrentPath, 0); + NSInteger index = self.param.wRepeat?current%self.data.count:current; + self.bannerControl.currentPage = index; + NSInteger itemsCount = [self.myCollectionV numberOfItemsInSection:0]; + NSInteger showIndex = MIN(itemsCount-1, MAX(0, current)); + NSInteger hideIndex = fade.right?MAX(showIndex-1, 0):MIN(showIndex+1, itemsCount-1); + NSIndexPath *showIndexPath = [NSIndexPath indexPathForRow:showIndex inSection:0]; + NSIndexPath *hideIndexPath = [NSIndexPath indexPathForRow:hideIndex inSection:0]; + [self showAninationWithView:[self.myCollectionV cellForItemAtIndexPath:showIndexPath]]; + [self hideAninationWithView:[self.myCollectionV cellForItemAtIndexPath:hideIndexPath]]; + }); + } +} +//更新下划线位置 +- (void)setUpSpecialFrame{ + if (!self.param.wSpecialStyle) return; + if (!self.data.count) return; + + if (self.param.wSpecialStyle == SpecialStyleLine) { + [UIView animateWithDuration:0.5 animations:^{ + CGRect rect = self.line.frame; + rect.origin.x = (self.param.wRepeat?self.param.myCurrentPath%self.data.count:self.param.myCurrentPath)*rect.size.width; + self.line.frame = rect; + }]; + } +} + +- (void)showAninationWithView:(UIView*)view{ + [view.layer removeAllAnimations]; + CABasicAnimation *scale = [CABasicAnimation animation]; + scale.keyPath = @"transform.scale"; + scale.fromValue = [NSNumber numberWithFloat:1.3]; + scale.toValue = [NSNumber numberWithFloat:1.0]; + + CABasicAnimation *showViewAnn = [CABasicAnimation animationWithKeyPath:@"opacity"]; + showViewAnn.fromValue = [NSNumber numberWithFloat:0.5]; + showViewAnn.toValue = [NSNumber numberWithFloat:1]; + + CAAnimationGroup *group = [CAAnimationGroup animation]; + group.animations = @[scale, showViewAnn]; + group.duration = 0.6; + [view.layer addAnimation:group forKey:nil]; +} +- (void)hideAninationWithView:(UIView*)view{ + [view.layer removeAllAnimations]; + CABasicAnimation *scale = [CABasicAnimation animation]; + scale.keyPath = @"transform.scale"; + scale.fromValue = [NSNumber numberWithFloat:1]; + scale.toValue = [NSNumber numberWithFloat:1.3]; + + CABasicAnimation *showViewAnn = [CABasicAnimation animationWithKeyPath:@"opacity"]; + showViewAnn.fromValue = [NSNumber numberWithFloat:1]; + showViewAnn.toValue = [NSNumber numberWithFloat:0]; + + CAAnimationGroup *group = [CAAnimationGroup animation]; + group.animations = @[scale, showViewAnn]; + group.duration = 0.6; + [view.layer addAnimation:group forKey:nil]; +} + +- (UICollectionView *)myCollectionV{ + if (!_myCollectionV) { + _myCollectionV = [[UICollectionView alloc]initWithFrame:self.bounds collectionViewLayout:self.flowL]; + _myCollectionV.delegate = self; + _myCollectionV.dataSource = self; + _myCollectionV.showsVerticalScrollIndicator = NO; + _myCollectionV.showsHorizontalScrollIndicator = NO; + _myCollectionV.backgroundColor = [UIColor clearColor]; + _myCollectionV.decelerationRate = _param.wDecelerationRate; + } + return _myCollectionV; +} + +- (WMZBannerControl *)bannerControl{ + if (!_bannerControl) { + _bannerControl = [[WMZBannerControl alloc]initWithFrame:CGRectZero WithModel:_param]; + } + return _bannerControl; +} + +- (UIView *)line{ + if (!_line) { + _line = [UIView new]; + } + return _line; +} + +- (void)dealloc{ + //单纯调用这里无法消除定时器 + [self cancelTimer]; +} + +//要配合这里调用 +- (void)willMoveToSuperview:(UIView *)newSuperview { + [super willMoveToSuperview:newSuperview]; + if (!newSuperview &&self.timer) { + // 销毁定时器 + [self.timer invalidate]; + self.timer = nil; + } +} + +@end + +@implementation Collectioncell +-(instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self){ + self.icon = [UIImageView new]; + self.icon.layer.masksToBounds = YES; + [self.contentView addSubview:self.icon]; + self.icon.frame = self.contentView.bounds; + self.contentView.layer.masksToBounds = YES; + } + return self; +} + +- (void)setParam:(WMZBannerParam *)param{ + _param = param; + self.icon.contentMode = param.wImageFill?UIViewContentModeScaleAspectFill:UIViewContentModeScaleToFill; +} +@end + +@implementation CollectionTextCell +-(instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self){ + self.contentView.backgroundColor = [UIColor whiteColor]; + self.label = [UILabel new]; + self.label.font = [UIFont systemFontOfSize:17.0]; + self.label.textColor = [UIColor redColor]; + [self.contentView addSubview:self.label]; + self.label.frame = CGRectMake(10, 0, frame.size.width-20, frame.size.height); + } + return self; +} + +- (void)setParam:(WMZBannerParam *)param{ + _param = param; + self.label.textColor = self.param.wMarqueeTextColor; +} +@end diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..5d07fe5 --- /dev/null +++ b/Podfile @@ -0,0 +1,32 @@ +# Uncomment the next line to define a global platform for your project + platform :ios, '15.0' + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" + config.build_settings['EXCLUDED_ARCHITECTURES'] = 'i386' + end + end +end + +target 'BeeReel' do + + use_frameworks! + + pod 'SVProgressHUD' #HUD + pod 'Moya' #网络框架 + pod 'SmartCodable' #数据解析 + pod 'Kingfisher' #图片加载 + pod 'SnapKit' #布局 + pod 'Toast' #吐司提示 +# pod 'YYKit' #工具类 + pod 'SJVideoPlayer' #播放器 + pod 'WMZPageController' #分页控制器 + pod 'YYCategories' + pod 'YYText' + pod 'FSPagerView' #banner + + +end