From 1914557261bcfdae51ee086be80695804589ec27 Mon Sep 17 00:00:00 2001 From: zjx Date: Tue, 1 Jul 2025 14:33:05 +0800 Subject: [PATCH] =?UTF-8?q?=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 --- BeeReel.xcodeproj/project.pbxproj | 64 ++++++ .../Base/Controller/BRViewController.swift | 8 +- BeeReel/Base/Extension/UIColor+BRAdd.swift | 8 + .../Extension/UIScrollView+BRRefresh.swift | 57 ++++++ BeeReel/Base/Network/API/BRHomeAPI.swift | 26 +++ BeeReel/Base/Network/Base/BRNetwork.swift | 16 +- .../BRHomeTop10ViewController.swift | 164 ++++++++++++++- .../Controller/BRHomeViewController.swift | 53 +++-- .../BRNewReleasesViewController.swift | 125 ++++++++++++ .../BRPopularPicksViewController.swift | 174 ++++++++++++++++ .../BRSpotlightViewViewController.swift | 3 +- BeeReel/Class/Home/Model/BRShortModel.swift | 6 +- .../PopularPicks/BRPopularPicksCell.swift | 125 ++++++++++++ .../BRPopularPicksSmallCell.swift | 38 ++++ .../View/Spotlight/BRSpotlightTopCell.swift | 28 +++ .../Spotlight/BRSpotlightTopMainCell.swift | 1 + .../Home/View/Top10/BRHomeTop10Cell.swift | 167 +++++++++++++++ .../Home/View/Top10/BRHomeTop3Cell.swift | 110 ++++++++++ BeeReel/Delegate/AppDelegate+BRConfig.swift | 5 + .../icon/num_icon_01.imageset/Contents.json | 22 ++ .../icon/num_icon_01.imageset/箭头@2x.png | Bin 0 -> 304 bytes .../icon/num_icon_01.imageset/箭头@3x.png | Bin 0 -> 413 bytes .../number_bg_icon_01.imageset/Contents.json | 22 ++ .../Ellipse 9@2x.png | Bin 0 -> 3927 bytes .../Ellipse 9@3x.png | Bin 0 -> 7470 bytes .../number_icon_01.imageset/Contents.json | 22 ++ .../icon/number_icon_01.imageset/金 1@2x.png | Bin 0 -> 6483 bytes .../icon/number_icon_01.imageset/金 1@3x.png | Bin 0 -> 12181 bytes .../number_icon_02.imageset/Contents.json | 22 ++ .../icon/number_icon_02.imageset/金 2@2x.png | Bin 0 -> 6419 bytes .../icon/number_icon_02.imageset/金 2@3x.png | Bin 0 -> 12081 bytes .../number_icon_03.imageset/Contents.json | 22 ++ .../icon/number_icon_03.imageset/铜 1@2x.png | Bin 0 -> 6895 bytes .../icon/number_icon_03.imageset/铜 1@3x.png | Bin 0 -> 13028 bytes .../icon/top_button_01.imageset/Contents.json | 22 ++ .../top_button_01.imageset/Frame 21@2x.png | Bin 0 -> 473 bytes .../top_button_01.imageset/Frame 21@3x.png | Bin 0 -> 683 bytes .../top_bg_image_01.imageset/Contents.json | 44 ++++ .../image/top_bg_image_01.imageset/bg@2x.png | Bin 0 -> 5099 bytes .../image/top_bg_image_01.imageset/bg@3x.png | Bin 0 -> 7614 bytes .../WaterfallMutiSectionFlowLayout.swift | 193 ++++++++++++++++++ Podfile | 2 +- 42 files changed, 1510 insertions(+), 39 deletions(-) create mode 100644 BeeReel/Base/Extension/UIScrollView+BRRefresh.swift create mode 100644 BeeReel/Class/Home/Controller/BRNewReleasesViewController.swift create mode 100644 BeeReel/Class/Home/Controller/BRPopularPicksViewController.swift create mode 100644 BeeReel/Class/Home/View/PopularPicks/BRPopularPicksCell.swift create mode 100644 BeeReel/Class/Home/View/PopularPicks/BRPopularPicksSmallCell.swift create mode 100644 BeeReel/Class/Home/View/Top10/BRHomeTop10Cell.swift create mode 100644 BeeReel/Class/Home/View/Top10/BRHomeTop3Cell.swift create mode 100644 BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/箭头@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/箭头@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_bg_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_bg_icon_01.imageset/Ellipse 9@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_bg_icon_01.imageset/Ellipse 9@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_01.imageset/金 1@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_01.imageset/金 1@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/金 2@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/金 2@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_03.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_03.imageset/铜 1@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/number_icon_03.imageset/铜 1@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/top_button_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/icon/top_button_01.imageset/Frame 21@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/icon/top_button_01.imageset/Frame 21@3x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/top_bg_image_01.imageset/Contents.json create mode 100644 BeeReel/Sources/Assets.xcassets/image/top_bg_image_01.imageset/bg@2x.png create mode 100644 BeeReel/Sources/Assets.xcassets/image/top_bg_image_01.imageset/bg@3x.png create mode 100644 BeeReel/Thirdparty/FlowLayout/WaterfallMutiSectionFlowLayout.swift diff --git a/BeeReel.xcodeproj/project.pbxproj b/BeeReel.xcodeproj/project.pbxproj index 30e0a62..7a15c39 100644 --- a/BeeReel.xcodeproj/project.pbxproj +++ b/BeeReel.xcodeproj/project.pbxproj @@ -90,6 +90,14 @@ 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 */; }; + BFC676A42E129D60006659E5 /* BRHomeTop10Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676A32E129D5A006659E5 /* BRHomeTop10Cell.swift */; }; + BFC676A72E12AF04006659E5 /* WaterfallMutiSectionFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676A52E12AF04006659E5 /* WaterfallMutiSectionFlowLayout.swift */; }; + BFC676AB2E1372BD006659E5 /* BRHomeTop3Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676AA2E1372BD006659E5 /* BRHomeTop3Cell.swift */; }; + BFC676B12E137D2F006659E5 /* BRPopularPicksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676B02E137D2F006659E5 /* BRPopularPicksViewController.swift */; }; + BFC676B72E137DFC006659E5 /* BRPopularPicksCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676B62E137DFC006659E5 /* BRPopularPicksCell.swift */; }; + BFC676B92E1385FC006659E5 /* BRPopularPicksSmallCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676B82E1385FC006659E5 /* BRPopularPicksSmallCell.swift */; }; + BFC676BC2E138ABB006659E5 /* BRNewReleasesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676BB2E138ABB006659E5 /* BRNewReleasesViewController.swift */; }; + BFC676BE2E13A8EB006659E5 /* UIScrollView+BRRefresh.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFC676BD2E13A8DD006659E5 /* UIScrollView+BRRefresh.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -189,6 +197,14 @@ 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 = ""; }; + BFC676A32E129D5A006659E5 /* BRHomeTop10Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeTop10Cell.swift; sourceTree = ""; }; + BFC676A52E12AF04006659E5 /* WaterfallMutiSectionFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaterfallMutiSectionFlowLayout.swift; sourceTree = ""; }; + BFC676AA2E1372BD006659E5 /* BRHomeTop3Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRHomeTop3Cell.swift; sourceTree = ""; }; + BFC676B02E137D2F006659E5 /* BRPopularPicksViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPopularPicksViewController.swift; sourceTree = ""; }; + BFC676B62E137DFC006659E5 /* BRPopularPicksCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPopularPicksCell.swift; sourceTree = ""; }; + BFC676B82E1385FC006659E5 /* BRPopularPicksSmallCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRPopularPicksSmallCell.swift; sourceTree = ""; }; + BFC676BB2E138ABB006659E5 /* BRNewReleasesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BRNewReleasesViewController.swift; sourceTree = ""; }; + BFC676BD2E13A8DD006659E5 /* UIScrollView+BRRefresh.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScrollView+BRRefresh.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 = ""; }; @@ -308,6 +324,7 @@ BF692AF72E0A480E00A5C2DA /* Thirdparty */ = { isa = PBXGroup; children = ( + BFC676A62E12AF04006659E5 /* FlowLayout */, BFC676612E0E2C8E006659E5 /* WMZBanner */, BF692B292E0A84F700A5C2DA /* JXUUID */, ); @@ -353,6 +370,7 @@ BF692B0C2E0A7A9A00A5C2DA /* Extension */ = { isa = PBXGroup; children = ( + BFC676BD2E13A8DD006659E5 /* UIScrollView+BRRefresh.swift */, BFC6768C2E123D67006659E5 /* AttributedString+BRAdd.swift */, BFC6767A2E0E9736006659E5 /* UIStackView+BRAdd.swift */, BFC6766E2E0E3B51006659E5 /* UIImageView+BRAdd.swift */, @@ -517,6 +535,8 @@ BF692B6A2E0BC85300A5C2DA /* BRHomeViewController.swift */, BFC676702E0E9234006659E5 /* BRSpotlightViewViewController.swift */, BFC6769C2E129794006659E5 /* BRHomeTop10ViewController.swift */, + BFC676B02E137D2F006659E5 /* BRPopularPicksViewController.swift */, + BFC676BB2E138ABB006659E5 /* BRNewReleasesViewController.swift */, ); path = Controller; sourceTree = ""; @@ -524,6 +544,9 @@ BF692B6C2E0BD4B200A5C2DA /* View */ = { isa = PBXGroup; children = ( + BFC676BA2E138A9A006659E5 /* NewReleases */, + BFC676AC2E137687006659E5 /* PopularPicks */, + BFC6769E2E129CE5006659E5 /* Top10 */, BFC676762E0E950A006659E5 /* Spotlight */, BF692B6D2E0BD4CB00A5C2DA /* BRHomeHeaderView.swift */, BFC6766A2E0E395F006659E5 /* BRHomeHeaderBannerCell.swift */, @@ -607,6 +630,39 @@ path = Spotlight; sourceTree = ""; }; + BFC6769E2E129CE5006659E5 /* Top10 */ = { + isa = PBXGroup; + children = ( + BFC676A32E129D5A006659E5 /* BRHomeTop10Cell.swift */, + BFC676AA2E1372BD006659E5 /* BRHomeTop3Cell.swift */, + ); + path = Top10; + sourceTree = ""; + }; + BFC676A62E12AF04006659E5 /* FlowLayout */ = { + isa = PBXGroup; + children = ( + BFC676A52E12AF04006659E5 /* WaterfallMutiSectionFlowLayout.swift */, + ); + path = FlowLayout; + sourceTree = ""; + }; + BFC676AC2E137687006659E5 /* PopularPicks */ = { + isa = PBXGroup; + children = ( + BFC676B62E137DFC006659E5 /* BRPopularPicksCell.swift */, + BFC676B82E1385FC006659E5 /* BRPopularPicksSmallCell.swift */, + ); + path = PopularPicks; + sourceTree = ""; + }; + BFC676BA2E138A9A006659E5 /* NewReleases */ = { + isa = PBXGroup; + children = ( + ); + path = NewReleases; + sourceTree = ""; + }; DF948F1E234E75684255568B /* Frameworks */ = { isa = PBXGroup; children = ( @@ -736,7 +792,9 @@ buildActionMask = 2147483647; files = ( BFC676992E1280E3006659E5 /* BRSpotlightRecommandCell.swift in Sources */, + BFC676A42E129D60006659E5 /* BRHomeTop10Cell.swift in Sources */, BF692B3C2E0A8D0200A5C2DA /* BRNavigationController.swift in Sources */, + BFC676B12E137D2F006659E5 /* BRPopularPicksViewController.swift in Sources */, BFC676692E0E34DA006659E5 /* BRUserAPI.swift in Sources */, BFC676782E0E9553006659E5 /* BRSpotlightMainBaseCell.swift in Sources */, BFC676732E0E938B006659E5 /* BRTableView.swift in Sources */, @@ -765,10 +823,12 @@ BF692B102E0A7B4300A5C2DA /* BRUserDefaultsKey.swift in Sources */, BFC676852E122D9E006659E5 /* BRVideoDetailViewController.swift in Sources */, BFC676912E126248006659E5 /* BRSpotlightTopCell.swift in Sources */, + BFC676B72E137DFC006659E5 /* BRPopularPicksCell.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 */, + BFC676BC2E138ABB006659E5 /* BRNewReleasesViewController.swift in Sources */, BF692B5F2E0B812800A5C2DA /* BRTabBarItemContainer.swift in Sources */, BF692B652E0BC53900A5C2DA /* CGMutablePath+BRRoundedCorner.swift in Sources */, BFC676752E0E93B3006659E5 /* BRTableViewCell.swift in Sources */, @@ -776,6 +836,7 @@ BF692B092E0A775500A5C2DA /* BRLoginToken.swift in Sources */, BF692AFC2E0A6F8000A5C2DA /* BRNetworkTarget.swift in Sources */, BF692B3A2E0A8C6000A5C2DA /* BRViewController.swift in Sources */, + BFC676BE2E13A8EB006659E5 /* UIScrollView+BRRefresh.swift in Sources */, BF692B182E0A7D8900A5C2DA /* BRToast.swift in Sources */, BF692B0E2E0A7AF300A5C2DA /* UserDefaults+BRAdd.swift in Sources */, BF692B582E0AAA6F00A5C2DA /* UIScreen+BRAdd.swift in Sources */, @@ -783,6 +844,7 @@ BF692B612E0B814F00A5C2DA /* BRTabBarItemContentView.swift in Sources */, BF692B012E0A74A200A5C2DA /* BRDefine.swift in Sources */, BFC6767B2E0E973B006659E5 /* UIStackView+BRAdd.swift in Sources */, + BFC676AB2E1372BD006659E5 /* BRHomeTop3Cell.swift in Sources */, BFC676892E122FDD006659E5 /* BRVideoAPI.swift in Sources */, BFC6769B2E1285C5006659E5 /* BRPagerViewTransformer.swift in Sources */, BFC676832E122CC5006659E5 /* BRPlayerViewModel.swift in Sources */, @@ -809,8 +871,10 @@ BF692B562E0AA92100A5C2DA /* BRCollectionViewCell.swift in Sources */, BF692B072E0A771C00A5C2DA /* BRModel.swift in Sources */, BF692B752E0D39D000A5C2DA /* BRListModel.swift in Sources */, + BFC676B92E1385FC006659E5 /* BRPopularPicksSmallCell.swift in Sources */, BF692B512E0AA8C600A5C2DA /* BRPlayerListViewController.swift in Sources */, BFC676522E0D4EFD006659E5 /* BRHomeViewModel.swift in Sources */, + BFC676A72E12AF04006659E5 /* WaterfallMutiSectionFlowLayout.swift in Sources */, BF692B2A2E0A84F700A5C2DA /* JXUUID.m in Sources */, BF692B2B2E0A84F700A5C2DA /* PDKeyChain.m in Sources */, BFC6766B2E0E395F006659E5 /* BRHomeHeaderBannerCell.swift in Sources */, diff --git a/BeeReel/Base/Controller/BRViewController.swift b/BeeReel/Base/Controller/BRViewController.swift index 81ff9f3..92025e9 100644 --- a/BeeReel/Base/Controller/BRViewController.swift +++ b/BeeReel/Base/Controller/BRViewController.swift @@ -48,7 +48,11 @@ class BRViewController: UIViewController { return statusBarStyle } - func handleHeaderRefresh(_ completer: (() -> Void)?) {} + func handleHeaderRefresh(_ completer: (() -> Void)?) { + completer?() + } - func handleFooterRefresh(_ completer: (() -> Void)?) {} + func handleFooterRefresh(_ completer: (() -> Void)?) { + completer?() + } } diff --git a/BeeReel/Base/Extension/UIColor+BRAdd.swift b/BeeReel/Base/Extension/UIColor+BRAdd.swift index 930d0ba..63b8d65 100644 --- a/BeeReel/Base/Extension/UIColor+BRAdd.swift +++ b/BeeReel/Base/Extension/UIColor+BRAdd.swift @@ -50,4 +50,12 @@ extension UIColor { static func colorFF7489(alpha: CGFloat = 1) -> UIColor { return UIColor(rgb: 0xFF7489, alpha: alpha) } + + static func color777777(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0x777777, alpha: alpha) + } + + static func colorE3FC37(alpha: CGFloat = 1) -> UIColor { + return UIColor(rgb: 0xE3FC37, alpha: alpha) + } } diff --git a/BeeReel/Base/Extension/UIScrollView+BRRefresh.swift b/BeeReel/Base/Extension/UIScrollView+BRRefresh.swift new file mode 100644 index 0000000..5e6382b --- /dev/null +++ b/BeeReel/Base/Extension/UIScrollView+BRRefresh.swift @@ -0,0 +1,57 @@ +// +// UIScrollView+BRRefresh.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/7/1. +// + +import UIKit +import MJRefresh + +extension UIScrollView { + + func br_addRefreshHeader(insetTop: CGFloat = 0, block: (() -> Void)?) { + + + self.mj_header = MJRefreshNormalHeader(refreshingBlock: { + block?() + }) + self.mj_header?.ignoredScrollViewContentInsetTop = insetTop + } + + func br_addRefreshFooter(insetBottom: CGFloat = 0, block: (() -> Void)?) { + let footer = MJRefreshAutoNormalFooter(refreshingBlock: { + block?() + }) + footer.ignoredScrollViewContentInsetBottom = insetBottom + + self.mj_footer = footer + } + + + func br_addRefreshBackFooter(insetBottom: CGFloat = 0, block: (() -> Void)?) { + self.mj_footer = MJRefreshBackNormalFooter(refreshingBlock: { + block?() + }) + + self.mj_footer?.ignoredScrollViewContentInsetBottom = insetBottom + } + + func br_endHeaderRefreshing() { + self.mj_header?.endRefreshing() + } + + func br_endFooterRefreshing() { + if self.mj_footer?.state == .noMoreData { return } + self.mj_footer?.endRefreshing() + } + + ///重置没有更多 + func br_resetNoMoreData() { + self.mj_footer?.resetNoMoreData() + } + + func br_endRefreshingWithNoMoreData() { + self.mj_footer?.endRefreshingWithNoMoreData() + } +} diff --git a/BeeReel/Base/Network/API/BRHomeAPI.swift b/BeeReel/Base/Network/API/BRHomeAPI.swift index 0ad9ca4..2d97e19 100644 --- a/BeeReel/Base/Network/API/BRHomeAPI.swift +++ b/BeeReel/Base/Network/API/BRHomeAPI.swift @@ -28,5 +28,31 @@ class BRHomeAPI { } } + ///受欢迎的短剧 + static func requestPopularPicksList(completer: ((_ list: [BRShortModel]?) -> Void)?) { + var param = BRNetworkParameters(path: "/highestPaymentAndHottestVideo") + param.method = .get + param.parameters = [ + "buy_count_num" : "0", + "hottest_num" : "20" + ] + + BRNetwork.request(parameters: param) { (response: BRNetworkResponse>) in + completer?(response.data?.list) + } + } + + static func requestNewReleasesList(page: Int, completer: ((_ list: [BRShortModel]?) -> Void)?) { + var param = BRNetworkParameters(path: "/newShortPlayList") + param.method = .get + param.parameters = [ + "current_page" : page, + "page_size" : "20" + ] + + BRNetwork.request(parameters: param) { (response: BRNetworkResponse>) in + completer?(response.data?.list) + } + } } diff --git a/BeeReel/Base/Network/Base/BRNetwork.swift b/BeeReel/Base/Network/Base/BRNetwork.swift index e5ef104..2faa6e3 100644 --- a/BeeReel/Base/Network/Base/BRNetwork.swift +++ b/BeeReel/Base/Network/Base/BRNetwork.swift @@ -117,19 +117,13 @@ struct BRNetwork { 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) + let response: BRNetworkResponse = _deserialize(data: tempData) + if response.code != BRNetworkCodeSucceed { + if parameters.isToast { + BRToast.show(text: response.msg) } } + completion?(response) } catch { var res = BRNetworkResponse() diff --git a/BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift b/BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift index 1548dca..56cd66e 100644 --- a/BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift +++ b/BeeReel/Class/Home/Controller/BRHomeTop10ViewController.swift @@ -10,33 +10,181 @@ import UIKit class BRHomeTop10ViewController: BRViewController { - private lazy var dataArr: [BRShortModel] = [] + private lazy var dataArr: [[BRShortModel]] = [] -// private lazy var collectionView: BRCollectionView = { -// let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: <#T##UICollectionViewLayout#>) -// }() + private lazy var collectionViewLayout: WaterfallMutiSectionFlowLayout = { + let layout = WaterfallMutiSectionFlowLayout() + layout.delegate = self + return layout + }() + + private lazy var collectionView: BRCollectionView = { + let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.customTabBarHeight + 10, right: 0) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.register(BRHomeTop10Cell.self, forCellWithReuseIdentifier: "cell") + collectionView.register(BRHomeTop3Cell.self, forCellWithReuseIdentifier: "BRHomeTop3Cell") + return collectionView + }() override func viewDidLoad() { super.viewDidLoad() requestDataArr() + + br_setupUI() } - + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + requestDataArr { + completer?() + } + } } extension BRHomeTop10ViewController { - private func requestDataArr() { + private func br_setupUI() { + view.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.bottom.equalToSuperview() + make.top.equalToSuperview().offset(20) + } + } + + +} + +//MARK: -------------- WMZPageProtocol -------------- +extension BRHomeTop10ViewController: WMZPageProtocol { + + func getMyScrollView() -> UIScrollView { + return self.collectionView + } +} + + +//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource -------------- +extension BRHomeTop10ViewController: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let model = self.dataArr[indexPath.section][indexPath.row] + + if indexPath.section == 0 { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "BRHomeTop3Cell", for: indexPath) as! BRHomeTop3Cell + cell.model = model + cell.num = indexPath.row + 1 + return cell + } else { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRHomeTop10Cell + cell.model = model + cell.num = indexPath.row + 4 + return cell + } + } + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return self.dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr[section].count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.dataArr[indexPath.section][indexPath.row] + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } +} + +//MARK: -------------- WaterfallMutiSectionDelegate -------------- +extension BRHomeTop10ViewController: WaterfallMutiSectionDelegate { + + func heightForRowAtIndexPath(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, indexPath: IndexPath, itemWidth: CGFloat) -> CGFloat { + if indexPath.section == 0 { + if indexPath.row == 0 { + return 240 + } else { + return 115 + } + } + return 126 + } + + func columnNumber(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> Int { + if section == 0 { + return 2 + } else { + return 1 + } + } + + func lineSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat { + if section == 0 { + return 10 + } else { + return 12 + } + } + + func interitemSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat { + return 10 + } + + func referenceSizeForHeader(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGSize { + if section > 0 { + return .init(width: UIScreen.width, height: 10) + } else { + return .zero + } + } + + func insetForSection(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> UIEdgeInsets { + return .init(top: 0, left: 15, bottom: 0, right: 15) + } +} + +extension BRHomeTop10ViewController { + + private func requestDataArr(completer: (() -> Void)? = nil) { BRHomeAPI.requestTop10List { [weak self] list in guard let self = self else { return } - guard let list = list else { return } - self.dataArr = list + guard let list = list else { + completer?() + return + } + self.dataArr.removeAll() + + var arr1: [BRShortModel] = [] + var arr2: [BRShortModel] = [] + + list.enumerated().forEach { + if $0 < 3 { + arr1.append($1) + } else { + arr2.append($1) + } + } + if arr1.count > 0 { + self.dataArr.append(arr1) + } + if arr2.count > 0 { + self.dataArr.append(arr2) + } + self.collectionView.reloadData() + + completer?() } } diff --git a/BeeReel/Class/Home/Controller/BRHomeViewController.swift b/BeeReel/Class/Home/Controller/BRHomeViewController.swift index 0aa13c5..9c8a9fa 100644 --- a/BeeReel/Class/Home/Controller/BRHomeViewController.swift +++ b/BeeReel/Class/Home/Controller/BRHomeViewController.swift @@ -23,12 +23,14 @@ class BRHomeViewController: BRViewController { return [ spotlightVC, BRHomeTop10ViewController(), - BRViewController(), - BRViewController(), + BRPopularPicksViewController(), + BRNewReleasesViewController(), BRViewController() ] }() + private lazy var requestGroup = DispatchGroup() + private lazy var pageParam: WMZPageParam = { let param = WMZPageParam() param.wTitleArr = [ @@ -75,7 +77,7 @@ class BRHomeViewController: BRViewController { return 0 } param.wCustomTabbarY = { _ in - return UIScreen.customTabBarHeight + return 0 } @@ -96,6 +98,9 @@ class BRHomeViewController: BRViewController { let view = WMZPageView(frame: self.view.bounds, autoFix: true, param: pageParam, parentReponder: self) view.backgroundColor = .clear view.downSc?.backgroundColor = .clear + view.downSc?.br_addRefreshHeader { [weak self] in + self?.handleHeaderRefresh(nil) + } return view }() @@ -162,6 +167,25 @@ class BRHomeViewController: BRViewController { } } + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + + self.requestGroup.enter() + requestHomeData { [weak self] in + self?.requestGroup.leave() + } + + if let vc = self.pageView.upSc.currentVC as? BRViewController { + self.requestGroup.enter() + vc.handleHeaderRefresh { [weak self] in + self?.requestGroup.leave() + } + } + + self.requestGroup.notify(queue: .main) { [weak self] in + self?.pageView.downSc?.br_endHeaderRefreshing() + } + + } } @@ -215,21 +239,24 @@ extension BRHomeViewController { extension BRHomeViewController { - private func requestHomeData() { + private func requestHomeData(completer: (() -> Void)? = nil) { 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 + if let list = list { + 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.spotlightVC.reloadData() self.updateStatusBarStyle() + completer?() } } diff --git a/BeeReel/Class/Home/Controller/BRNewReleasesViewController.swift b/BeeReel/Class/Home/Controller/BRNewReleasesViewController.swift new file mode 100644 index 0000000..eefebf5 --- /dev/null +++ b/BeeReel/Class/Home/Controller/BRNewReleasesViewController.swift @@ -0,0 +1,125 @@ +// +// BRNewReleasesViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/7/1. +// + +import UIKit + +class BRNewReleasesViewController: BRViewController { + + + private lazy var dataArr: [BRShortModel] = [] + + private lazy var page: Int = 1 + + 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.contentInset = .init(top: 0, left: 0, bottom: UIScreen.customTabBarHeight + 10, right: 0) + collectionView.br_addRefreshBackFooter(insetBottom: 0) { [weak self] in + self?.handleFooterRefresh(nil) + } + collectionView.register(BRSpotlightNewCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + override func viewDidLoad() { + super.viewDidLoad() + + requestDataArr(page: 1) + + br_setupUI() + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: 1) { + completer?() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + requestDataArr(page: self.page + 1) { [weak self] in + self?.collectionView.br_endFooterRefreshing() + } + } + +} + +extension BRNewReleasesViewController { + + private func br_setupUI() { + view.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.left.right.equalToSuperview() + make.top.equalToSuperview().offset(20) + make.bottom.equalToSuperview() + } + } + +} + +//MARK: -------------- WMZPageProtocol -------------- +extension BRNewReleasesViewController: WMZPageProtocol { + func getMyScrollView() -> UIScrollView { + return self.collectionView + } +} + +//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource -------------- +extension BRNewReleasesViewController: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRSpotlightNewCell + cell.model = self.dataArr[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = dataArr[indexPath.row] + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } +} + +extension BRNewReleasesViewController { + + private func requestDataArr(page: Int, completer: (() -> Void)? = nil) { + + BRHomeAPI.requestNewReleasesList(page: page) { [weak self] list in + guard let self = self else { return } + if let list = list { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += list + self.page = page + + self.collectionView.reloadData() + } + completer?() + } + } + +} + diff --git a/BeeReel/Class/Home/Controller/BRPopularPicksViewController.swift b/BeeReel/Class/Home/Controller/BRPopularPicksViewController.swift new file mode 100644 index 0000000..9daf21b --- /dev/null +++ b/BeeReel/Class/Home/Controller/BRPopularPicksViewController.swift @@ -0,0 +1,174 @@ +// +// BRPopularPicksViewController.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/7/1. +// + +import UIKit + +class BRPopularPicksViewController: BRViewController { + + + private lazy var dataArr: [BRShortModel] = [] + + private lazy var contentView: UIView = { + let view = UIView() + view.backgroundColor = .colorFFFFFF() + view.layer.cornerRadius = 10 + view.layer.masksToBounds = true + return view + }() + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: UIScreen.width - 90 - 20, height: 196) + layout.sectionInset = .init(top: 10, left: 10, bottom: 0, right: 10) + layout.minimumLineSpacing = 10 + return layout + }() + + private lazy var collectionView: BRCollectionView = { + let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.contentInset = .init(top: 0, left: 0, bottom: 10, right: 0) + collectionView.register(BRPopularPicksCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + private lazy var smallCollectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.itemSize = .init(width: 44, height: 58) + layout.minimumLineSpacing = 10 + return layout + }() + + private lazy var smallCollectionView: BRCollectionView = { + let collectionView = BRCollectionView(frame: .zero, collectionViewLayout: smallCollectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.register(BRPopularPicksSmallCell.self, forCellWithReuseIdentifier: "cell") + return collectionView + }() + + private lazy var topButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "top_button_01"), for: .normal) + button.addTarget(self, action: #selector(handleTopButton), for: .touchUpInside) + return button + }() + + override func viewDidLoad() { + super.viewDidLoad() + + br_setupUI() + + requestDataArr() + } + + + @objc private func handleTopButton() { + + collectionView.scrollToTop(animated: true) + smallCollectionView.scrollToTop(animated: true) + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + requestDataArr { + completer?() + } + } + +} + +extension BRPopularPicksViewController { + + private func br_setupUI() { + view.addSubview(contentView) + contentView.addSubview(collectionView) + view.addSubview(smallCollectionView) + view.addSubview(topButton) + + contentView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.right.equalToSuperview().offset(-75) + make.top.equalToSuperview().offset(20) + make.bottom.equalToSuperview().offset(-(UIScreen.customTabBarHeight + 15)) + } + + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + smallCollectionView.snp.makeConstraints { make in + make.top.equalTo(contentView) + make.right.equalToSuperview().offset(-15) + make.width.equalTo(self.smallCollectionViewLayout.itemSize.width) +// make.bottom.equalTo(contentView) + make.bottom.equalTo(topButton.snp.top).offset(-10) + } + + topButton.snp.makeConstraints { make in + make.centerX.equalTo(smallCollectionView) + make.bottom.equalTo(contentView) + } + } + +} + +//MARK: -------------- WMZPageProtocol -------------- +extension BRPopularPicksViewController: WMZPageProtocol { + func getMyScrollViews() -> [UIScrollView] { + return [self.collectionView, self.smallCollectionView] + } +} + +//MARK: -------------- UICollectionViewDelegate UICollectionViewDataSource -------------- +extension BRPopularPicksViewController: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let model = self.dataArr[indexPath.row] + if collectionView == self.collectionView { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRPopularPicksCell + cell.model = model + return cell + } else { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! BRPopularPicksSmallCell + cell.model = model + return cell + } + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr.count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.dataArr[indexPath.row] + + let vc = BRVideoDetailViewController() + vc.shortPlayId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } +} + + +extension BRPopularPicksViewController { + + private func requestDataArr(completer: (() -> Void)? = nil) { + + BRHomeAPI.requestPopularPicksList { [weak self] list in + guard let self = self else { return } + + if let list = list { + self.dataArr = list + self.collectionView.reloadData() + self.smallCollectionView.reloadData() + } + completer?() + } + } + +} diff --git a/BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift b/BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift index 4ef9fa4..d31403d 100644 --- a/BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift +++ b/BeeReel/Class/Home/Controller/BRSpotlightViewViewController.swift @@ -15,6 +15,7 @@ class BRSpotlightViewViewController: BRViewController, WMZPageProtocol { let tableView = BRTableView(frame: .zero, style: .plain) tableView.delegate = self tableView.dataSource = self + tableView.contentInset = .init(top: 0, left: 0, bottom: UIScreen.customTabBarHeight, right: 0) 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) @@ -46,7 +47,7 @@ extension BRSpotlightViewViewController { tableView.snp.makeConstraints { make in make.left.right.bottom.equalToSuperview() - make.top.equalToSuperview().offset(15) + make.top.equalToSuperview().offset(20) } } diff --git a/BeeReel/Class/Home/Model/BRShortModel.swift b/BeeReel/Class/Home/Model/BRShortModel.swift index 57a3f5f..d456906 100644 --- a/BeeReel/Class/Home/Model/BRShortModel.swift +++ b/BeeReel/Class/Home/Model/BRShortModel.swift @@ -45,7 +45,7 @@ class BRShortModel: BRModel, SmartCodable { var all_coins: String? var buy_type: String? var collect_total: Int? - var vp_description: String? + var br_description: String? var episode_total: Int? var horizontally_img: String? var image_url: String? @@ -70,12 +70,12 @@ class BRShortModel: BRModel, SmartCodable { @IgnoredKey var titleAttributedString: NSAttributedString? @IgnoredKey - var vp_isSelected: Bool? + var br_isSelected: Bool? static func mappingForKey() -> [SmartKeyTransformer]? { return [ - CodingKeys.vp_description <--- ["description", "short_video_description"], + CodingKeys.br_description <--- ["description", "short_video_description"], CodingKeys.name <--- ["short_video_title", "name"] ] } diff --git a/BeeReel/Class/Home/View/PopularPicks/BRPopularPicksCell.swift b/BeeReel/Class/Home/View/PopularPicks/BRPopularPicksCell.swift new file mode 100644 index 0000000..7e108e9 --- /dev/null +++ b/BeeReel/Class/Home/View/PopularPicks/BRPopularPicksCell.swift @@ -0,0 +1,125 @@ +// +// BRPopularPicksCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/7/1. +// + +import UIKit + +class BRPopularPicksCell: BRCollectionViewCell { + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + titleLabel.text = model?.name + categoryLabel.text = model?.category?.first + desLabel.text = model?.br_description + + hotView.setNeedsUpdateConfiguration() + } + } + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + imageView.layer.cornerRadius = 8 + imageView.layer.masksToBounds = true + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 14) + label.textColor = .color1C1C1C() + label.numberOfLines = 3 + return label + }() + + private lazy var categoryLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 10) + label.textColor = .color899D00() + return label + }() + + private lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 10) + label.textColor = .color777777() + label.numberOfLines = 4 + 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 BRPopularPicksCell { + + private func br_setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(categoryLabel) + contentView.addSubview(desLabel) + contentView.addSubview(hotView) + + coverImageView.snp.makeConstraints { make in + make.left.top.bottom.equalToSuperview() + make.width.equalTo(152) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(10) + make.right.lessThanOrEqualToSuperview().offset(-10) + make.centerY.equalTo(self.contentView.snp.top).offset(30) + } + + categoryLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalToSuperview().offset(75) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.right.lessThanOrEqualToSuperview().offset(-10) + make.centerY.equalTo(self.contentView.snp.top).offset(27.5 + 94) + } + + hotView.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalToSuperview().offset(-17) + } + + } + +} diff --git a/BeeReel/Class/Home/View/PopularPicks/BRPopularPicksSmallCell.swift b/BeeReel/Class/Home/View/PopularPicks/BRPopularPicksSmallCell.swift new file mode 100644 index 0000000..fad143c --- /dev/null +++ b/BeeReel/Class/Home/View/PopularPicks/BRPopularPicksSmallCell.swift @@ -0,0 +1,38 @@ +// +// BRPopularPicksSmallCell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/7/1. +// + +import UIKit + +class BRPopularPicksSmallCell: BRCollectionViewCell { + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + } + } + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + imageView.layer.cornerRadius = 4 + imageView.layer.masksToBounds = true + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + contentView.addSubview(coverImageView) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift index 73cebe4..17c58fd 100644 --- a/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopCell.swift @@ -20,6 +20,23 @@ class BRSpotlightTopCell: BRCollectionViewCell { } } + var num: Int = 0 { + didSet { + switch num { + case 1: + numView.image = UIImage(named: "number_icon_01") + numView.isHidden = false + case 2: + numView.image = UIImage(named: "number_icon_02") + numView.isHidden = false + case 3: + numView.image = UIImage(named: "number_icon_03") + numView.isHidden = false + default: + numView.isHidden = true + } + } + } private lazy var coverImageView: BRImageView = { let imageView = BRImageView() @@ -41,6 +58,11 @@ class BRSpotlightTopCell: BRCollectionViewCell { return imageView }() + private lazy var numView: UIImageView = { + let imageView = UIImageView() + return imageView + }() + private lazy var titleLabel: UILabel = { let label = UILabel() label.font = .fontMedium(ofSize: 12) @@ -98,6 +120,7 @@ extension BRSpotlightTopCell { contentView.addSubview(coverImageView) + coverImageView.addSubview(numView) coverImageView.addSubview(coverMarkView) contentView.addSubview(playImageView) coverImageView.addSubview(textBgView) @@ -109,6 +132,11 @@ extension BRSpotlightTopCell { make.edges.equalToSuperview() } + numView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(10) + make.top.equalToSuperview().offset(10) + } + coverMarkView.snp.makeConstraints { make in make.right.bottom.equalToSuperview() } diff --git a/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift index 37b081a..a8b690c 100644 --- a/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift +++ b/BeeReel/Class/Home/View/Spotlight/BRSpotlightTopMainCell.swift @@ -64,6 +64,7 @@ extension BRSpotlightTopMainCell: UICollectionViewDelegate, UICollectionViewData 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] + cell.num = indexPath.row + 1 return cell } diff --git a/BeeReel/Class/Home/View/Top10/BRHomeTop10Cell.swift b/BeeReel/Class/Home/View/Top10/BRHomeTop10Cell.swift new file mode 100644 index 0000000..5385bfa --- /dev/null +++ b/BeeReel/Class/Home/View/Top10/BRHomeTop10Cell.swift @@ -0,0 +1,167 @@ +// +// BRHomeTop10Cell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + + +class BRHomeTop10Cell: BRCollectionViewCell { + + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + titleLabel.text = model?.name + categoryLabel.text = model?.category?.first + desLabel.text = model?.br_description + + hotView.setNeedsUpdateConfiguration() + } + } + + var num: Int = 0 { + didSet { + numLabel.text = "\(num)" + } + } + + private lazy var bgImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "top_bg_image_01")) + return imageView + }() + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + imageView.layer.cornerRadius = 8 + imageView.layer.masksToBounds = true + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 14) + label.textColor = .color1C1C1C() + return label + }() + + private lazy var categoryLabel: UILabel = { + let label = UILabel() + label.font = .fontRegular(ofSize: 10) + label.textColor = .color899D00() + return label + }() + + private lazy var desLabel: UILabel = { + let label = UILabel() + label.numberOfLines = 2 + label.font = .fontRegular(ofSize: 10) + label.textColor = .color777777() + 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 numBgView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "number_bg_icon_01")) + return imageView + }() + + private lazy var numLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 15) + label.textColor = .color000000() + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRHomeTop10Cell { + + private func br_setupUI() { + contentView.addSubview(bgImageView) + bgImageView.addSubview(coverImageView) + bgImageView.addSubview(titleLabel) + bgImageView.addSubview(categoryLabel) + bgImageView.addSubview(desLabel) + bgImageView.addSubview(hotView) + bgImageView.addSubview(numBgView) + bgImageView.addSubview(numLabel) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.left.equalToSuperview().offset(7) + make.width.equalTo(90) + make.height.equalTo(112) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(20) + make.top.equalToSuperview().offset(16) + make.right.lessThanOrEqualToSuperview().offset(-48) + } + + categoryLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalToSuperview().offset(41) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.top.equalToSuperview().offset(60) + make.right.lessThanOrEqualToSuperview().offset(-48) + } + + hotView.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalToSuperview().offset(-17) + } + + numBgView.snp.makeConstraints { make in + make.centerX.equalTo(self.bgImageView.snp.right).offset(-15) + make.centerY.equalToSuperview().offset(-3) + } + + numLabel.snp.makeConstraints { make in + make.centerX.equalTo(numBgView) + make.centerY.equalToSuperview().offset(3) + } + } + +} diff --git a/BeeReel/Class/Home/View/Top10/BRHomeTop3Cell.swift b/BeeReel/Class/Home/View/Top10/BRHomeTop3Cell.swift new file mode 100644 index 0000000..ec61315 --- /dev/null +++ b/BeeReel/Class/Home/View/Top10/BRHomeTop3Cell.swift @@ -0,0 +1,110 @@ +// +// BRHomeTop3Cell.swift +// BeeReel +// +// Created by 湖南秦九 on 2025/6/30. +// + +import UIKit + +class BRHomeTop3Cell: BRCollectionViewCell { + + + var model: BRShortModel? { + didSet { + coverImageView.br_setImage(url: model?.image_url) + } + } + + var num: Int = 0 { + didSet { + numLabel.text = "NO.\(num)" + if num == 1 { + coverImageView.snp.updateConstraints { make in + make.top.equalToSuperview().offset(32) + } + } else { + coverImageView.snp.updateConstraints { make in + make.top.equalToSuperview().offset(28) + } + } + } + } + + private lazy var coverImageView: BRImageView = { + let imageView = BRImageView() + imageView.layer.cornerRadius = 8 + imageView.layer.masksToBounds = true + return imageView + }() + + private lazy var numLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 14) + label.textColor = .colorE3FC37() + return label + }() + + private lazy var numIconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "num_icon_01")) + return imageView + }() + + private lazy var dotView: UIView = { + let view = UIView() + view.backgroundColor = .colorE3FC37() + view.layer.cornerRadius = 3 + view.layer.masksToBounds = true + return view + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + + self.contentView.backgroundColor = .color1C1C1C() + self.contentView.layer.cornerRadius = 12 + self.contentView.layer.masksToBounds = true + + br_setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension BRHomeTop3Cell { + + private func br_setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(dotView) + contentView.addSubview(numLabel) + contentView.addSubview(numIconImageView) + + coverImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(5) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-5) + make.top.equalToSuperview().offset(32) + } + + dotView.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-5) + make.top.equalToSuperview().offset(12) + make.width.height.equalTo(6) + } + + numLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(5) + make.centerY.equalTo(dotView) + } + + numIconImageView.snp.makeConstraints { make in + make.centerY.equalTo(numLabel) + make.left.equalTo(numLabel.snp.right).offset(10) + } + } + +} diff --git a/BeeReel/Delegate/AppDelegate+BRConfig.swift b/BeeReel/Delegate/AppDelegate+BRConfig.swift index e4c9c80..6452bf1 100644 --- a/BeeReel/Delegate/AppDelegate+BRConfig.swift +++ b/BeeReel/Delegate/AppDelegate+BRConfig.swift @@ -5,10 +5,15 @@ // Created by 湖南秦九 on 2025/6/25. // +import MJRefresh + extension AppDelegate { func addConfig() { UIView.vp_Awake() + + //设置刷新控件的语言 + MJRefreshConfig.default.languageCode = BRLocalizedManager.manager.mjLocalizedKey } } diff --git a/BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/Contents.json new file mode 100644 index 0000000..8d14046 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/num_icon_01.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/icon/num_icon_01.imageset/箭头@2x.png b/BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/箭头@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b54171f5b756334d46d2004dc6abfd8355c639e7 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&N!3HFiZux8nQk(@Ik;M!QVyYm_=ozH)0Vv2= z9OUlAuke>j zmupq7V7B0tIjForCB{j}^Uf}DYa^B3twGMK&Lqv+qqctkWu`wXCq)1EIKM}0QL@VI z$@fYMm%lJtlG5PCp;LCFL~ozRms<;EI6hm-b#05#`&Gu<;wLCJF-Pkx(+3Tu4#5>~ z+PCbvWcSVQOXjiWaHZ2lkN+*^$kuF9xnr`GrT8Ivn+*r3y+5veyrZ$>vK}& x`8T_qKJJ-+6@Bf>w_FKa{&~#~y?t4>jHx-vCg+VO-vWAw!PC{xWt~$(69CRjagzW5 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/箭头@3x.png b/BeeReel/Sources/Assets.xcassets/icon/num_icon_01.imageset/箭头@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2af8efa328cad62af39356d76054cb7caca6eeee GIT binary patch literal 413 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/number_bg_icon_01.imageset/Ellipse 9@3x.png b/BeeReel/Sources/Assets.xcassets/icon/number_bg_icon_01.imageset/Ellipse 9@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..59b4234ac23cf4766c66692ccec3655291c53239 GIT binary patch literal 7470 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/number_icon_01.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/number_icon_01.imageset/Contents.json new file mode 100644 index 0000000..793a9fd --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/number_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/number_icon_01.imageset/金 1@2x.png b/BeeReel/Sources/Assets.xcassets/icon/number_icon_01.imageset/金 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f19c899ecd8a8b2b81612d7693d7ef8b2f7284 GIT binary patch literal 6483 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 XYIu2MIh`yg00000NkvXXu0mjfcWd*_ literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/Contents.json new file mode 100644 index 0000000..d000b87 --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "金 2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "金 2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/金 2@2x.png b/BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/金 2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c97b33508dde8cc7bba72dee84dc357264b236 GIT binary patch literal 6419 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 literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/金 2@3x.png b/BeeReel/Sources/Assets.xcassets/icon/number_icon_02.imageset/金 2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a51625ba32845d0458d1c8c917e300d65cfb22 GIT binary patch literal 12081 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 bs`mc@_W>sg4s+{O00000NkvXXu0mjfTvU%Z literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/number_icon_03.imageset/Contents.json b/BeeReel/Sources/Assets.xcassets/icon/number_icon_03.imageset/Contents.json new file mode 100644 index 0000000..9cb554c --- /dev/null +++ b/BeeReel/Sources/Assets.xcassets/icon/number_icon_03.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/number_icon_03.imageset/铜 1@2x.png b/BeeReel/Sources/Assets.xcassets/icon/number_icon_03.imageset/铜 1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f268baa6711973f68335333f70e5a92c56c04506 GIT binary patch literal 6895 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 P00000NkvXXu0mjf>XE@% literal 0 HcmV?d00001 diff --git a/BeeReel/Sources/Assets.xcassets/icon/top_button_01.imageset/Frame 21@3x.png b/BeeReel/Sources/Assets.xcassets/icon/top_button_01.imageset/Frame 21@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3b6951eef522f0fffb2857817d76bd810afca2de GIT binary patch literal 683 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 CGFloat + + // 可选delegate实现 + /// 每个section 列数(默认2列) + @objc optional func columnNumber(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> Int + + /// header高度(默认为0) + @objc optional func referenceSizeForHeader(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGSize + + /// footer高度(默认为0) + @objc optional func referenceSizeForFooter(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGSize + + /// 每个section 边距(默认为0) + @objc optional func insetForSection(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> UIEdgeInsets + + /// 每个section item上下间距(默认为0) + @objc optional func lineSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat + + /// 每个section item左右间距(默认为0) + @objc optional func interitemSpacing(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat + + /// section头部header与上个section尾部footer间距(默认为0) + @objc optional func spacingWithLastSection(collectionView collection: UICollectionView, layout: WaterfallMutiSectionFlowLayout, section: Int) -> CGFloat +} + +class WaterfallMutiSectionFlowLayout: UICollectionViewFlowLayout { + weak var delegate: WaterfallMutiSectionDelegate? + + private var sectionInsets: UIEdgeInsets = .zero + private var columnCount: Int = 2 + private var lineSpacing: CGFloat = 0 + private var interitemSpacing: CGFloat = 0 + private var headerSize: CGSize = .zero + private var footerSize: CGSize = .zero + + //存放attribute的数组 + private var attrsArray: [UICollectionViewLayoutAttributes] = [] + //存放每个section中各个列的最后一个高度 + private var columnHeights: [CGFloat] = [] + //collectionView的Content的高度 + private var contentHeight: CGFloat = 0 + //记录上个section高度最高一列的高度 + private var lastContentHeight: CGFloat = 0 + //每个section的header与上个section的footer距离 + private var spacingWithLastSection: CGFloat = 0 + + + override func prepare() { + super.prepare() + self.contentHeight = 0 + self.lastContentHeight = 0 + self.spacingWithLastSection = 0 + self.lineSpacing = 0 + self.sectionInsets = .zero + self.headerSize = .zero + self.footerSize = .zero + self.columnHeights.removeAll() + self.attrsArray.removeAll() + + let sectionCount = self.collectionView!.numberOfSections + // 遍历section + for idx in 0.. [UICollectionViewLayoutAttributes]? { + return self.attrsArray + } + + override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? { + if let column = self.delegate?.columnNumber?(collectionView: self.collectionView!, layout: self, section: indexPath.section) { + self.columnCount = column + } + if let lineSpacing = self.delegate?.lineSpacing?(collectionView: self.collectionView!, layout: self, section: indexPath.section) { + self.lineSpacing = lineSpacing + } + if let interitem = self.delegate?.interitemSpacing?(collectionView: self.collectionView!, layout: self, section: indexPath.section) { + self.interitemSpacing = interitem + } + + let attri = UICollectionViewLayoutAttributes(forCellWith: indexPath) + let weight = self.collectionView!.frame.size.width + let itemSpacing = CGFloat(self.columnCount - 1) * self.interitemSpacing + let allWeight = weight - self.sectionInsets.left - self.sectionInsets.right - itemSpacing + let cellWeight = allWeight / CGFloat(self.columnCount) + let cellHeight: CGFloat = (self.delegate?.heightForRowAtIndexPath(collectionView: self.collectionView!, layout: self, indexPath: indexPath, itemWidth: cellWeight))! + + var tmpMinColumn = 0 + var minColumnHeight = self.columnHeights[0] + for i in 0.. columnH { + minColumnHeight = columnH + tmpMinColumn = i + } + } + let cellX = self.sectionInsets.left + CGFloat(tmpMinColumn) * (cellWeight + self.interitemSpacing) + var cellY: CGFloat = 0 + cellY = minColumnHeight + if cellY != self.lastContentHeight { + cellY += self.lineSpacing + } + + if self.contentHeight < minColumnHeight { + self.contentHeight = minColumnHeight + } + + attri.frame = CGRect(x: cellX, y: cellY, width: cellWeight, height: cellHeight) + self.columnHeights[tmpMinColumn] = attri.frame.maxY + //取最大的 + for i in 0.. UICollectionViewLayoutAttributes? { + let attri = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: elementKind, with: indexPath) + if elementKind == UICollectionView.elementKindSectionHeader { + if let headerSize = self.delegate?.referenceSizeForHeader?(collectionView: self.collectionView!, layout: self, section: indexPath.section) { + self.headerSize = headerSize + } + self.contentHeight += self.spacingWithLastSection + attri.frame = CGRect(x: 0, y: self.contentHeight, width: self.headerSize.width, height: self.headerSize.height) + self.contentHeight += self.headerSize.height + self.contentHeight += self.sectionInsets.top + } else if elementKind == UICollectionView.elementKindSectionFooter { + if let footerSize = self.delegate?.referenceSizeForFooter?(collectionView: self.collectionView!, layout: self, section: indexPath.section) { + self.footerSize = footerSize + } + self.contentHeight += self.sectionInsets.bottom + attri.frame = CGRect(x: 0, y: self.contentHeight, width: self.footerSize.width, height: self.footerSize.height) + self.contentHeight += self.footerSize.height + } + return attri + } + + override var collectionViewContentSize: CGSize { + return CGSize(width: self.collectionView!.frame.size.width, height: self.contentHeight) + } +} diff --git a/Podfile b/Podfile index 5d07fe5..40b4c58 100644 --- a/Podfile +++ b/Podfile @@ -27,6 +27,6 @@ target 'BeeReel' do pod 'YYCategories' pod 'YYText' pod 'FSPagerView' #banner - + pod 'MJRefresh' #刷新控件 end