From a318806a2d6b3b1636433a7f4167681c769f318e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E8=A7=89=E6=96=B0?= Date: Mon, 14 Apr 2025 16:32:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=8A=9F=E8=83=BD=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 1 + Podfile.lock | 6 +- ShortPlay.xcodeproj/project.pbxproj | 2 + .../AppDelegate/AppDelegate+Config.swift | 2 +- .../Base/Controller/SPViewController.swift | 16 +- ShortPlay/Base/Define/SPDefine.swift | 18 ++ .../Base/Extension/CGMutablePath+SPAdd.swift | 66 ++++++ ShortPlay/Base/Extension/UIColor+SPAdd.swift | 20 ++ ShortPlay/Base/Extension/UIFont+SPAdd.swift | 4 + .../Base/Extension/UIStackView+SPAdd.swift | 19 ++ ShortPlay/Base/Extension/UIView+SPAdd.swift | 96 +++++++++ ShortPlay/Base/Networking/API/SPHomeAPI.swift | 22 ++ .../Base/Networking/API/SPVideoAPI.swift | 15 +- .../Base/Networking/Base/SPURLPath.swift | 20 +- ShortPlay/Base/View/SPGradientView.swift | 44 ++++ ShortPlay/Base/View/SPTableView.swift | 51 +++++ ShortPlay/Base/View/SPTableViewCell.swift | 83 ++++++++ ShortPlay/Base/WebView/SPWebView.swift | 201 ++++++++++++++++++ .../Base/WebView/SPWebViewController.swift | 89 ++++++++ .../Controller/SPHomeChildController.swift | 24 +++ .../Controller/SPHomePageController.swift | 74 ++++++- .../Controller/SPHomeViewController.swift | 83 +++++++- .../Home/Model/SPHomeCategoryModel.swift | 26 ++- .../Class/Home/Model/SPHomeModuleModel.swift | 23 ++ .../Class/Home/Model/SPHomeTopModel.swift | 15 ++ .../Class/Home/View/SPHomeBannerCell.swift | 78 +++++++ .../Class/Home/View/SPHomeDataItemView.swift | 87 ++++++++ .../Class/Home/View/SPHomeHeaderView.swift | 141 ++++++++++++ ShortPlay/Class/Home/View/SPHomeHotCell.swift | 96 +++++++++ ShortPlay/Class/Home/View/SPHomeHotView.swift | 91 ++++++++ .../Home/View/SPHomeShortsForYouCell.swift | 80 +++++++ .../Home/View/SPHomeShortsForYouView.swift | 81 +++++++ .../Class/Home/View/SPHomeTrendingCell.swift | 91 ++++++++ .../Class/Home/View/SPHomeTrendingView.swift | 108 ++++++++++ .../Controller/SPMineViewController.swift | 6 +- .../SPPlayerListViewController.swift | 5 +- .../SPTVPlayerListViewController.swift | 2 +- .../Class/Player/Model/SPShortModel.swift | 2 +- .../Player/View/SPPlayerControlView.swift | 12 +- ShortPlay/Libs/Player/SPPlayer.swift | 2 +- .../tabbar_icon_01.imageset/Contents.json | 4 +- .../tabbar_icon_01.imageset/Frame@2x.png | Bin 957 -> 0 bytes .../tabbar_icon_01.imageset/Frame@3x.png | Bin 1831 -> 0 bytes .../tabbar_icon_01.imageset/home@2x.png | Bin 0 -> 1601 bytes .../tabbar_icon_01.imageset/home@3x.png | Bin 0 -> 3059 bytes .../Contents.json | 4 +- .../Frame@2x.png | Bin 636 -> 0 bytes .../Frame@3x.png | Bin 1049 -> 0 bytes .../home@2x.png | Bin 0 -> 2476 bytes .../home@3x.png | Bin 0 -> 4536 bytes .../tabbar_icon_02.imageset/Contents.json | 4 +- .../tabbar_icon_02.imageset/Explore@2x.png | Bin 0 -> 1306 bytes .../tabbar_icon_02.imageset/Explore@3x.png | Bin 0 -> 2475 bytes .../tabbar_icon_02.imageset/Frame@2x.png | Bin 1215 -> 0 bytes .../tabbar_icon_02.imageset/Frame@3x.png | Bin 2388 -> 0 bytes .../Contents.json | 4 +- .../Explore@2x.png | Bin 0 -> 2278 bytes .../Explore@3x.png | Bin 0 -> 4075 bytes .../Frame@2x.png | Bin 1111 -> 0 bytes .../Frame@3x.png | Bin 2100 -> 0 bytes .../tabbar_icon_05.imageset/Contents.json | 4 +- .../tabbar_icon_05.imageset/Frame@2x.png | Bin 1193 -> 0 bytes .../tabbar_icon_05.imageset/Frame@3x.png | Bin 2372 -> 0 bytes .../TabBar/tabbar_icon_05.imageset/Me@2x.png | Bin 0 -> 1558 bytes .../TabBar/tabbar_icon_05.imageset/Me@3x.png | Bin 0 -> 3112 bytes .../Contents.json | 4 +- .../Frame@2x.png | Bin 799 -> 0 bytes .../Frame@3x.png | Bin 1412 -> 0 bytes .../Me@2x.png | Bin 0 -> 2232 bytes .../Me@3x.png | Bin 0 -> 4219 bytes .../Source/Assets.xcassets/icon/Contents.json | 6 + .../icon/hot_icon_01.imageset/Contents.json | 22 ++ .../icon/hot_icon_01.imageset/hot@2x.png | Bin 0 -> 533 bytes .../icon/hot_icon_01.imageset/hot@3x.png | Bin 0 -> 931 bytes .../Contents.json | 22 ++ .../路径 497@2x.png | Bin 0 -> 843 bytes .../路径 497@3x.png | Bin 0 -> 1378 bytes .../Assets.xcassets/image/Contents.json | 6 + .../main_bg_image_01.imageset/Contents.json | 22 ++ .../image/main_bg_image_01.imageset/bg@2x.png | Bin 0 -> 274463 bytes .../image/main_bg_image_01.imageset/bg@3x.png | Bin 0 -> 426145 bytes ShortPlay/Source/en.lproj/Localizable.strings | 7 + .../Classes/JYPageConfig.swift | 2 + .../Classes/JYPageController.swift | 2 +- .../Classes/JYSegmentedView.swift | 25 ++- 85 files changed, 1981 insertions(+), 59 deletions(-) create mode 100644 ShortPlay/Base/Extension/CGMutablePath+SPAdd.swift create mode 100644 ShortPlay/Base/Extension/UIStackView+SPAdd.swift create mode 100644 ShortPlay/Base/View/SPGradientView.swift create mode 100644 ShortPlay/Base/View/SPTableView.swift create mode 100644 ShortPlay/Base/View/SPTableViewCell.swift create mode 100644 ShortPlay/Base/WebView/SPWebView.swift create mode 100644 ShortPlay/Base/WebView/SPWebViewController.swift create mode 100644 ShortPlay/Class/Home/Controller/SPHomeChildController.swift create mode 100644 ShortPlay/Class/Home/Model/SPHomeModuleModel.swift create mode 100644 ShortPlay/Class/Home/Model/SPHomeTopModel.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeBannerCell.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeDataItemView.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeHeaderView.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeHotCell.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeHotView.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeShortsForYouCell.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeShortsForYouView.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeTrendingCell.swift create mode 100644 ShortPlay/Class/Home/View/SPHomeTrendingView.swift delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Frame@2x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Frame@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/home@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/home@3x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01_selected.imageset/Frame@2x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01_selected.imageset/Frame@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01_selected.imageset/home@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01_selected.imageset/home@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Explore@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Explore@3x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Frame@2x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Frame@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Explore@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Explore@3x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Frame@2x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Frame@3x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05.imageset/Frame@2x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05.imageset/Frame@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05.imageset/Me@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05.imageset/Me@3x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05_selected.imageset/Frame@2x.png delete mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05_selected.imageset/Frame@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05_selected.imageset/Me@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05_selected.imageset/Me@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/hot_icon_01.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/hot_icon_01.imageset/hot@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/hot_icon_01.imageset/hot@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/路径 497@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/路径 497@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/image/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/image/main_bg_image_01.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/image/main_bg_image_01.imageset/bg@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/image/main_bg_image_01.imageset/bg@3x.png diff --git a/Podfile b/Podfile index 6956a6f..2a66bc7 100644 --- a/Podfile +++ b/Podfile @@ -24,6 +24,7 @@ target 'ShortPlay' do pod 'Toast' #吐司提示 pod 'ZFPlayer/AVPlayer' #播放器 pod 'KTVHTTPCache' #视频缓存 + pod 'HWPanModal' #底部弹出控制器 target 'ShortPlayTests' do diff --git a/Podfile.lock b/Podfile.lock index cb053ea..1478dd5 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,6 +1,7 @@ PODS: - Alamofire (5.10.2) - CocoaAsyncSocket (7.6.5) + - HWPanModal (0.9.9) - KTVHTTPCache (3.0.2): - CocoaAsyncSocket - MJRefresh (3.7.9) @@ -19,6 +20,7 @@ PODS: - ZFPlayer/Core (4.1.4) DEPENDENCIES: + - HWPanModal - KTVHTTPCache - MJRefresh - Moya @@ -32,6 +34,7 @@ SPEC REPOS: trunk: - Alamofire - CocoaAsyncSocket + - HWPanModal - KTVHTTPCache - MJRefresh - Moya @@ -44,6 +47,7 @@ SPEC REPOS: SPEC CHECKSUMS: Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + HWPanModal: b57a6717d3cdcd666bff44f9dd2a5be9f4d6f5d2 KTVHTTPCache: 5711692cdf9a5ecfe829b1e16577deb3ffe3dc86 MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee @@ -53,6 +57,6 @@ SPEC CHECKSUMS: YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7 ZFPlayer: 5cf39e8d9f0c2394a014b0db4767b5b5a6bffe13 -PODFILE CHECKSUM: 422706ab4a12e286d2106acff478496d948912e8 +PODFILE CHECKSUM: 6b8807090aa7efc034949fa4dae871806b3d46fd COCOAPODS: 1.16.2 diff --git a/ShortPlay.xcodeproj/project.pbxproj b/ShortPlay.xcodeproj/project.pbxproj index 488d0d9..d765401 100644 --- a/ShortPlay.xcodeproj/project.pbxproj +++ b/ShortPlay.xcodeproj/project.pbxproj @@ -444,6 +444,7 @@ ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ShortPlay/Source/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = ZyreoTV; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; @@ -478,6 +479,7 @@ ENABLE_USER_SCRIPT_SANDBOXING = NO; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ShortPlay/Source/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = ZyreoTV; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = ""; diff --git a/ShortPlay/AppDelegate/AppDelegate+Config.swift b/ShortPlay/AppDelegate/AppDelegate+Config.swift index b0a41df..25c7553 100644 --- a/ShortPlay/AppDelegate/AppDelegate+Config.swift +++ b/ShortPlay/AppDelegate/AppDelegate+Config.swift @@ -10,7 +10,7 @@ import UIKit extension AppDelegate { func appConfig() { -// UIView.et_Awake() + UIView.sp_Awake() tabBarConfig() // keyBoardStyle() diff --git a/ShortPlay/Base/Controller/SPViewController.swift b/ShortPlay/Base/Controller/SPViewController.swift index 936869a..7c10fc3 100644 --- a/ShortPlay/Base/Controller/SPViewController.swift +++ b/ShortPlay/Base/Controller/SPViewController.swift @@ -22,12 +22,19 @@ class SPViewController: UIViewController, JYPageChildContollerProtocol { private(set) var isViewDidLoad = false private(set) var isDidAppear = false - + + private(set) lazy var _bgImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "main_bg_image_01")) + imageView.isUserInteractionEnabled = true + return imageView; + }() + override func viewDidLoad() { super.viewDidLoad() self.isViewDidLoad = true self.edgesForExtendedLayout = [] - self.view.backgroundColor = .black + + setBgImageView() if let navi = navigationController { if navi.visibleViewController == self { @@ -38,6 +45,11 @@ class SPViewController: UIViewController, JYPageChildContollerProtocol { } } + func setBgImageView() { + self.view = self._bgImageView + self.view.backgroundColor = .black + } + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) isDidAppear = true diff --git a/ShortPlay/Base/Define/SPDefine.swift b/ShortPlay/Base/Define/SPDefine.swift index 573126a..2cd9769 100644 --- a/ShortPlay/Base/Define/SPDefine.swift +++ b/ShortPlay/Base/Define/SPDefine.swift @@ -56,3 +56,21 @@ public func spLog(message:Any? , file: String = #file, function: String = #funct print("\n\(Date(timeIntervalSinceNow: 8 * 60 * 60)) \(file.components(separatedBy: "/").last ?? "") \(function) \(line): \(message ?? "")") #endif } + + +public func sp_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/ShortPlay/Base/Extension/CGMutablePath+SPAdd.swift b/ShortPlay/Base/Extension/CGMutablePath+SPAdd.swift new file mode 100644 index 0000000..f8c4682 --- /dev/null +++ b/ShortPlay/Base/Extension/CGMutablePath+SPAdd.swift @@ -0,0 +1,66 @@ +// +// CGMutablePath+SPAdd.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +/** 圆角大小 */ +struct SPCirculars { + var topLeft:CGFloat = 0 + var topRight:CGFloat = 0 + var bottomLeft:CGFloat = 0 + var bottomRight:CGFloat = 0 + + public static let zero = SPCirculars(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:SPCirculars, v2:SPCirculars) -> Bool { + return v1.bottomLeft == v2.bottomLeft + && v1.bottomRight == v2.bottomRight + && v1.topLeft == v2.topLeft + && v1.topRight == v2.topRight + } + static func !=(v1:SPCirculars, v2:SPCirculars) -> Bool { + return !(v1 == v2) + } +} + +extension CGMutablePath { + func addRadiusRectangle(_ circulars: SPCirculars, 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/ShortPlay/Base/Extension/UIColor+SPAdd.swift b/ShortPlay/Base/Extension/UIColor+SPAdd.swift index 0204cc0..8b47eca 100644 --- a/ShortPlay/Base/Extension/UIColor+SPAdd.swift +++ b/ShortPlay/Base/Extension/UIColor+SPAdd.swift @@ -43,5 +43,25 @@ extension UIColor { static func color7F7F80(alpha: CGFloat = 1) -> UIColor { return color(hex: 0x7F7F80, alpha: alpha) } + + static func colorD2D2D2(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0xD2D2D2, alpha: alpha) + } + + static func colorBF6BFF(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0xBF6BFF, alpha: alpha) + } + + static func color121418(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0x121418, alpha: alpha) + } + + static func colorF564B6(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0xF564B6, alpha: alpha) + } + + static func colorF56490(alpha: CGFloat = 1) -> UIColor { + return color(hex: 0xF56490, alpha: alpha) + } } diff --git a/ShortPlay/Base/Extension/UIFont+SPAdd.swift b/ShortPlay/Base/Extension/UIFont+SPAdd.swift index 069b9d4..51175c8 100644 --- a/ShortPlay/Base/Extension/UIFont+SPAdd.swift +++ b/ShortPlay/Base/Extension/UIFont+SPAdd.swift @@ -20,4 +20,8 @@ extension UIFont { static func fontBold(ofSize: CGFloat) -> UIFont { return .systemFont(ofSize: ofSize, weight: .bold) } + + static func fontLight(ofSize: CGFloat) -> UIFont { + return .systemFont(ofSize: ofSize, weight: .light) + } } diff --git a/ShortPlay/Base/Extension/UIStackView+SPAdd.swift b/ShortPlay/Base/Extension/UIStackView+SPAdd.swift new file mode 100644 index 0000000..667c217 --- /dev/null +++ b/ShortPlay/Base/Extension/UIStackView+SPAdd.swift @@ -0,0 +1,19 @@ +// +// UIStackView+SPAdd.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +extension UIStackView { + func removeAllArrangedSubview() { + let arrangedSubviews = self.arrangedSubviews + + arrangedSubviews.forEach { + self.removeArrangedSubview($0) + $0.removeFromSuperview() + } + } +} diff --git a/ShortPlay/Base/Extension/UIView+SPAdd.swift b/ShortPlay/Base/Extension/UIView+SPAdd.swift index a5a8d66..7b0f08f 100644 --- a/ShortPlay/Base/Extension/UIView+SPAdd.swift +++ b/ShortPlay/Base/Extension/UIView+SPAdd.swift @@ -9,7 +9,103 @@ import UIKit import SnapKit extension UIView { + fileprivate struct AssociatedKeys { + static var sp_tapGesture: Int? + static var sp_effect: Int? + static var sp_circulars: Int? + } + @objc public static func sp_Awake() { + sp_swizzled_instanceMethod("sp", oldClass: self, oldSelector: "layoutSubviews", newClass: self) + } + @objc func sp_layoutSubviews() { + sp_layoutSubviews() + _updateRadius() + + if let effectView = effectView, effectView.frame != self.bounds { + effectView.frame = self.bounds + } + } + ///获得当前的响应视图 + func getFirstResponderView() -> UIView? { + var resultView: UIView? = nil + + for view in self.subviews { + if view.isFirstResponder { + resultView = view + break + } else { + resultView = view.getFirstResponderView() + if resultView != nil { + break + } + } + } + return resultView + } +} + + +//MARK: -------------- 模糊效果 -------------- +extension UIView { + private var effectView: UIVisualEffectView? { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.sp_effect) as? UIVisualEffectView + } + set { + objc_setAssociatedObject(self, &AssociatedKeys.sp_effect, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + ///添加模糊效果 + func addEffectView(style: UIBlurEffect.Style = .dark) { + if self.effectView == nil { + let blur = UIBlurEffect(style: style) + let effectView = UIVisualEffectView(effect: blur) + self.addSubview(effectView) + self.sendSubviewToBack(effectView) + + self.effectView = effectView + } + } + ///删除模糊效果 + func removeEffectView() { + self.effectView?.removeFromSuperview() + self.effectView = nil + } +} + +//MARK: -------------- 圆角 -------------- +extension UIView { + + + private var circulars: SPCirculars? { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.sp_circulars) as? SPCirculars + } + set { + objc_setAssociatedObject(self, &AssociatedKeys.sp_circulars, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + func addRadius(topLeft: CGFloat, topRight: CGFloat, bottomLeft: CGFloat, bottomRight: CGFloat) { + //清空其它设置方法 + self.circulars = SPCirculars(topLeft: topLeft, topRight: topRight, bottomLeft: bottomLeft, bottomRight: bottomRight) + _updateRadius() + } + + private func _updateRadius() { + guard let circulars = self.circulars else { return } + let rect = self.bounds + + let path = CGMutablePath() + path.addRadiusRectangle(circulars, rect: rect) + + let maskLayer = CAShapeLayer() + maskLayer.frame = self.bounds + maskLayer.path = path + self.layer.mask = maskLayer + } } diff --git a/ShortPlay/Base/Networking/API/SPHomeAPI.swift b/ShortPlay/Base/Networking/API/SPHomeAPI.swift index b13bc16..e29989b 100644 --- a/ShortPlay/Base/Networking/API/SPHomeAPI.swift +++ b/ShortPlay/Base/Networking/API/SPHomeAPI.swift @@ -25,4 +25,26 @@ class SPHomeAPI: NSObject { } + ///首页顶部数据 + static func requestHomeTopData(completer: ((_ model: SPHomeTopModel?) -> Void)?) { + let param = SPNetworkParameters(path: "/homeTop") +// param.method = .get + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + completer?(response.data) + } + } + + ///首页模块接口 + static func requestHomeModuleData(completer: ((_ model: SPHomeModuleModel?) -> Void)?) { + var param = SPNetworkParameters(path: "/homeModuleData") + param.method = .get + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in + completer?(response.data) + } + + } + + } diff --git a/ShortPlay/Base/Networking/API/SPVideoAPI.swift b/ShortPlay/Base/Networking/API/SPVideoAPI.swift index ab80bcb..b28d529 100644 --- a/ShortPlay/Base/Networking/API/SPVideoAPI.swift +++ b/ShortPlay/Base/Networking/API/SPVideoAPI.swift @@ -10,15 +10,18 @@ import UIKit class SPVideoAPI: NSObject { ///获取视频详情 - static func requestVideoDetail(videoId: String, shortPlayId: String, completer: ((_ model: SPVideoDetailModel?) -> Void)?) { - - var param = SPNetworkParameters(path: "/getVideoDetails") - param.method = .get - param.parameters = [ - "video_id" : videoId, + static func requestVideoDetail(videoId: String?, shortPlayId: String, completer: ((_ model: SPVideoDetailModel?) -> Void)?) { + var parameters: [String : Any] = [ "short_play_id" : shortPlayId ] + if let videoId = videoId { + parameters["video_id"] = videoId + } + var param = SPNetworkParameters(path: "/getVideoDetails") + param.method = .get + param.parameters = parameters + SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in completer?(response.data) } diff --git a/ShortPlay/Base/Networking/Base/SPURLPath.swift b/ShortPlay/Base/Networking/Base/SPURLPath.swift index 8e4f58b..e88ad32 100644 --- a/ShortPlay/Base/Networking/Base/SPURLPath.swift +++ b/ShortPlay/Base/Networking/Base/SPURLPath.swift @@ -9,10 +9,26 @@ import UIKit #if DEBUG let SPBaseURL = "https://test1-api.guyantv.com" -let SPWebBaseURL = "https://test1-api.guyantv.com" +let SPWebBaseURL = "https://www.guyantv.com" #else let SPBaseURL = "https://test1-api.guyantv.com" -let SPWebBaseURL = "https://test1-api.guyantv.com" +let SPWebBaseURL = "https://www.guyantv.com" #endif +///用户协议 +let SPUserAgreementWebUrl = SPWebBaseURL + "/user_policy.htm" +///隐私协议 +let SPPrivacyPolicyWebUrl = SPWebBaseURL + "/private.htm" +///儿童个人信息保护规则 +let SPInformationProtectionWebUrl = SPWebBaseURL + "/information_protection.html" +///第三方共享清单 +let SPInformationSharingWebUrl = SPWebBaseURL + "/information_sharing.html" +///收集个人信息明示清单 +let SPPersoInforDisclosureWebUrl = SPWebBaseURL + "/persoInfor_disclosure.html" +///全国青少年互联网文明公约 +let SPCivizatioConventionWebUrl = SPWebBaseURL + "/civizatio_convention.html" +///全国青少年互联网文明公约 +let SPMemberShipAgreementWebUrl = SPWebBaseURL + "/member_ship_agreement.html" + + diff --git a/ShortPlay/Base/View/SPGradientView.swift b/ShortPlay/Base/View/SPGradientView.swift new file mode 100644 index 0000000..f6e7b41 --- /dev/null +++ b/ShortPlay/Base/View/SPGradientView.swift @@ -0,0 +1,44 @@ +// +// SPGradientView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPGradientView: UIView { + + override class var layerClass: AnyClass { + return CAGradientLayer.self + } + + var gradientLayer: CAGradientLayer { + return self.layer as! CAGradientLayer + } + + var locations: [NSNumber]? { + didSet { + self.gradientLayer.locations = locations + } + } + + var colors: [CGColor]? { + didSet { + self.gradientLayer.colors = colors + } + } + + var startPoint: CGPoint = .zero { + didSet { + self.gradientLayer.startPoint = startPoint + } + } + + var endPoint: CGPoint = .zero { + didSet { + self.gradientLayer.endPoint = endPoint + } + } + +} diff --git a/ShortPlay/Base/View/SPTableView.swift b/ShortPlay/Base/View/SPTableView.swift new file mode 100644 index 0000000..3dd43fe --- /dev/null +++ b/ShortPlay/Base/View/SPTableView.swift @@ -0,0 +1,51 @@ +// +// SPTableView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPTableView: UITableView { + + var insetGroupedMargins: CGFloat = 12 + + override init(frame: CGRect, style: UITableView.Style) { + super.init(frame: frame, style: style) +// separatorColor = .lineColor() + 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 #available(iOS 13.0, *) { + if self.style == .insetGrouped { + margins.left = self.safeAreaInsets.left + insetGroupedMargins + margins.right = self.safeAreaInsets.right + insetGroupedMargins + } + } + return margins + } + } + +} diff --git a/ShortPlay/Base/View/SPTableViewCell.swift b/ShortPlay/Base/View/SPTableViewCell.swift new file mode 100644 index 0000000..f4a537d --- /dev/null +++ b/ShortPlay/Base/View/SPTableViewCell.swift @@ -0,0 +1,83 @@ +// +// SPTableViewCell.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPTableViewCell: UITableViewCell { + + var indicatorMargin: CGFloat = 7.5 { + didSet { + indicatorImageView.snp.updateConstraints { make in + make.right.equalToSuperview().offset(-indicatorMargin) + } + } + } + + var showIndicator = false { + didSet { + indicatorImageView.isHidden = !showIndicator + } + } + + private(set) lazy var indicatorImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "right_arrow_icon_01")) + imageView.isHidden = !showIndicator + 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 + + contentView.addSubview(indicatorImageView) + indicatorImageView.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.right.equalToSuperview().offset(-indicatorMargin) + } + + } + + 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 sp_tableView: UITableView? { + return self.value(forKey: "_tableView") as? UITableView + } + + // MARK: - 注册 + public static func registerCell(tableView: UITableView, _ reuseIdentifier: String? = nil) { + let reuseIdentifier = reuseIdentifier == nil ? NSStringFromClass(self) : reuseIdentifier + tableView.register(self, forCellReuseIdentifier: reuseIdentifier!) + } + + // MARK: - 复用取值 + public static func dequeueReusableCell(tableView: UITableView, indexPath: IndexPath, _ reuseIdentifier: String? = nil) -> Self { + + let reuseIdentifier = reuseIdentifier == nil ? NSStringFromClass(self) : reuseIdentifier + let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier!, for: indexPath) + return cell as! Self + } +} diff --git a/ShortPlay/Base/WebView/SPWebView.swift b/ShortPlay/Base/WebView/SPWebView.swift new file mode 100644 index 0000000..2659e42 --- /dev/null +++ b/ShortPlay/Base/WebView/SPWebView.swift @@ -0,0 +1,201 @@ +// +// SPWebView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit +@preconcurrency import WebKit + +class SPWebView: WKWebView { + + weak var delegate: SPWebViewDelegate? + + deinit { + + self.removeObserver(self, forKeyPath: "estimatedProgress") + self.removeObserver(self, forKeyPath: "title") + + } + + override init(frame: CGRect, configuration: WKWebViewConfiguration) { + super.init(frame: frame, configuration: configuration) +// addScriptMessageHandler() + _setupInit() + } + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private func _setupInit() { + + self.isOpaque = false + self.uiDelegate = self + self.navigationDelegate = self + self.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil) + self.addObserver(self, forKeyPath: "title", options: .new, context: nil) + +// var userAgent = (self.value(forKey: "userAgent") as? String) ?? "" +// if !userAgent.contains(";jxdbBrowser") { +// userAgent = userAgent + ";jxdbBrowser|V\(kYDAPPVersion)" +// self.customUserAgent = userAgent +// } + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if object as? SPWebView == self { + if keyPath == "estimatedProgress", let progress = change?[NSKeyValueChangeKey.newKey] as? CGFloat { + self.delegate?.webView?(webView: self, didChangeProgress: progress) + } else if keyPath == "title", let title = change?[NSKeyValueChangeKey.newKey] as? String { + self.delegate?.webView?(webView: self, didChangeTitle: title) + } + } + } + + func load(urlStr: String) { + guard let url = URL(string: urlStr) else { return } + var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 30) + self.load(request) + } + +} + +//MARK:-------------- WKUIDelegate -------------- +extension SPWebView: WKUIDelegate { + + func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { + let alertController = UIAlertController(title: "提示", message: message, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "确认", style: .default, handler: { (action) in + completionHandler() + })) + self.viewController?.present(alertController, animated: true, completion: nil) + } + + func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (Bool) -> Void) { + let alertController = UIAlertController(title: "提示", message: message, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "取消", style: .cancel, handler: { (action) in + completionHandler(false) + })) + alertController.addAction(UIAlertAction(title: "确认", style: .default, handler: { (action) in + completionHandler(true) + })) + self.viewController?.present(alertController, animated: true, completion: nil) + } + + func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping (String?) -> Void) { + let alertController = UIAlertController(title: prompt, message: "", preferredStyle: .alert) + alertController.addTextField { (textField) in + textField.text = defaultText + } + alertController.addAction(UIAlertAction(title: "完成", style: .default, handler: { (action) in + completionHandler(alertController.textFields?.first?.text) + })) + self.viewController?.present(alertController, animated: true, completion: nil) + } +} + +//MARK:-------------- WKNavigationDelegate -------------- +extension SPWebView: WKNavigationDelegate { + + func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { + /*同步cookie*/ +// let cookies = JXCookiesManager.getAllCookies() +// for cookie in cookies { +// setCookie(cookie: cookie) +// } + + decisionHandler(.allow); + } + + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { + spLog(message: navigationAction.request.url) + +// if navigationAction.request.url?.scheme == "tel" { +// UIApplication.shared.openURL(navigationAction.request.url!) +// decisionHandler(.cancel) +// return +// } + if let url = navigationAction.request.url, + url.scheme != "http", + url.scheme != "https" + { + UIApplication.shared.open(url) + decisionHandler(.cancel) + return + } + + //防止抓包 +// if JXRequestHttpProxy.isIntercept() { +// decisionHandler(.cancel) +// return +// } + + + if let result = self.delegate?.webView?(self, shouldStartLoadWith: navigationAction) { + if result { + decisionHandler(.allow) + } else { + decisionHandler(.cancel) + } + } else { + decisionHandler(.allow) + } + } + + func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { + self.delegate?.webViewDidStartLoad?(self) + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + +// ///禁用长按展示长图 +// webView.evaluateJavaScript("document.documentElement.style.webkitTouchCallout='none';", completionHandler: nil) +// ///禁用长按选择图片文字 +// webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none';", completionHandler: nil) + + + + self.delegate?.webViewDidFinishLoad?(self) + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + self.delegate?.webView?(self, didFailLoadWithError: error) + } + + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + self.delegate?.webView?(self, didFailLoadWithError: error) + } + + +} + +//MARK:-------------- WKScriptMessageHandler -------------- +extension SPWebView: WKScriptMessageHandler { + + func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + self.delegate?.userContentController?(userContentController, didReceive: message) + } + +} + + +//MARK:-------------- YDWebViewDelegate -------------- +@objc protocol SPWebViewDelegate: NSObjectProtocol { + + @objc optional func webView(_ webView: SPWebView, shouldStartLoadWith navigationAction: WKNavigationAction) -> Bool + + @objc optional func webViewDidStartLoad(_ webView: SPWebView) + + @objc optional func webViewDidFinishLoad(_ webView: SPWebView) + + @objc optional func webView(_ webView: SPWebView, didFailLoadWithError error: Error) + + ///进度 + @objc optional func webView(webView: SPWebView, didChangeProgress progress: CGFloat) + ///标题 + @objc optional func webView(webView: SPWebView, didChangeTitle title: String) + + ///web交互用 + @objc optional func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) + +} diff --git a/ShortPlay/Base/WebView/SPWebViewController.swift b/ShortPlay/Base/WebView/SPWebViewController.swift new file mode 100644 index 0000000..035f334 --- /dev/null +++ b/ShortPlay/Base/WebView/SPWebViewController.swift @@ -0,0 +1,89 @@ +// +// SPWebViewController.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit +import WebKit + +class SPWebViewController: SPViewController { + + var urlStr: String? + + private lazy var webView: SPWebView = { + let controller = WKUserContentController() + + let config = WKWebViewConfiguration() + config.userContentController = controller + config.preferences.javaScriptEnabled = true + /** 默认是不能通过JS自动打开窗口的,必须通过用户交互才能打开 */ + config.preferences.javaScriptCanOpenWindowsAutomatically = true + let webView = SPWebView(frame: self.view.bounds, configuration: config) + webView.delegate = self + return webView + }() + + override func viewDidLoad() { + super.viewDidLoad() + configNavigationBack() + + _setupUI() + + if let url = urlStr { + self.load(urlString: url) + } + } + + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.setNavigationBarHidden(false, animated: true) + self.setNavigationNormalStyle() + } + + func load(urlString: String) { +// guard let url = URL(string: "https://www.baidu.com") else { return } + var str: String = urlString +// if let userToken = ETLoginManager.manager.userInfo?.userToken { +// if urlString.contains("?") { +// str = urlString + "&userToken=\(userToken)" +// } else { +// str = urlString + "?userToken=\(userToken)" +// } +// } + + guard let url = URL(string: str) else { return } + var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 30) + +// if ETLoginManager.manager.isLogin, let userToken = ETLoginManager.manager.userInfo?.userToken { +// request.setValue(userToken, forHTTPHeaderField: "userToken") +// } + + self.webView.load(request) + } + +} + +extension SPWebViewController { + + private func _setupUI() { + self.view.addSubview(webView) + self.webView.frame = self.view.bounds + self.webView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + } + +} + +//MARK: -------------- ETWebViewDelegate -------------- +extension SPWebViewController: SPWebViewDelegate { + + func webView(webView: SPWebView, didChangeTitle title: String) { + self.title = title + } + + func webView(_ webView: SPWebView, didFailLoadWithError error: any Error) { + spLog(message: error) + } +} diff --git a/ShortPlay/Class/Home/Controller/SPHomeChildController.swift b/ShortPlay/Class/Home/Controller/SPHomeChildController.swift new file mode 100644 index 0000000..b74e232 --- /dev/null +++ b/ShortPlay/Class/Home/Controller/SPHomeChildController.swift @@ -0,0 +1,24 @@ +// +// SPHomeChildController.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeChildController: SPViewController { + + var topMargins: CGFloat = 10 + + override func viewDidLoad() { + super.viewDidLoad() + + + } + + override func setBgImageView() { } + + + +} diff --git a/ShortPlay/Class/Home/Controller/SPHomePageController.swift b/ShortPlay/Class/Home/Controller/SPHomePageController.swift index f5c85e5..0d62450 100644 --- a/ShortPlay/Class/Home/Controller/SPHomePageController.swift +++ b/ShortPlay/Class/Home/Controller/SPHomePageController.swift @@ -9,23 +9,56 @@ import UIKit class SPHomePageController: SPViewController { + private var topModel: SPHomeTopModel? + + private lazy var categoryArr: [SPHomeCategoryModel] = { + let arr = [ + SPHomeCategoryModel(category_name: "Hot Picks".localized, category_id: nil, viewController: SPHomeViewController()), + SPHomeCategoryModel(category_name: "Top 10".localized, category_id: nil, viewController: nil), + SPHomeCategoryModel(category_name: "Fresh Drops".localized, category_id: nil, viewController: nil), + SPHomeCategoryModel(category_name: "Free".localized, category_id: nil, viewController: nil), + ] + return arr + }() + private lazy var pageView: JYPageController = { + let customIndicatorImage = UIImage(named: "page_indicator_icon_01") + let customIndicator = UIImageView(image: customIndicatorImage) + let pageView = JYPageController() pageView.delegate = self pageView.dataSource = self + pageView.config.normalTitleColor = .colorD2D2D2() + pageView.config.selectedTitleColor = .colorBF6BFF() + pageView.config.normalTitleFont = 14 + pageView.config.selectedTitleFont = 16 + pageView.config.normalTitleFontWeight = .regular + pageView.config.selectedTitleFontWeight = .medium + pageView.config.alignment = .scatter + pageView.config.customIndicator = customIndicator + pageView.config.indicatorStyle = .customView + pageView.config.indicatorWidth = customIndicatorImage?.size.width ?? 0 + pageView.config.indicatorHeight = customIndicatorImage?.size.height ?? 0 + pageView.config.leftPadding = 15 + pageView.config.rightPadding = 15 + pageView.config.itemsMargin = 24 return pageView }() + + override func viewDidLoad() { super.viewDidLoad() sp_setupUI() + + requestData() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - self.navigationController?.setNavigationBarHidden(false, animated: true) + self.navigationController?.setNavigationBarHidden(true, animated: true) } } @@ -37,7 +70,9 @@ extension SPHomePageController { view.addSubview(pageView.view) pageView.view.snp.makeConstraints { make in - make.edges.equalToSuperview() +// make.edges.equalToSuperview() + make.top.equalToSuperview().offset(kSPStatusbarHeight + 66) + make.left.right.bottom.equalToSuperview() } } } @@ -45,26 +80,47 @@ extension SPHomePageController { //MARK: -------------- JYPageControllerDelegate & JYPageControllerDataSource -------------- extension SPHomePageController: JYPageControllerDelegate, JYPageControllerDataSource { func pageController(_ pageController: JYPageController, frameForSegmentedView segmentedView: JYSegmentedView) -> CGRect { - return .init(x: 0, y: kSPStatusbarHeight + 10, width: kSPScreenWidth, height: 40) + return .init(x: 0, y: 0, width: kSPScreenWidth, height: 40) } func pageController(_ pageController: JYPageController, frameForContainerView container: UIScrollView) -> CGRect { - return .init(x: 0, y: 0, width: kSPScreenWidth, height: kSPScreenHeight - kSPTabBarHeight) + return .init(x: 0, y: 40, width: kSPScreenWidth, height: kSPScreenHeight - kSPTabBarHeight - kSPStatusbarHeight - 66 - 40) } func pageController(_ pageController: JYPageController, titleAt index: Int) -> String { - return "123" + return self.categoryArr[index].category_name ?? "" } func childController(atIndex index: Int) -> any JYPageChildContollerProtocol { - return SPViewController() + let vc = SPHomeViewController() + vc.topMargins = 15 + return vc } func numberOfChildControllers() -> Int { - return 0 + return self.categoryArr.count + } +} + + +extension SPHomePageController { + + private func requestData() { + if self.topModel != nil { return } + + + SPHomeAPI.requestHomeTopData { [weak self] model in + guard let self = self else { return } + if let model = model { + self.topModel = model + if let category = self.topModel?.category { + self.categoryArr += category + } + self.pageView.reload() + } + } + } - - } diff --git a/ShortPlay/Class/Home/Controller/SPHomeViewController.swift b/ShortPlay/Class/Home/Controller/SPHomeViewController.swift index 33c6ee6..12c42de 100644 --- a/ShortPlay/Class/Home/Controller/SPHomeViewController.swift +++ b/ShortPlay/Class/Home/Controller/SPHomeViewController.swift @@ -7,15 +7,88 @@ import UIKit -class SPHomeViewController: SPViewController { - +class SPHomeViewController: SPHomeChildController { + + ///模版数据 + private var moduleModel: SPHomeModuleModel? + + + private lazy var layout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + return layout + }() + + private lazy var collectionView: SPCollectionView = { + let collectionView = SPCollectionView(frame: .zero, collectionViewLayout: layout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.register(SPHomeHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerView") + SPCollectionViewCell.registerCell(collectionView: collectionView) + return collectionView + }() + override func viewDidLoad() { super.viewDidLoad() - +// view.backgroundColor = .clear + requestModuleData() + _setupUI() } - + override func fetchChildControllerScrollView() -> UIScrollView? { + return self.collectionView + } + +} + +extension SPHomeViewController { + + private func _setupUI() { + view.addSubview(self.collectionView); + + self.collectionView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalToSuperview().offset(topMargins) + } + } +} + +//MARK: -------------- UICollectionViewDelegate & UICollectionViewDataSource -------------- +extension SPHomeViewController: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = SPCollectionViewCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) + return cell + } + + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 0 + } + + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + if let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "headerView", for: indexPath) as? SPHomeHeaderView { + headerView.moduleModel = self.moduleModel + return headerView + } + return UICollectionReusableView() + } + + +} + + +extension SPHomeViewController { + + private func requestModuleData() { + SPHomeAPI.requestHomeModuleData { [weak self] model in + guard let self = self else { return } + if let model = model { + self.moduleModel = model + self.layout.headerReferenceSize = CGSize(width: kSPScreenWidth, height: SPHomeHeaderView.contentHeight(model: model)) + self.collectionView.reloadData() + } + } + } - } diff --git a/ShortPlay/Class/Home/Model/SPHomeCategoryModel.swift b/ShortPlay/Class/Home/Model/SPHomeCategoryModel.swift index bb63fb3..bf0aa35 100644 --- a/ShortPlay/Class/Home/Model/SPHomeCategoryModel.swift +++ b/ShortPlay/Class/Home/Model/SPHomeCategoryModel.swift @@ -6,11 +6,33 @@ // import UIKit +import SmartCodable -class SPHomeCategoryModel: SPModel { - +//class SPHomeCategoryModel: SPModel, SmartCodable { +// +// var category_name: String? +// var category_id: String? +// +// @IgnoredKey +// var viewController: SPViewController? +// +// +// init(category_name: String? = nil, category_id: String? = nil, viewController: SPViewController? = nil) { +// self.category_name = category_name +// self.category_id = category_id +// self.viewController = viewController +// } +// +// required init() { +// fatalError("init() has not been implemented") +// } +//} + +struct SPHomeCategoryModel: SmartCodable { var category_name: String? var category_id: String? + @IgnoredKey + var viewController: SPViewController? } diff --git a/ShortPlay/Class/Home/Model/SPHomeModuleModel.swift b/ShortPlay/Class/Home/Model/SPHomeModuleModel.swift new file mode 100644 index 0000000..1eea304 --- /dev/null +++ b/ShortPlay/Class/Home/Model/SPHomeModuleModel.swift @@ -0,0 +1,23 @@ +// +// SPHomeModuleModel.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit +import SmartCodable + +class SPHomeModuleModel: SPModel, SmartCodable { + + var bannerData: [SPShortModel]? + ///首页九宫格数据 + var recommandData: [SPShortModel]? + ///新剧列表 + var manualNewestRecommand: [SPShortModel]? + ///热门排行 + var hotData: [SPShortModel]? + + + +} diff --git a/ShortPlay/Class/Home/Model/SPHomeTopModel.swift b/ShortPlay/Class/Home/Model/SPHomeTopModel.swift new file mode 100644 index 0000000..3199ea1 --- /dev/null +++ b/ShortPlay/Class/Home/Model/SPHomeTopModel.swift @@ -0,0 +1,15 @@ +// +// SPHomeTopModel.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit +import SmartCodable + +class SPHomeTopModel: SPModel, SmartCodable { + + var category: [SPHomeCategoryModel]? + +} diff --git a/ShortPlay/Class/Home/View/SPHomeBannerCell.swift b/ShortPlay/Class/Home/View/SPHomeBannerCell.swift new file mode 100644 index 0000000..ba1b005 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeBannerCell.swift @@ -0,0 +1,78 @@ +// +// SPHomeBannerCell.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeBannerCell: ZKCycleScrollViewCell { + + + var model: SPShortModel? { + didSet { + coverImageView.sp_setImage(url: model?.horizontally_img) + titleLabel.text = model?.name + } + } + + private lazy var coverImageView: SPImageView = { + let imageView = SPImageView() + return imageView + }() + + private lazy var bottomView: SPGradientView = { + let view = SPGradientView() + view.colors = [UIColor.color121418(alpha: 0).cgColor, UIColor.color121418(alpha: 0.8).cgColor] + view.startPoint = CGPoint(x: 0.5, y: 0) + view.endPoint = CGPoint(x: 0.5, y: 1) + view.locations = [0, 1] + return view + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontLight(ofSize: 14) + label.textColor = .colorFFFFFF(alpha: 0.9) + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + contentView.layer.cornerRadius = 12 + contentView.layer.masksToBounds = true + + _setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SPHomeBannerCell { + + private func _setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(bottomView) + contentView.addSubview(titleLabel) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + bottomView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(65) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(7) + make.bottom.equalToSuperview().offset(-12) + make.right.lessThanOrEqualToSuperview().offset(-7) + } + + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeDataItemView.swift b/ShortPlay/Class/Home/View/SPHomeDataItemView.swift new file mode 100644 index 0000000..72b90f9 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeDataItemView.swift @@ -0,0 +1,87 @@ +// +// SPHomeDataItemView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeDataItemView: UIView { + + ///内容距离顶部位置 + static let contentToTop: CGFloat = 36 + + + class func contentHeight(dataArr: [SPShortModel]) -> CGFloat { + return contentToTop + } + + override var intrinsicContentSize: CGSize { + let height = Self.contentHeight(dataArr: dataArr ?? []) + return CGSize(width: kSPScreenWidth, height: height) + } + + var dataArr: [SPShortModel]? { + didSet { + self.invalidateIntrinsicContentSize() + } + } + + private(set) lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontMedium(ofSize: 15) + label.textColor = .colorFFFFFF() + return label + }() + + private lazy var moreButton: UIButton = { + let button = UIButton(type: .custom) + button.setTitle("More", for: .normal) + button.setTitleColor(.colorF564B6(), for: .normal) + button.titleLabel?.font = .fontLight(ofSize: 12) + return button + }() + + private(set) lazy var contentView: UIView = { + let view = UIView() + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + _setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeDataItemView { + + private func _setupUI() { + addSubview(titleLabel) + addSubview(moreButton) + addSubview(contentView) + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview() + make.height.equalTo(21) + } + + moreButton.snp.makeConstraints { make in + make.centerY.equalTo(moreButton) + make.right.equalToSuperview().offset(-15) + } + + contentView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.top.equalTo(Self.contentToTop) + } + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeHeaderView.swift b/ShortPlay/Class/Home/View/SPHomeHeaderView.swift new file mode 100644 index 0000000..28c2d0e --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeHeaderView.swift @@ -0,0 +1,141 @@ +// +// SPHomeHeaderView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeHeaderView: UICollectionReusableView { + + var moduleModel: SPHomeModuleModel? { + didSet { + stackView.removeAllArrangedSubview() + + stackView.addArrangedSubview(bannerView) + bannerView.reloadData() + +// if (moduleModel?.recommandData?.count ?? 0) > 0 { +// } + stackView.addArrangedSubview(trendingView) + trendingView.dataArr = moduleModel?.bannerData + + stackView.addArrangedSubview(hotView) + hotView.dataArr = moduleModel?.bannerData + + stackView.addArrangedSubview(shortsForYouView) + shortsForYouView.dataArr = moduleModel?.bannerData + + } + } + + private lazy var stackView: UIStackView = { + let view = UIStackView() + view.axis = .vertical + view.spacing = 25 + return view + }() + + private lazy var bannerView: ZKCycleScrollView = { + let bannerView = ZKCycleScrollView(frame: .zero, shouldInfiniteLoop: true); + bannerView.delegate = self + bannerView.dataSource = self + bannerView.itemSpacing = 10 + bannerView.itemSize = CGSize(width: kSPScreenWidth - 30, height: Self.bannerHeight()) + bannerView.register(SPHomeBannerCell.self, forCellWithReuseIdentifier: "bannerCell") + bannerView.hidesPageControl = true + bannerView.snp.makeConstraints { make in + make.width.equalTo(kSPScreenWidth) + make.height.equalTo(Self.bannerHeight()) + } + return bannerView + }() + + private lazy var trendingView: SPHomeTrendingView = { + let view = SPHomeTrendingView() + return view + }() + + private lazy var hotView: SPHomeHotView = { + let view = SPHomeHotView() + return view + }() + + private lazy var shortsForYouView: SPHomeShortsForYouView = { + let view = SPHomeShortsForYouView() + return view + }() + + override init(frame: CGRect) { + super.init(frame: frame) + _setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeHeaderView { + + private func _setupUI() { + addSubview(stackView) + + stackView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + +} + +//MARK: -------------- ZKCycleScrollViewDelegate & ZKCycleScrollViewDataSource -------------- +extension SPHomeHeaderView: ZKCycleScrollViewDelegate, ZKCycleScrollViewDataSource { + + func numberOfItems(in cycleScrollView: ZKCycleScrollView) -> Int { + return moduleModel?.bannerData?.count ?? 0 + } + + func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, cellForItemAt index: Int) -> ZKCycleScrollViewCell { + let cell = cycleScrollView.dequeueReusableCell(withReuseIdentifier: "bannerCell", for: index) as! SPHomeBannerCell + cell.model = moduleModel?.bannerData?[index] + return cell + } + + func cycleScrollView(_ cycleScrollView: ZKCycleScrollView, didSelectItemAt index: Int) { + let model = moduleModel?.bannerData?[index] + + let vc = SPTVPlayerListViewController() + vc.shortPlayId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + + +} + + +extension SPHomeHeaderView { + + static func contentHeight(model: SPHomeModuleModel) -> CGFloat { + var height = bannerHeight() + +// if (model.recommandData?.count ?? 0) > 0 { +// } + height = height + SPHomeTrendingView.contentHeight(dataArr: model.bannerData ?? []) + 25 + + + height = height + SPHomeHotView.contentHeight(dataArr: model.bannerData ?? []) + 25 + + height = height + SPHomeShortsForYouView.contentHeight(dataArr: model.bannerData ?? []) + 25 + + return height + } + + static func bannerHeight() -> CGFloat { + return 183 + } + + + +} diff --git a/ShortPlay/Class/Home/View/SPHomeHotCell.swift b/ShortPlay/Class/Home/View/SPHomeHotCell.swift new file mode 100644 index 0000000..0684219 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeHotCell.swift @@ -0,0 +1,96 @@ +// +// SPHomeHotCell.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeHotCell: SPCollectionViewCell { + + + var model: SPShortModel? { + didSet { + coverImageView.sp_setImage(url: model?.image_url) + titleLabel.text = model?.name + desLabel.text = model?.sp_description + } + } + + private lazy var bgView: UIView = { + let view = UIView() + view.backgroundColor = .colorFFFFFF(alpha: 0.1) + view.layer.cornerRadius = 12 + view.layer.masksToBounds = true + return view + }() + + private lazy var coverImageView: SPImageView = { + let imageView = SPImageView() + imageView.layer.cornerRadius = 6 + imageView.layer.masksToBounds = true + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontLight(ofSize: 14) + label.textColor = .colorFFFFFF(alpha: 0.9) + label.numberOfLines = 2 + return label + }() + + private lazy var desLabel: UILabel = { + let label = UILabel() + label.font = .fontLight(ofSize: 14) + label.textColor = .colorFFFFFF(alpha: 0.28) + label.numberOfLines = 2 + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + _setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeHotCell { + + private func _setupUI() { + contentView.addSubview(bgView) + contentView.addSubview(coverImageView) + contentView.addSubview(titleLabel) + contentView.addSubview(desLabel) + + bgView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(116) + } + + coverImageView.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.equalToSuperview() + make.width.equalTo(94) + make.height.equalTo(124) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalTo(coverImageView.snp.right).offset(13) + make.top.equalTo(bgView).offset(10) + make.right.lessThanOrEqualToSuperview().offset(-10) + } + + desLabel.snp.makeConstraints { make in + make.left.equalTo(titleLabel) + make.bottom.equalTo(coverImageView) + make.right.lessThanOrEqualToSuperview().offset(-10) + } + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeHotView.swift b/ShortPlay/Class/Home/View/SPHomeHotView.swift new file mode 100644 index 0000000..41203db --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeHotView.swift @@ -0,0 +1,91 @@ +// +// SPHomeHotView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeHotView: SPHomeDataItemView { + + + override class func contentHeight(dataArr: [SPShortModel]) -> CGFloat { + if dataArr.count == 1 { + return 139 + contentToTop + } else { + return 139 * 2 + 15 + contentToTop + } + } + + override var dataArr: [SPShortModel]? { + didSet { + self.collectionView.reloadData() + } + } + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.itemSize = CGSize(width: kSPScreenWidth - 15 - 20, height: 139) + layout.sectionInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) + layout.minimumLineSpacing = 10 + layout.minimumInteritemSpacing = 15 + return layout + }() + + private lazy var collectionView: SPCollectionView = { + let collectionView = SPCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + SPHomeHotCell.registerCell(collectionView: collectionView) + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.titleLabel.text = "Editor's Hotlist".localized + _setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeHotView { + private func _setupUI() { + contentView.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + } + +} + +//MARK: -------------- UICollectionViewDelegate & UICollectionViewDataSource -------------- +extension SPHomeHotView: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = SPHomeHotCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) + cell.model = dataArr?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.dataArr?[indexPath.row] + + let vc = SPTVPlayerListViewController() + vc.shortPlayId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeShortsForYouCell.swift b/ShortPlay/Class/Home/View/SPHomeShortsForYouCell.swift new file mode 100644 index 0000000..ebaaa1e --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeShortsForYouCell.swift @@ -0,0 +1,80 @@ +// +// SPHomeShortsForYouCell.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeShortsForYouCell: SPCollectionViewCell { + + + var model: SPShortModel? { + didSet { + coverImageView.sp_setImage(url: model?.horizontally_img) + titleLabel.text = model?.name + } + } + + private lazy var coverImageView: SPImageView = { + let imageView = SPImageView() + return imageView + }() + + private lazy var bottomView: SPGradientView = { + let view = SPGradientView() + view.colors = [UIColor.color121418(alpha: 0).cgColor, UIColor.color121418(alpha: 0.8).cgColor] + view.startPoint = CGPoint(x: 0.5, y: 0) + view.endPoint = CGPoint(x: 0.5, y: 1) + view.locations = [0, 1] + return view + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontLight(ofSize: 14) + label.textColor = .colorFFFFFF(alpha: 0.9) + return label + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + contentView.layer.cornerRadius = 12 + contentView.layer.masksToBounds = true + + _setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeShortsForYouCell { + + private func _setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(bottomView) + contentView.addSubview(titleLabel) + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + bottomView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(65) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview().offset(7) + make.bottom.equalToSuperview().offset(-12) + make.right.lessThanOrEqualToSuperview().offset(-7) + } + + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeShortsForYouView.swift b/ShortPlay/Class/Home/View/SPHomeShortsForYouView.swift new file mode 100644 index 0000000..a797f22 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeShortsForYouView.swift @@ -0,0 +1,81 @@ +// +// SPHomeShortsForYouView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeShortsForYouView: SPHomeDataItemView { + + + override class func contentHeight(dataArr: [SPShortModel]) -> CGFloat { + return 271 + contentToTop + } + + override var dataArr: [SPShortModel]? { + didSet { + self.collectionView.reloadData() + } + } + + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.scrollDirection = .horizontal + layout.itemSize = CGSize(width: 204, height: 271) + layout.sectionInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) + layout.minimumLineSpacing = 15 + layout.minimumInteritemSpacing = 15 + return layout + }() + + private lazy var collectionView: SPCollectionView = { + let collectionView = SPCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + SPHomeShortsForYouCell.registerCell(collectionView: collectionView) + return collectionView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + self.titleLabel.text = "Shorts for You".localized + + _setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeShortsForYouView { + + private func _setupUI() { + contentView.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + +} + +//MARK: -------------- UICollectionViewDelegate & UICollectionViewDataSource -------------- +extension SPHomeShortsForYouView: UICollectionViewDelegate, UICollectionViewDataSource { + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = SPHomeShortsForYouCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr?.count ?? 0 + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeTrendingCell.swift b/ShortPlay/Class/Home/View/SPHomeTrendingCell.swift new file mode 100644 index 0000000..9fa06cb --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeTrendingCell.swift @@ -0,0 +1,91 @@ +// +// SPHomeTrendingCell.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeTrendingCell: SPCollectionViewCell { + + var model: SPShortModel? { + didSet { + coverImageView.sp_setImage(url: model?.image_url) + titleLabel.text = model?.name + } + } + + private lazy var coverImageView: SPImageView = { + let imageView = SPImageView() + imageView.layer.cornerRadius = 10 + imageView.layer.masksToBounds = true + return imageView + }() + + private lazy var titleLabel: UILabel = { + let label = UILabel() + label.font = .fontLight(ofSize: 13) + label.textColor = .colorFFFFFF(alpha: 0.9) + label.numberOfLines = 2 + return label + }() + + private lazy var hotBgView: SPGradientView = { + let view = SPGradientView() + view.colors = [UIColor.colorF56490().cgColor, UIColor.colorBF6BFF().cgColor] + view.startPoint = .init(x: 0.5, y: 0) + view.endPoint = .init(x: 0.5, y: 1) + view.locations = [0, 1] + view.addRadius(topLeft: 0, topRight: 0, bottomLeft: 0, bottomRight: 6) + return view + }() + + private lazy var hotIconImageView: UIImageView = { + let imageView = UIImageView(image: UIImage(named: "hot_icon_01")) + return imageView + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + _setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + +} + +extension SPHomeTrendingCell { + + private func _setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(titleLabel) + coverImageView.addSubview(hotBgView) + hotBgView.addSubview(hotIconImageView) + + coverImageView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + make.bottom.equalToSuperview().offset(-38) + } + + titleLabel.snp.makeConstraints { make in + make.left.equalToSuperview() + make.right.lessThanOrEqualToSuperview() + make.top.equalTo(coverImageView.snp.bottom).offset(5) + } + + hotBgView.snp.makeConstraints { make in + make.left.top.equalToSuperview() + make.width.equalTo(22) + make.height.equalTo(16) + } + + hotIconImageView.snp.makeConstraints { make in + make.center.equalToSuperview() + } + } + +} diff --git a/ShortPlay/Class/Home/View/SPHomeTrendingView.swift b/ShortPlay/Class/Home/View/SPHomeTrendingView.swift new file mode 100644 index 0000000..1fd9a23 --- /dev/null +++ b/ShortPlay/Class/Home/View/SPHomeTrendingView.swift @@ -0,0 +1,108 @@ +// +// SPHomeTrendingView.swift +// ShortPlay +// +// Created by 曾觉新 on 2025/4/14. +// + +import UIKit + +class SPHomeTrendingView: SPHomeDataItemView { + + private static func itemSize() -> CGSize { + let width = floor((kSPScreenWidth - 15 * 2 - 12 * 2) / 3) + let imageScale: CGFloat = 153 / 107 + let height = width * imageScale + 38 + + return CGSize(width: width, height: height) + } + + override class func contentHeight(dataArr: [SPShortModel]) -> CGFloat { + + var height = self.contentToTop + + var lineCount = dataArr.count / 3 + if dataArr.count % 3 > 0 { + lineCount += 1 + } + + let contentHeight = itemSize().height * CGFloat(lineCount) + 12 * CGFloat(lineCount - 1) + if contentHeight > 0 { + height += contentHeight + } else { + height += 1 + } + + return height + } + + override var dataArr: [SPShortModel]? { + didSet { + self.collectionView.reloadData() + } + } + + private lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let layout = UICollectionViewFlowLayout() + layout.minimumLineSpacing = 12 + layout.minimumInteritemSpacing = 12 + layout.itemSize = Self.itemSize() + layout.sectionInset = UIEdgeInsets(top: 0, left: 15, bottom: 0, right: 15) + return layout + }() + + private lazy var collectionView: SPCollectionView = { + let collectionView = SPCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.isScrollEnabled = false + SPHomeTrendingCell.registerCell(collectionView: collectionView) + return collectionView + }() + + + override init(frame: CGRect) { + super.init(frame: frame) + + self.titleLabel.text = "Trending Now".localized + + _setupUI() + } + + @MainActor required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SPHomeTrendingView { + + private func _setupUI() { + contentView.addSubview(collectionView) + + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + +} + +//MARK: -------------- UICollectionViewDataSource & UICollectionViewDelegate -------------- +extension SPHomeTrendingView: UICollectionViewDataSource, UICollectionViewDelegate { + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = SPHomeTrendingCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) + cell.model = dataArr?[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return dataArr?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = self.dataArr?[indexPath.row] + + let vc = SPTVPlayerListViewController() + vc.shortPlayId = model?.short_play_id + self.viewController?.navigationController?.pushViewController(vc, animated: true) + } +} diff --git a/ShortPlay/Class/Mine/Controller/SPMineViewController.swift b/ShortPlay/Class/Mine/Controller/SPMineViewController.swift index 84696af..b897a5d 100644 --- a/ShortPlay/Class/Mine/Controller/SPMineViewController.swift +++ b/ShortPlay/Class/Mine/Controller/SPMineViewController.swift @@ -8,10 +8,12 @@ import UIKit class SPMineViewController: SPViewController { - + + + override func viewDidLoad() { super.viewDidLoad() - + } diff --git a/ShortPlay/Class/Player/Controller/SPPlayerListViewController.swift b/ShortPlay/Class/Player/Controller/SPPlayerListViewController.swift index 909fe7f..81d437f 100644 --- a/ShortPlay/Class/Player/Controller/SPPlayerListViewController.swift +++ b/ShortPlay/Class/Player/Controller/SPPlayerListViewController.swift @@ -160,7 +160,10 @@ extension SPPlayerListViewController { view.addSubview(collectionView) collectionView.snp.makeConstraints { make in - make.edges.equalToSuperview() +// make.edges.equalToSuperview() + make.center.equalToSuperview() + make.width.equalTo(self.contentSize.width) + make.height.equalTo(self.contentSize.height) } } diff --git a/ShortPlay/Class/Player/Controller/SPTVPlayerListViewController.swift b/ShortPlay/Class/Player/Controller/SPTVPlayerListViewController.swift index f1b4aa8..9eae165 100644 --- a/ShortPlay/Class/Player/Controller/SPTVPlayerListViewController.swift +++ b/ShortPlay/Class/Player/Controller/SPTVPlayerListViewController.swift @@ -69,7 +69,7 @@ extension SPTVPlayerListViewController: SPPlayerListViewControllerDataSource { extension SPTVPlayerListViewController { private func requestDetailData() { - guard let videoId = self.videoId, let shortPlayId = self.shortPlayId else { return } + guard let shortPlayId = self.shortPlayId else { return } SPVideoAPI.requestVideoDetail(videoId: videoId, shortPlayId: shortPlayId) { [weak self] model in guard let self = self else { return } diff --git a/ShortPlay/Class/Player/Model/SPShortModel.swift b/ShortPlay/Class/Player/Model/SPShortModel.swift index a86003b..c25c34a 100644 --- a/ShortPlay/Class/Player/Model/SPShortModel.swift +++ b/ShortPlay/Class/Player/Model/SPShortModel.swift @@ -10,13 +10,13 @@ import SmartCodable class SPShortModel: SPModel, SmartCodable { + var id: String? var all_coins: String? var buy_type: String? var collect_total: String? var sp_description: String? var episode_total: Int? var horizontally_img: String? - var id: String? var image_url: String? var is_collect: Bool? var name: String? diff --git a/ShortPlay/Class/Player/View/SPPlayerControlView.swift b/ShortPlay/Class/Player/View/SPPlayerControlView.swift index fe3aa95..4403040 100644 --- a/ShortPlay/Class/Player/View/SPPlayerControlView.swift +++ b/ShortPlay/Class/Player/View/SPPlayerControlView.swift @@ -123,13 +123,13 @@ extension SPPlayerControlView { } @objc private func hadlePlayAndOrPaused() { -// self.viewModel?.handlePauseOrPlay?() + self.viewModel?.handlePauseOrPlay?() - guard let model = model as? SPShortModel else { return } - let vc = SPTVPlayerListViewController() - vc.shortPlayId = model.short_play_id - vc.videoId = model.video_info?.short_play_video_id - SPAPPTool.topViewController()?.navigationController?.pushViewController(vc, animated: true) +// guard let model = model as? SPShortModel else { return } +// let vc = SPTVPlayerListViewController() +// vc.shortPlayId = model.short_play_id +// vc.videoId = model.video_info?.short_play_video_id +// SPAPPTool.topViewController()?.navigationController?.pushViewController(vc, animated: true) } diff --git a/ShortPlay/Libs/Player/SPPlayer.swift b/ShortPlay/Libs/Player/SPPlayer.swift index fb89ef2..bd9bd3f 100644 --- a/ShortPlay/Libs/Player/SPPlayer.swift +++ b/ShortPlay/Libs/Player/SPPlayer.swift @@ -243,7 +243,7 @@ extension SPPlayer { player.playerDidToEnd = { [weak self] (asset) in guard let self = self else { return } if isLoop { - self.player.replay() + self.replay() } else { self.isPlaying = false self.delegate?.sp_playCompletion?(self) diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Contents.json index 6aa90f6..b60f645 100644 --- a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Contents.json +++ b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "Frame@2x.png", + "filename" : "home@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Frame@3x.png", + "filename" : "home@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Frame@2x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Frame@2x.png deleted file mode 100644 index 57cf447bf46e6673a906e602c3794b2431810fce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 957 zcmV;u148_XP)Px&cS%G+RA@u(m_2AzK@i9P^Dan)2oWp<1qJQ2v(Q38(Lzu=#Rw52S||o=6fKh7 zoxK-`*hY+KFrtEmq9B5u3W5qYf_4fKQVIqX{JMLio4hA$$lZH)_l^tl7OuISH#@(X z+1;5X{3nC{6Alz0i!G8xM2d*C$pdXqEvMBASapm zdtN}ffea0m*Of}u2LLvD#=ZUdQw}Uy;y~#B{JBb{YwyU&(8oMrasg3_4-&~W06m^j z|9HJdv|Ot7TdVK23eyruY}`cvgPtMIxIt_6#6rf^*gs={oNXo5ng$8OaLun@l{)~o zcm}^Om4f|BsWe3`f``fwrFajK+ydb4h-BO)!ck+)*DPrg zNAo6t{hs_xoNAA<=+VOtJTP*sh?_30XfXf(^+(90*Q~-=KxlEN*@Dq zh?!@yER-grwO#?xbpU%k+39Mvv^@-mKcs!12}Eo2!rRmp5gM{qUr1Bl%)C;3j!2A` zYEPNXjx=4VAn~UB7AvYmQLw9AR?pHDw=%C3?Res7T<7!QEbk z>?+#_MA4Nj#bC!%E3O1wTk9Ye8m>m$$IPyeuQ@snq7)w?lF52T#y!XFMGd00xeDNT zY~&abW?Nnnobvu3XErAnJBTaAXP<*aXdrpRV&)@J^fywI%;snTvVaG2FB-KrMMQi@ zcl^{^v=K4J^oZa~(jmGw_s=Uz%{N;j=}X$;I-C8q2)XB^TBDmt!lXk4WNF$Znz~2a zN?MyI0Jb+;0oDO&L{&aL`y7Z~50Had-G~J_fK31RA=^erc`9w)Oc9A;dPM?vYx{3c zb@fM4aHm|Jd-Jl^ZmL$J{xpMiYC%}^+Y~1NLB+nC0BrS%Ja3>Eh17xq)i?u fQmajlZCdSbP82^;Z}<*v00000NkvXXu0mjfeG92$ diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Frame@3x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_01.imageset/Frame@3x.png deleted file mode 100644 index 1a098225a6d48fd829c3cca3d2dc635df015982b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1831 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 literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Frame@2x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Frame@2x.png deleted file mode 100644 index a086e356323e1138f074afe81078526dacff762d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1215 zcmV;w1VHPx(c}YY;RA@u(SxtysMG&s)7hw+(B1G`8LIg#F2}ZJ_prAn|0V6~d;$gsm@#H0- zqGG12>&+~z5HSZY!GMa23JWH%fel0)55a(nD=xSPg-G@gP(g6P4b1CuO8c3|x^L#a znU|eioQ6Ftue!RvuYS6^24RCQ+~D@Z2tbt{B%)0KFb)8V%-k-bd*~h@qHz(k7f}uX zz(WAA82~Pe;Ndu?Grd5pIRIrjilTdy#H+!N0Kl#sBimQ5$o8oz{;?Z~H32|GTLa7c z0AN1=Z0W^p_kxlBf<^Nxuw)XB6lezKm-rPF}+s_03sR_F%Kh(CZC4Jtwksn!J~-&^|Ulv z%g-aqTVd}4v)iu8?R~V{82=Oi)BxZn{jPiCm?rxMKt$U@0;<7k_*fUCfA5sSmI$^G z<#;NWB(kU3!1|a0;M9#@7I#VYhXq?kF-7*4l4M18~l57J-if)4hnk5Jl#d zBuUOI%S1E*fL~?e_(o>d5Q2I=zRMW@0RZgirBno69257I#6<4>;L4TzmjU2h=F(9& zzZl2#Mk;76KZ7XmhX0pDuvRd+_4b_;!D&Q)nwb}Rfy_-}BKJqQ6;;Q@Q08X5_n&DJ z0^pxllU5#Q=9x^0ya@nDdL16V|C`*1{%q>0f_w9uIU@H<8j~V;AdcyDs?<5RLj=Ch zgvf0o=JpcFJ@=0nkEKxB66RHYE$66YbG+q>|V{&-X#ZU3;=%sfNj^zw1SGY z4978jSSpE`d9U}PeM`Eucez~f%qqn6)=w|Hd1kk>6aZ`aHAHEKO)X}(rwXfz>L8-~ z0PxEo-)45#l?6bVzWfxkd!p#!RmiPutC`)Z;ohx`{(k|4C*=Kz{!G91f2ba?mS0Ac zsZNW0AxWZIvswSCY*-B&KsNlAMes-*(}^-5))Ro#?pC|K>Coil(VvR|S&snJ?sLrU z(TxgVA&N|`+w(9BY(05EUs=Ziq|VIR=oMPS29Vz37ri&NM#G*jWOYVpr~tyi_MkCx zB0KLX17fHE${3m_I|5)Wzkn#m0z>lva!;8g9MlWe^1;mbaf#VoU#c7Z?{Mnxw?N@4 zGAMvB8%<}ex$S({;VzNOP9`d_sV^1F-kW`mhW(3q4By7c#Sc4_86ZJZf-_{_x?BSW_z{cg#c7)S;fjm04gT5w7QW8N>f(xhLHy< dCbYD=zW@%@S5MiB^q~L%002ovPDHLkV1i8RIn4k7 diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Frame@3x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02.imageset/Frame@3x.png deleted file mode 100644 index 4fdb9304ed8a599b64fde37a64bc161fd4b2230e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 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
  • )^}NPrJZE<1x2Gd-1nVn;2>5WV<9Rye+6)(;9JhDmO<-!B_a(t4MF{2K^BnG!I#0p8l`><+P z!Y{D-Nm3+yODoBTYPCm{qkFT$2ca=vvEND;61D-WH{%F&=9baL zyUo|DznJ<>c@q;o1Te8kpR3423w*B2Yhv*K0;Zv`UL0g_UH||907*qoM6N<$g2E9^ A`Tzg` literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Explore@3x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Explore@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..04d80d085eeef013ed4090ff4a17c8343d9aa481 GIT binary patch literal 4075 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

    rL$JQ}o@cc9Bt?q3HnCC54;u zzXaImr_r%)=Z0-vjA_9-6zVu_CM)(&rAwxR(Ie=9keI9iAhi?Pz5+QM4TSkk%#e`q zj<)|166kteNq0fZzJNE;Ys9LvurOJ^(XO;Se)R1j90UBa!h)p*m5W=j6Ox=t? dLu?JP>A#*qQb6CJhZq0=002ovPDHLkV1k?k4om<5 diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Frame@3x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_02_selected.imageset/Frame@3x.png deleted file mode 100644 index bbe4d513ac4892181c2d96e145bf155ab1b1724a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2100 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 Hu0mjf*oY|} diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05.imageset/Frame@3x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05.imageset/Frame@3x.png deleted file mode 100644 index 58768840c3cbf9996feca8a0bb108ec58c3f1efa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2372 zcmV-K3A^@*P)Px-{z*hZRCr$Pn}2LpR~g5@&wbmuz6{0&&e(}=DoQ4G#)-5>3#1#7a@7ipY)vP$LBuhyyra61ED(3NPwz*&P<>RXo3i-0;&Q^c8F9X zs2V}l2uenv8bQhURnMSm1XUv_8G&;#f|{F~>!wYccG=L-&}<^-W&pDR%mQ#}(O!C0 zM2-{5ZvZ@#%hew4?|=P7S6A0Ssx-<7KdWcZ)~#D>j~zQU7obIedZ}3Uym|AaQ>Xem0W=cPGyqP8PWmG9I)ELHL!Q?9-xaQp zH9d7eixw@)G&D4P*!TShMQ}|SD@}x)B69ixDMdz&h)g1)$>k!92>bH+d{aY1!~Vv` z#(XT#BQ8oEkW%UvfYt?POxUdd0N4Y_^8o%rM6YBrnUlF(PKf9t5xIhht`fm@g?aM; zTsX$3mjGGA%uhu0HP*CL0V$qUe%ZrnI^ zaB#2zAO+xtG4px=S;Wk{V|gE8QEGtN+uN@k9?tC|q7Rkq5RsEa*wowG+g0f=lKJJE zGG$7$2);o?7mxZTe+6(0GariJZ^ctm0o2*qIk~@o;C_IX0+I=$=9J^m-6HZRGY?j5 zX(95IQWuIicLM&p;CwPyf;=EU$Y$$SwY0RHiX-<-Yf=HEl)7F7&k#{v2@Vlf0N6g> zc8cnlQp#Kl7K>m@36h8m5aC8<{#{f#QRi6)RCIuz9X&717xuUG_V%_^x~;}@BG_)7 zfU}|$q2{0mqn6z1|l(kFI0p zJyF(2onsx4Qv4Jk3qwYC9XxpOo}D{)TD`BBUpTGxI)K)MbUn$;w?%b6$~>!pIyyRL zed7ZnYZdzrb}ma*mJXsuZU?ua&# zflS6(sg!!ymQJgHT$h_22c05P8vweUnIE-fY&kiu>n|2!o~O*)&&se3Xbq8clu{XvL!VYk{nCo1 z;|K`@0^p0#TF+A(Z0WQLNGY`npv?d-2)5YQnfcqcj4dZeDYXos(wQ?PLU((f>b9lR zHlQy8^u5p_{V+2xw`J@&fHnfuQv4g8%;){(9Ub;kAhrR0g2;J7MBWiNbDUYfGhIOX zaN&*jf#3{!l?V%%`H!}AS_M>m#rN+mgwj&eAQb8WDHeGnKZ}BkR#^3WG-*9QXJ!fHK~u_Qu_JPIii@^v-vTs18Qw;ol#R$ z`_Gb*L6U44vw5T08?MXqiDY}|)^4tfGnx4%ds+bNfQ)fk>un&rnfV`aosY6EbwI|5;OzJgAh#CYYLlWEHr^Z&`7aUu7?5UWK9NLLl(ne?TDx}b z2OX#OBLLp-IC95mIyQ=VZ=EB8mx<(uBF+KdAKu^5(P5q%sg2YCwY7P394Frb&>RuD zB&d;1)anw+Q4tXUeMIyIAbSgo^m$WRRZ2}KqGi4>Ye%b}k^GK5sn{KY2MTGH^~~H8 zTTq#W)*>hwG# z$Tn@-6u)mM5g^k=mdoW$PtLmniw^mI{}`4Hi2N%wtRxUH?Nm)F$Pn#|?LgKcICiC^$MW%>nTjYNR7);|(K zW1!iz@vda%ZLut|u&B7@FTNMRS3=?*XVy#NicbVcDQy}k&3_>QN0wQW6p(5BF1@dg`F?&udwcu7xW?F6$IJ_TUrZEF4dmsRb@+}{k(#7{ zLf3gZN+dViZndk(n_}7NlOotbL?(wcGMII2KVvU6ij~r*0g1?Kjzg;o`QlXim7{_Z zk&lUB6A@iPx)&`Cr=RA@u(SYfCYRS=%pT{OWTFW(LNVeo{Y!nfz#%QG=jdKVOo6#UVnek3Ux z7#1lM6&WcQ1_>D&8WtHD{qTW?g@ML3GPKvzz31$cjD&>zVdTpFA-vRk?z9uT@w(mT zp1Z4v;Qrk?GxMD}GxNz3jTJsRGL_~f39}zDS z(K!I91Hh3>moA;GR;$e$5xv3@sMTtBl}e?xM6?0z2^ES<% zJ^OMVAh`gXK7D$+F=l)0(f95mDXqyajpRZ70vP*8C)2 zh@){LilPO!RmvK`*x1;ktyb$85nTj;ij?xa)fHI^CDHvJ0Om0eA;bqZN38)Ur2<4O zw_2^`<#Ktijq+|~lv4cwz;-T1Q8cSst^Spz!wNtchEEXDS8E|{EQA=!GJYfeYpwTjV*`LiLWm>R)0qh%48xa* zXj|O&H%KYpPL(kS>h0~_iHO6#?|-?*&~ElISGJ4*L7<#51LeFlAgd6K%7P%sbk0VmlXIs|om%L59w%}p@XRNqwcY{%ueI0zn;8M6)YFLg1v6D4#QLHU zNT1LeA;gChbD&fzZ8yezSuU5kNBr;O9Pm8v-Db1-c{hYlYrPf#cC_bRCmWd&2!ddl z>$>}iXqS}odD}!RBA4X`#W=XDWzY;G263BsW7f?{l=JCS zhjAb1CnDc=Xt8y+T~2GwW9iRv9~cutWL}spfPd<;O;Y7`JUy2_A4J^X`~JUuXEME3 z07gegOH-yy`8A$@c^Z3YU|`^EQAa09`aain`S#)J)vNc-nKOr}`*lAn0IVSl!?YS% zk*qAko&GDOcvM|%)4F=j!fQsD)d)z=jO)|hnQLkxnGI*OuKZ0FZ@k9drnF=NIS zM0}ZdM2I*fgg9X3c_P#`06xbY$8nr}yguY9&2gM{{r&wvbYqxjY-7w09#i9uL<0cW z`Rh{WPWp2JNI-DKV7|gbIDeak5O3OmNcmMFd*a%)Ys>Riw%hPwIT7M-g0fQhYyRI8BHMw%-%A%r+ zu|fcpQV$>^Gtv9wZQW5JMAh;M@sKkJ0B4D4NuHf(*L|SfF|GAuM05ZVdw5=UU3X>H z0G{ed76qRr>yri|E{nl`X9K=nCRYTMQqS_7%PVr`NJ5C$^B7N)Ia#x>w%G#}1~Ad6 z<2Y-4-~Tv|^XZu|3|F;UtzF4wSXZ*HpHQ+^=Rup-9l7gvC$Pyfi#Kx9iD=mKJnQFZ z{e+ZK2N7`zCmsMS6+)aTa`PQ>isyiXTo8DTDWzO$qu&|;^K?Y)8y_Eku4w6-%rP#> z)22=1Eyy_`#EUl+fQ_Px=;z>k7RCr$PTX~R_#T9?AznPuc6$k}xVzMCy1sB+v@7oJW0$PF^4aVRR@uEbG zN4$?hLqJPoL`iA9f*6l@AQDAUD^a|~QesKDI`bWSz#37qQtGlME|_I@=IfVvo1Ut5 zi)HsaX3?tcf4{H0-~09J*YCalHNtS)BLX;#&z=z&250~a83t$=pkPj9*n);F=o@T7 zsZ?sTrfCNPzz6^sO+=$v9Yo9lz^4H4@9ysIkLv2`IuMb9sp_xykZ-YcI$a@zIG%`( zLd1g*t@M0c2U$q`am45deOolr31mHbi{Hb=|c@^jS$s$qv_bGi7CExrq}eX85OuhK6V~ z8ZF6Yv!&5!G%keLPfB?tBAx;O2>=jES>9?NAmXxkJie;X-wzP|^$8uI*4Eb8u3fth zC89e4fI;H6i-_JQqPybp_@k31P1@l{3AV^_A8%IbfFO^bWhKTzrpV0~c_Y%=xtE;O&4nuObuvjcMorul{0QPC@;JLj_ zL|5p#-Wb-Y7aBmyau!M{7b9Ys0_X3Vrd`zD-o9<-%$a<2huSzyh(sbk2Y}m%h!=z% zc7v4i#IP146oA;w9mhG3h;CDkn2+ZBVzJmYez%hsBu&#i91-sYfCJRRyryZ|Nr^<_ zb1&oU?%z-VvTb`V5#6tjZ;oAluW8!tRaI4dG7U*%kc1G+iKxf#5z%TX<%KmhHU9}B zKwy9z$C)ane5}{%EiEf6`+YG^lz|j=9Oqyq%Xk%FF4T4Xo*;o`Ab{8@yRQ3Z05}~0 zBqFZK<#Oi-UA2LL=E5y6&8snwk&&ju{9b$8nC8Qm#~S&KB2o zPpGM>N&6KhjDE^-uOy;l)mFROFpQ;s#|{LLX__3(a^S{${&HQ{?+EL7^{Wu~Gfk7X zn4?b99c5)@6DCZU;441z4UlP?^AYhOrN~BI*MAg5sj&N6mh}JtEKrMgqhT0J{LJAC zAoe}ETO_OSZ;`t4rl^94{UmEtge z4I-8Uz#Dl1P6|83_o_(W{~gB}Bc)sg06*g-7y#z!y8gV^aXka1$`@A>(NaXz0O00i zGPy(*xxCI_)c^%cy+xBg#9M~m=6Fgnx@UFs;c^AAi?s=aOvV{BFYINj!Pz!&kfXPpzo$> zu0_NX_&+ISqPn`eaiBiEzXt{AVZ$)a>^tFm@4Z*9Y1-q6I1>OqbX|AmV8VUVG%v`X zjCZN=*tZqpEH65J%`zh5)MPT*;AOvhwxHfl8UP;Eb)Dm(ue5w{7O^brG9ko8 zM3gEiDLG>>@kdirQzDnkJ&lMvUDuuG)uHxtit$37%K5YqB9TZWnu-n3K|+X)s>HFe zqoZTS?&{53wrq)i@x>Ph#^dp=g8`=?^rlUl_RZyTkttKAeCjpo?W_3u_3I;J#*BFf z5vvh#J0kwrYs}`^f;dnlqNn)2i-t6v-{rM=9PPN$C&LOcopV*%ia($dniCr+H$>17Ph7PMx~8m+Rj z@|t{ddNuEBM7*xKxp~=OB4sav1^t)hoIH8*A|kp@jrF^hmX@2m%IO&(p3HHanNrHf z0ic|S*1N8Ia&2vGdr+mq?7wm2#<8WPrCjbf8UTD-x-WoQT3SYScXz+ZISv5qK*U*I zkIyi{*xgv^boyW+#2f0K&W^=mvnneqho)f00$G-IIRM>F{&>HY z0p9>AE8@J2L5UJkb2J*AGiAyYCM)c<*3{Ire=e7MRxMnX@9cD4f5NXofdEn|#lrwF zTalXXk3=F@4&{||Z^hMR!p(@tsRfsV*F~ez`I9G4?$|2;srvMx0Kg|22asKPrr1Km zFjn{#C`dmpm*hE*w;*CE5p5SjoR&x=UI`MB2eP1oGVHJs@g^ebq1fe_V;77XHR{3f z(;G{!#Gt#0f?1pXlN*l#bS$jiz!Rudh+u`bY`(YQs8g} z@|XGRr+pNGVih7@9tJn4#~KH_QiJ(Vv09mKQV_T&B9K!4CK`?YBP{35&N!RRPG>$4 z08CJ_vHyD{7K<(M6A<>NU#I}_Bx<{zMMPHtzz@~Le1G<<>k{{*ImxFn8JjJ*zCIQxz*Lx8~lKj zPN(@U?k|d=-!nv>n4Z=&?c(lrg(dOw;_f5Q5{Oo?8X=9^(>S*B|sFtYukDh++mmKcC`&@O~-f zl44SCiUJUCt5hmg7l}lc0l?u(ne9Y$M-Y0jy3)QZ&tT;fvhZT))m$#OsHUdo-C}IF zq5x#ucD#nY@quF|xJ;n}OO4%rcII9>%yHEk* zoM`9Horg#%`EH9NTRw*Qxzh!PVZ7>RTlLq6iQ@pUqHyFB(U<&CZ^VcZZ-$uzh6Yd} zCnBPSy&kgglYm7*gTp-pjZlRaRDp^1`P-O*d`YRFTPK*w^vt#=N4Ph`2JDOkNlmouIiGJ7deTDiD!R zr6ZI;MahZwq%7aYW-=M(O!CXd!mCDRmNA9q;~>sEkOi5hnaDq%|TJWskgEuQS2jFpM6;m!B30Aj`72*2@etF1&$ZwoZ|b2PzaQfVeEfclpOUZ5Kd|H4xvv%!pnCw|R0*^!^`tDtMHU_hFX+0000Px%*-1n}RA@u(n9oa8Q545NM-5a8Toe@q6%`Z&)glmTSMCgKrBcx!P*9QiUO!-R zVa-U8LhV|#5Hu(%5F%(HRM4V@;G#uA1}%(Q2#E@f-FnSrqoMDf^InPYW;^G6zvpwm zm$`SYu);sG!sjOgSndR~1hNDYu0XbhDi_d^Yk;~|kY->nu%Z0@IPe-6f~f~W*F?gF zpKDJg0Y|O|>dylq&=50RG<+VW`h>2Tq#%g_9Np`o=00#xIm`>7T?jrZ`{tD=0w@h% z{R(7@afmS}HVT(N8T;)gacSGsJpnmvH81tKVVG_bx{4MZa{`Y1DUe$h)4zMwmKLFCEHCwvg^$Xz% zt)>;=4aiQdSxo&qA=shSv;uquS*RuEGHj-GAcqU&^{)p$YQ2voNS9UruMY5>Qz15iEW@%o^hWddfK zg-b6rjVb`gjm(hrGU6+our5j= zddZ9ZC;$pKfwQrS=@j$|!8so(4ZtX{+eb8onh_z`=cA(l$WJG~_xOzT>u8)2!aAR7 z1wg_12&Ppd1YWaw6_u|G8Gt68f04idkn&^JqDX^6(C!25y@h002ovPDHLkV1j-jTjl@& diff --git a/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05_selected.imageset/Frame@3x.png b/ShortPlay/Source/Assets.xcassets/TabBar/tabbar_icon_05_selected.imageset/Frame@3x.png deleted file mode 100644 index d4c523ae4c6daa7480424db8c22a51549c2f7bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1412 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 RG~ECI002ovPDHLkV1kY`4441_ literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/hot_icon_01.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/hot_icon_01.imageset/Contents.json new file mode 100644 index 0000000..5472a49 --- /dev/null +++ b/ShortPlay/Source/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/ShortPlay/Source/Assets.xcassets/icon/hot_icon_01.imageset/hot@2x.png b/ShortPlay/Source/Assets.xcassets/icon/hot_icon_01.imageset/hot@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..49c454ffecab98af79e5fd457f9e3cf3579e4513 GIT binary patch literal 533 zcmV+w0_y#VP)Px$&q+i;2e*z8_!0#n(>TP=(I2)&uG|&`myGzn{+q-}t z!0rP0H*f$rS^Ma#EcOf7E9vJ}Zmwe6{lL388qfu-G|=)6&<$Kp;zN>NZv)%z02YBh z;1sX~d}#n)uXV~dpeKockaT<}@EPDu78nO^)hha0cKe0+fTZZ6zinju88DJ)HVDjA z1mBZ%y$GHMjwPTqU|&V>TS=#j;JL)M6?ygaIZ4qiIVr-Xxh8Lc{#??g{p;;!JM;~m z+gZbsUKYWjXLP}y7RhlZJz=gKI9_az)g1JoMetQgk9Krk2A=}XRfLaAx|HtOHiT@) zYPx&T}ebiR9Hv7m|dtqh!_Tp1BOfbwG(&hc4GD;dFz~y8eZakKLAR&tcy_2j+y=Y{%m-W#E!!dKnV|ylHn0M?p%8G7q@_Iv z5fS$Q-vDK`bV$;|o`T3!{0MlgBG55OGm2{wF%p;woR{=f+1bYIh=@CZqrj935GR1? zlFqeJ*bI6Lm<#Nb^jx0A#l1JCzUcmccvtOuNhF96fIWfv2* zCrkRJ=%chIBI5R(%FmJ(IJkfP8^G$C>OTcMoX$?oVpiO~LDK8BAR^)p;6vcSq>Ouj zRlsFnEAV6k3LXZIr86&->^%-VB3o_&4`ERbZ0F9mT^?h&S9`}{aqm@NO>fsK;Pxa&dqNksTc zteWi|aIipFs1_F|tn0dHM0kMpEYQ)5Obyx>?OT!s@Tyg{az8)dyYuVaAf&;w#HW%< z=hMm=GtU%mT8m1?`+?xPU;wGJu9I}8>|lQ&yf!fx>f-~6TG;!3F2vued^DQ2Bf_(y zh0K$-$G$rI8#w9qFKI{J=B6OLZ*m@R{0`xlAUCtI8IrCMUemi002ovPDHLk FV1f_&yxaf) literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/Contents.json new file mode 100644 index 0000000..76d0040 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "路径 497@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "路径 497@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/路径 497@2x.png b/ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/路径 497@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cd3a7c8fad06b18d246c51c7a15db800bee45242 GIT binary patch literal 843 zcmV-R1GM~!P)Px&1xZ9fR7gw3R)1)XdmMhA_dPpyVvAi2OI#M+n^_BuBs--P{7WAeVzmu98?(f7LF%ngB2=lPJm@M}oV{PW}8U6V|VN&mLKoFJkiz ztxEtVXYwbon|C4)F94_nJ#YcvT1$Fk5u42DAct-Qeu7TJ=a~F$ToE|hdOQ1YsfGhwUVJpV;H%&dfCjKq@A&aiP zCYm!91!2Hx1TZ5D`o5y1*x=aa(BuRhm}AhC)Lwu4&qVa&R&={`w6 zN4V}K*=QRa8{4#QSicv;67Jo3&xYpNvQ;IR)c{IIkcA!yS4I0wFH={GPHyb=!{uAJ zm;6Qbk-`uH3u&^n2q VFzP<1HAesd002ovPDHLkV1jcFj5GiM literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/路径 497@3x.png b/ShortPlay/Source/Assets.xcassets/icon/page_indicator_icon_01.imageset/路径 497@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9c71617546c7af277b3bce151415f40454bbc5ce GIT binary patch literal 1378 zcmV-o1)chdP)Px)97#k$R9HvVSbt2FWf(o@{VrD&@ppHUp(ly-*{xR*BGcTlW z)|xYmQKqY{Y-t#3n^~@At+hF8u1$)`k~9((UBP0d&83nGsTc13-cuhJ6uF38yqJ7{ zz5Dij_j%5_=RME!z61bCEL(~@f;PN>;9P-|0E7tb1XXl_zS3Fi+2FELLWO$ zXxa4jgX?-4F{Od?OGK_EkQDjH+kNT;=H6e}cRPOwoLvR#^+=c}kCu<3*91y>`T68m z{RjL}&@8oEmmsk$uYQmeeo@ehj&QYLC%K#O&0|^MuSyc*It@F;iG;K97wj7EiC1vm#lug;_wbXKmJ#sh&9p1E98Q*D2&Sw9yIuy*ps5vx0s>}JQ5 z2aZ2tX*NN+9e{}?zcuc7mIrFi1MC+u*9c^?sUtfk-4V!^HnCi+WftV_KVOY(Tf zYKNSP@2k`0I=P~G22kSl>W{{YMv<937^vDtV16eorCr+*bQ07~(SGEHFYNz6w$$O= z>QoE&Sz42=7Axr39^1!4?)SUCIjqR5oJQB|Ce;6`R@}NRUwj}q6f`RdVwuoT|Ns2y9t%Ir$N2D{5iybP&tq=z@{ zpGX}su1Q>y@U5Z!(uPri1b=l#Va7l4AgO9eRj**f`4Nueq+4M&!EAs-x>9E}E_@vh z>$!CTv{<|YnE46BvortiXSZY zrKbBH1+W^@xVG-yx)b&EHG#hcQ&`{7`1Yi&S?5~w5H+7DU*^Qgl8g{+KB>o|Y})f0 zPepCD+k@VVJOY@Nqf+z@3$ns(xAQfJwwkAk6CHnO<$n@?K}4UcIA}R6w&ms)e^0@c zQMns(vqyh8`}b>kTZfbEfkj0L!%S+9WEWDH0m6R+E$_<7JN9;YgWt*m{MC}%Y(t-Q zt^K1tVmdY6*W~U>@rOe>fL0I~e#MSjOXJpEOImMbwp3S_AIoox**l!t!MN92J0GyKAdHSBVfV-K zG>AQN&1ZGN(4MsIPsDux6Ei6-penO>_)`X4OoPlrFjx#}O!ousC{6w-6-?ly@q>0I*7M3kN0!zu@|%ak)p1 z8!0W|&n+st%g9cU%y>{^A*F*H4e!8tV_xiCXjOx#lI1ZHM=aeV12^X#j5qOdC#9u8 z??N1Tg-Ny6^!GQauSu{YWR(VsbQ(;Cn$Ip&#^rTn$Ublxq;v$tQA=}-Kuw6@dN!(V kz{qoTEGTHYdGC(rUvq}rx$rYXE&u=k07*qoM6N<$g2Sbl`v3p{ literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/image/Contents.json b/ShortPlay/Source/Assets.xcassets/image/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/image/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/image/main_bg_image_01.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/image/main_bg_image_01.imageset/Contents.json new file mode 100644 index 0000000..36577cc --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/image/main_bg_image_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/ShortPlay/Source/Assets.xcassets/image/main_bg_image_01.imageset/bg@2x.png b/ShortPlay/Source/Assets.xcassets/image/main_bg_image_01.imageset/bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..31058f2f610570453197b3e65f1b48d3c26eacf9 GIT binary patch literal 274463 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