From b52e1b4a21a1b92f82fb50120cbc2aefed04d18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE?= Date: Mon, 21 Apr 2025 09:50:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=91=E7=9A=84=E9=A1=B5=E9=9D=A2=E5=BC=80?= =?UTF-8?q?=E5=8F=91=EF=BC=8C=E7=BD=91=E7=BB=9C=E7=8A=B6=E6=80=81=E7=9B=91?= =?UTF-8?q?=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 2 + Podfile.lock | 10 +- ShortPlay.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/ShortPlay.xcscheme | 102 ++++++++++++++ .../AppDelegate/AppDelegate+Config.swift | 2 +- ShortPlay/AppDelegate/AppDelegate.swift | 11 ++ .../Base/Networking/API/SPVideoAPI.swift | 31 ++++- .../Base/SPNetworkReachabilityManager.swift | 60 +++++++++ .../Controller/SPHomePageController.swift | 14 +- .../Controller/SPHomeViewController.swift | 8 ++ .../Controller/SPAboutUsViewController.swift | 18 +++ .../Controller/SPMineViewController.swift | 11 ++ .../Class/Mine/View/SPMineHeaderView.swift | 14 ++ .../SPCollectListViewController.swift | 95 +++++++++++++- .../SPMyListChildViewController.swift | 87 ++++++++++++ .../Controller/SPMyListViewController.swift | 114 +++++++++++++++- .../SPPlayHistoryViewController.swift | 124 ++++++++++++++++-- .../Class/MyList/View/SPCollectListCell.swift | 23 ++++ .../SPPlayerDetailViewController.swift | 2 +- .../Class/Player/Model/SPShortModel.swift | 2 + ShortPlay/Libs/Empty/SPEmptyState.swift | 91 +++++++++++++ .../Libs/Reachability/NetworkObserver.swift | 72 ++++++++++ .../icon/check_icon_01.imageset/Contents.json | 22 ++++ .../check_icon_01.imageset/组件 67 – 2@2x.png | Bin 0 -> 764 bytes .../check_icon_01.imageset/组件 67 – 2@3x.png | Bin 0 -> 1415 bytes .../Contents.json | 22 ++++ .../组件 67 – 9@2x.png | Bin 0 -> 1093 bytes .../组件 67 – 9@3x.png | Bin 0 -> 1961 bytes .../delete_icon_01.imageset/Contents.json | 22 ++++ .../delete_icon_01.imageset/delet-选中@2x.png | Bin 0 -> 871 bytes .../delete_icon_01.imageset/delet-选中@3x.png | Bin 0 -> 1634 bytes .../delete_icon_02.imageset/Contents.json | 22 ++++ .../delete_icon_02.imageset/delete@2x.png | Bin 0 -> 929 bytes .../delete_icon_02.imageset/delete@3x.png | Bin 0 -> 1700 bytes .../empty_image_01.imageset/Contents.json | 22 ++++ .../empty_image_01.imageset/空空如也@2x.png | Bin 0 -> 16906 bytes .../empty_image_01.imageset/空空如也@3x.png | Bin 0 -> 31971 bytes ShortPlay/Source/en.lproj/Localizable.strings | 3 + ShortPlay/Thirdparty/JXButton/JXButton.swift | 6 + .../Classes/JYPageController.swift | 2 +- 40 files changed, 988 insertions(+), 30 deletions(-) create mode 100644 ShortPlay.xcodeproj/xcshareddata/xcschemes/ShortPlay.xcscheme create mode 100644 ShortPlay/Base/Networking/Base/SPNetworkReachabilityManager.swift create mode 100644 ShortPlay/Class/Mine/Controller/SPAboutUsViewController.swift create mode 100644 ShortPlay/Class/Mine/View/SPMineHeaderView.swift create mode 100644 ShortPlay/Class/MyList/Controller/SPMyListChildViewController.swift create mode 100644 ShortPlay/Libs/Empty/SPEmptyState.swift create mode 100644 ShortPlay/Libs/Reachability/NetworkObserver.swift create mode 100644 ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/组件 67 – 2@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/组件 67 – 2@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/组件 67 – 9@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/组件 67 – 9@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/delet-选中@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/delet-选中@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/delete@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/delete@3x.png create mode 100644 ShortPlay/Source/Assets.xcassets/image/empty_image_01.imageset/Contents.json create mode 100644 ShortPlay/Source/Assets.xcassets/image/empty_image_01.imageset/空空如也@2x.png create mode 100644 ShortPlay/Source/Assets.xcassets/image/empty_image_01.imageset/空空如也@3x.png diff --git a/Podfile b/Podfile index 6ce4cda..07ca518 100644 --- a/Podfile +++ b/Podfile @@ -31,6 +31,8 @@ target 'ShortPlay' do pod 'KTVHTTPCache' #视频缓存 pod 'HWPanModal' #底部弹出控制器 pod 'Kingfisher' #图片加载 + pod 'EmptyStateKit' #空数据页面 + pod 'ReachabilitySwift' #网络状态监控 target 'ShortPlayTests' do diff --git a/Podfile.lock b/Podfile.lock index 3cac271..6f7b1c6 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,6 +1,7 @@ PODS: - Alamofire (5.10.2) - CocoaAsyncSocket (7.6.5) + - EmptyStateKit (1.1.0) - HWPanModal (0.9.9) - Kingfisher (8.3.1) - KTVHTTPCache (3.0.2): @@ -10,6 +11,7 @@ PODS: - Moya/Core (= 15.0.0) - Moya/Core (15.0.0): - Alamofire (~> 5.0) + - ReachabilitySwift (5.2.4) - SmartCodable (4.3.2) - SnapKit (5.7.1) - Toast (4.1.1) @@ -21,11 +23,13 @@ PODS: - ZFPlayer/Core (4.1.4) DEPENDENCIES: + - EmptyStateKit - HWPanModal - Kingfisher - KTVHTTPCache - MJRefresh - Moya + - ReachabilitySwift - SmartCodable - SnapKit - Toast @@ -36,11 +40,13 @@ SPEC REPOS: trunk: - Alamofire - CocoaAsyncSocket + - EmptyStateKit - HWPanModal - Kingfisher - KTVHTTPCache - MJRefresh - Moya + - ReachabilitySwift - SmartCodable - SnapKit - Toast @@ -50,17 +56,19 @@ SPEC REPOS: SPEC CHECKSUMS: Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496 CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 + EmptyStateKit: dc41e9ce5c6089f67a49d063bce73ade9f2ba73f HWPanModal: b57a6717d3cdcd666bff44f9dd2a5be9f4d6f5d2 Kingfisher: 3204d23de16b5ea53541c44ca5a8efb55741dec3 KTVHTTPCache: 5711692cdf9a5ecfe829b1e16577deb3ffe3dc86 MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee + ReachabilitySwift: 32793e867593cfc1177f5d16491e3a197d2fccda SmartCodable: 88fbf3d65207c2376fdbce4b080a3d578cb51be8 SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7 ZFPlayer: 5cf39e8d9f0c2394a014b0db4767b5b5a6bffe13 -PODFILE CHECKSUM: 13500f038833f93358c53b1941ce4a7f311776dd +PODFILE CHECKSUM: 3842e01f3a774298d51e08a9caf0e72ea42cd7bc COCOAPODS: 1.16.2 diff --git a/ShortPlay.xcodeproj/project.pbxproj b/ShortPlay.xcodeproj/project.pbxproj index 97b1e68..9003f93 100644 --- a/ShortPlay.xcodeproj/project.pbxproj +++ b/ShortPlay.xcodeproj/project.pbxproj @@ -448,7 +448,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = ""; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -485,7 +485,7 @@ INFOPLIST_KEY_UIMainStoryboardFile = ""; INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ShortPlay.xcodeproj/xcshareddata/xcschemes/ShortPlay.xcscheme b/ShortPlay.xcodeproj/xcshareddata/xcschemes/ShortPlay.xcscheme new file mode 100644 index 0000000..770ccaf --- /dev/null +++ b/ShortPlay.xcodeproj/xcshareddata/xcschemes/ShortPlay.xcscheme @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ShortPlay/AppDelegate/AppDelegate+Config.swift b/ShortPlay/AppDelegate/AppDelegate+Config.swift index 25c7553..0b3456c 100644 --- a/ShortPlay/AppDelegate/AppDelegate+Config.swift +++ b/ShortPlay/AppDelegate/AppDelegate+Config.swift @@ -33,7 +33,7 @@ extension AppDelegate { let backgroundImage = UIImage(color: .clear) - let backgroundColor = UIColor.clear + let backgroundColor = UIColor.black let shadowImage = UIImage() let shadowColor = UIColor.clear diff --git a/ShortPlay/AppDelegate/AppDelegate.swift b/ShortPlay/AppDelegate/AppDelegate.swift index fcb5809..15a5fba 100644 --- a/ShortPlay/AppDelegate/AppDelegate.swift +++ b/ShortPlay/AppDelegate/AppDelegate.swift @@ -17,8 +17,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { self.appConfig() SPLoginManager.manager.requestVisitorLogin(completer: nil) + ///开启网络监控 +// SPNetworkReachabilityManager.manager.startMonitoring() + + NotificationCenter.default.addObserver(self, selector: #selector(reachabilityDidChangeNotification), name: SPNetworkReachabilityManager.reachabilityDidChangeNotification, object: nil) + NetworkObserver.share.startMonitoring() return true @@ -38,6 +43,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } + + @objc private func reachabilityDidChangeNotification() { +// if SPNetworkReachabilityManager.manager.isReachable { +// SPLoginManager.manager.requestVisitorLogin(completer: nil) +// } + } } diff --git a/ShortPlay/Base/Networking/API/SPVideoAPI.swift b/ShortPlay/Base/Networking/API/SPVideoAPI.swift index e429e95..299aacd 100644 --- a/ShortPlay/Base/Networking/API/SPVideoAPI.swift +++ b/ShortPlay/Base/Networking/API/SPVideoAPI.swift @@ -43,7 +43,7 @@ class SPVideoAPI: NSObject { } ///收藏短剧 - static func requestCollectShort(isCollect: Bool, shortPlayId: String, videoId: String, success: (() -> Void)?) { + static func requestCollectShort(isCollect: Bool, shortPlayId: String, videoId: String?, success: (() -> Void)?, failure: (() -> Void)? = nil) { let path: String if isCollect { path = "/collect" @@ -51,12 +51,17 @@ class SPVideoAPI: NSObject { path = "/cancelCollect" } + var parameters: [String : Any] = [ + "short_play_id" : shortPlayId, + ] + + if let videoId = videoId { + parameters["video_id"] = videoId + } + var param = SPNetworkParameters(path: path) param.isLoding = true - param.parameters = [ - "short_play_id" : shortPlayId, - "video_id" : videoId - ] + param.parameters = parameters SPNetwork.request(parameters: param) { (response: SPNetworkResponse) in if response.code == SPNetworkCodeSucceed { @@ -65,6 +70,8 @@ class SPVideoAPI: NSObject { "state" : isCollect, "id" : shortPlayId, ]) + } else { + failure?() } } } @@ -83,6 +90,20 @@ class SPVideoAPI: NSObject { } } + ///历史记录列表 + static func requestPlayHistoryList(page: Int, completer: ((_ listModel: SPListModel?) -> Void)?) { + var param = SPNetworkParameters(path: "/myHistorys") + param.method = .get + param.parameters = [ + "current_page" : page, + "page_size" : 20 + ] + + SPNetwork.request(parameters: param) { (response: SPNetworkResponse>) in + completer?(response.data) + } + } + } extension SPVideoAPI { diff --git a/ShortPlay/Base/Networking/Base/SPNetworkReachabilityManager.swift b/ShortPlay/Base/Networking/Base/SPNetworkReachabilityManager.swift new file mode 100644 index 0000000..a9869b1 --- /dev/null +++ b/ShortPlay/Base/Networking/Base/SPNetworkReachabilityManager.swift @@ -0,0 +1,60 @@ +// +// SPNetworkReachabilityManager.swift +// ShortPlay +// +// Created by Overseas on 2025/4/19. +// + +import UIKit +import Network +import Combine +import Alamofire + +class SPNetworkReachabilityManager { +// enum Status { +// case notReachable +// case reachableViaWiFi +// case reachableViaWWAN +// case ethernet +// } + + static let manager: SPNetworkReachabilityManager = SPNetworkReachabilityManager() + + private let reachabilityManager = NetworkReachabilityManager() + + ///是否有网 +// @objc var isReachable: Bool { +// switch currentReachabilityStatus { +// case .notReachable: +// return false +// case .reachableViaWiFi, .reachableViaWWAN: +// return true +// +// default: +// return false +// } +// } + + func startMonitoring() { + + reachabilityManager?.startListening(onUpdatePerforming: { status in + switch status { + case .notReachable: + print("网络不可用") + case .unknown: + print("网络状态未知") + case .reachable(.cellular): + print("蜂窝网络连接") + case .reachable(.ethernetOrWiFi): + print("WiFi 或有线网络连接") + } + }) + + } + +} + +extension SPNetworkReachabilityManager { + ///网络发生变化 + @objc static let reachabilityDidChangeNotification = NSNotification.Name(rawValue: "reachabilityDidChangeNotification") +} diff --git a/ShortPlay/Class/Home/Controller/SPHomePageController.swift b/ShortPlay/Class/Home/Controller/SPHomePageController.swift index 612aa20..3b0e8d8 100644 --- a/ShortPlay/Class/Home/Controller/SPHomePageController.swift +++ b/ShortPlay/Class/Home/Controller/SPHomePageController.swift @@ -11,6 +11,9 @@ class SPHomePageController: SPViewController { private var topModel: SPHomeTopModel? + ///是否在请求中 + private var isRequesting = false + private lazy var categoryArr: [SPHomeCategoryModel] = { let arr = [ SPHomeCategoryModel(category_name: "Hot Picks".localized, category_id: nil, viewController: SPHomeViewController()), @@ -55,7 +58,8 @@ class SPHomePageController: SPViewController { override func viewDidLoad() { super.viewDidLoad() - + NotificationCenter.default.addObserver(self, selector: #selector(reachabilityDidChangeNotification), name: SPNetworkReachabilityManager.reachabilityDidChangeNotification, object: nil) + sp_setupUI() requestData() @@ -97,6 +101,9 @@ extension SPHomePageController { self.navigationController?.pushViewController(vc, animated: true) } + @objc private func reachabilityDidChangeNotification() { + requestData() + } } @@ -130,9 +137,9 @@ extension SPHomePageController: JYPageControllerDelegate, JYPageControllerDataSo extension SPHomePageController { private func requestData() { - if self.topModel != nil { return } - + if self.topModel != nil || isRequesting { return } + isRequesting = true SPHomeAPI.requestHomeTopData { [weak self] model in guard let self = self else { return } if let model = model { @@ -142,6 +149,7 @@ extension SPHomePageController { } self.pageView.reload() } + self.isRequesting = false } } diff --git a/ShortPlay/Class/Home/Controller/SPHomeViewController.swift b/ShortPlay/Class/Home/Controller/SPHomeViewController.swift index 12c42de..01db166 100644 --- a/ShortPlay/Class/Home/Controller/SPHomeViewController.swift +++ b/ShortPlay/Class/Home/Controller/SPHomeViewController.swift @@ -29,6 +29,8 @@ class SPHomeViewController: SPHomeChildController { override func viewDidLoad() { super.viewDidLoad() + NotificationCenter.default.addObserver(self, selector: #selector(reachabilityDidChangeNotification), name: SPNetworkReachabilityManager.reachabilityDidChangeNotification, object: nil) + // view.backgroundColor = .clear requestModuleData() _setupUI() @@ -53,6 +55,12 @@ extension SPHomeViewController { } } +extension SPHomeViewController { + @objc private func reachabilityDidChangeNotification() { + + } +} + //MARK: -------------- UICollectionViewDelegate & UICollectionViewDataSource -------------- extension SPHomeViewController: UICollectionViewDelegate, UICollectionViewDataSource { diff --git a/ShortPlay/Class/Mine/Controller/SPAboutUsViewController.swift b/ShortPlay/Class/Mine/Controller/SPAboutUsViewController.swift new file mode 100644 index 0000000..3b75103 --- /dev/null +++ b/ShortPlay/Class/Mine/Controller/SPAboutUsViewController.swift @@ -0,0 +1,18 @@ +// +// SPAboutUsViewController.swift +// ShortPlay +// +// Created by Overseas on 2025/4/19. +// + +import UIKit + +class SPAboutUsViewController: SPViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + } + + +} diff --git a/ShortPlay/Class/Mine/Controller/SPMineViewController.swift b/ShortPlay/Class/Mine/Controller/SPMineViewController.swift index 8faf1f5..42a8eaf 100644 --- a/ShortPlay/Class/Mine/Controller/SPMineViewController.swift +++ b/ShortPlay/Class/Mine/Controller/SPMineViewController.swift @@ -21,6 +21,11 @@ class SPMineViewController: SPViewController { return arr }() + private lazy var headerView: SPMineHeaderView = { + let view = SPMineHeaderView(frame: CGRect(x: 0, y: 0, width: kSPScreenWidth, height: 200)) + return view + }() + private lazy var tableView: SPTableView = { let tableView = SPTableView(frame: .zero, style: .insetGrouped) tableView.delegate = self @@ -49,6 +54,8 @@ class SPMineViewController: SPViewController { extension SPMineViewController { private func _setupUI() { + tableView.tableHeaderView = self.headerView + view.addSubview(tableView) tableView.snp.makeConstraints { make in @@ -84,6 +91,10 @@ extension SPMineViewController: UITableViewDelegate, UITableViewDataSource { vc.urlStr = SPUserAgreementWebUrl self.navigationController?.pushViewController(vc, animated: true) + case .aboutUs: + let vc = SPAboutUsViewController() + self.navigationController?.pushViewController(vc, animated: true) + default: break } diff --git a/ShortPlay/Class/Mine/View/SPMineHeaderView.swift b/ShortPlay/Class/Mine/View/SPMineHeaderView.swift new file mode 100644 index 0000000..8f83277 --- /dev/null +++ b/ShortPlay/Class/Mine/View/SPMineHeaderView.swift @@ -0,0 +1,14 @@ +// +// SPMineHeaderView.swift +// ShortPlay +// +// Created by Overseas on 2025/4/19. +// + +import UIKit + +class SPMineHeaderView: UIView { + + + +} diff --git a/ShortPlay/Class/MyList/Controller/SPCollectListViewController.swift b/ShortPlay/Class/MyList/Controller/SPCollectListViewController.swift index 930778d..e5c174a 100644 --- a/ShortPlay/Class/MyList/Controller/SPCollectListViewController.swift +++ b/ShortPlay/Class/MyList/Controller/SPCollectListViewController.swift @@ -7,12 +7,14 @@ import UIKit -class SPCollectListViewController: SPViewController { +class SPCollectListViewController: SPMyListChildViewController { private lazy var dataArr: [SPShortModel] = [] private var page: Int? + private lazy var deleteGorup = DispatchGroup() + //MARK: UI属性 private lazy var collectionViewLayout: UICollectionViewFlowLayout = { let itemWidth = floor((kSPScreenWidth - 30 - 9 * 2) / 3) @@ -67,6 +69,47 @@ class SPCollectListViewController: SPViewController { self?.collectionView.sp_endFooterRefreshing() } } + + override var sp_isEditing: Bool { + didSet { + self.collectionView.reloadData() + } + } + + override var isAllSelected: Bool { + var result = true + for model in dataArr { + if model.sp_isSelected != true { + result = false + break + } + } + return result + } + + override var selectedCount: Int { + var result = 0 + dataArr.forEach { + if $0.sp_isSelected ?? false { + result += 1 + } + } + return result + } + + + override func setAllSelectedState(isSelected: Bool) { + dataArr.forEach { + $0.sp_isSelected = isSelected + } + self.collectionView.reloadData() + allSelectedStateDidChange?(isSelected) + self.updateDeleteButtonState() + } + + override func handelDeleteButton() { + requestDelete() + } } extension SPCollectListViewController { @@ -87,16 +130,38 @@ extension SPCollectListViewController: UICollectionViewDelegate, UICollectionVie func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = SPCollectListCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) + cell.sp_isEditing = self.sp_isEditing cell.model = dataArr[indexPath.row] return cell } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return self.dataArr.count + let count = self.dataArr.count + if count == 0 { + let parameters = SPEmptyParameters(image: UIImage(named: "empty_image_01")) + let emptyState = SPEmptyState.normail(parameters: parameters) + self.collectionView.emptyState.format = emptyState.format + self.collectionView.emptyState.show(emptyState) + } else { + self.collectionView.emptyState.hide() + } + + return count } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - + let model = dataArr[indexPath.row] + if sp_isEditing { + model.sp_isSelected = !(model.sp_isSelected ?? false) + self.collectionView.reloadData() + + allSelectedStateDidChange?(isAllSelected) + self.updateDeleteButtonState() + } else { + let vc = SPPlayerDetailViewController() + vc.shortPlayId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } } } @@ -117,13 +182,33 @@ extension SPCollectListViewController { self.page = page self.collectionView.reloadData() - + if self.sp_isEditing { + self.allSelectedStateDidChange?(self.isAllSelected) + } } completer?() } - } + private func requestDelete() { + + dataArr.forEach { + if $0.sp_isSelected == true, let shortPlayId = $0.short_play_id { + self.deleteGorup.enter() + SPVideoAPI.requestCollectShort(isCollect: false, shortPlayId: shortPlayId, videoId: nil) { [weak self] in + self?.deleteGorup.leave() + } failure: { [weak self] in + self?.deleteGorup.leave() + } + } + } + + self.deleteGorup.notify(queue: DispatchQueue.main) { [weak self] in + self?.requestDataList(page: 1, completer: nil) + } + } + + } diff --git a/ShortPlay/Class/MyList/Controller/SPMyListChildViewController.swift b/ShortPlay/Class/MyList/Controller/SPMyListChildViewController.swift new file mode 100644 index 0000000..c562535 --- /dev/null +++ b/ShortPlay/Class/MyList/Controller/SPMyListChildViewController.swift @@ -0,0 +1,87 @@ +// +// SPMyListChildViewController.swift +// ShortPlay +// +// Created by Overseas on 2025/4/19. +// + +import UIKit + +class SPMyListChildViewController: SPViewController { + + var sp_isEditing = false { + didSet { + deleteButton.isHidden = !sp_isEditing + if sp_isEditing { + self.view.bringSubviewToFront(deleteButton) + } + } + } + + ///是否被全选 + var isAllSelected: Bool { + return false + } + + ///当前被选中的数量 + var selectedCount: Int { + return 0 + } + + ///全选状态发生变化 + var allSelectedStateDidChange: ((_ isAllSelected: Bool) -> Void)? + + + private(set) lazy var deleteButton: UIButton = { + let button = JXButton(type: .custom) + button.setTitle("0", for: .normal) + button.setTitleColor(.color9D9D9D(), for: .disabled) + button.setTitleColor(.colorF564B6(), for: .normal) + button.setImage(UIImage(named: "delete_icon_01"), for: .disabled) + button.setImage(UIImage(named: "delete_icon_02"), for: .normal) + button.jx_font = .fontRegular(ofSize: 14) + button.jx_setBorderColor(.color9D9D9D(), for: .disabled) + button.jx_setBorderColor(.colorF564B6(), for: .normal) + button.space = 7 + button.layer.cornerRadius = 24 + button.layer.masksToBounds = true + button.layer.borderWidth = 0.7 + button.isHidden = true + button.addTarget(self, action: #selector(handelDeleteButton), for: .touchUpInside) + return button + }() + + override func viewDidLoad() { + super.viewDidLoad() + updateDeleteButtonState() + + view.addSubview(deleteButton) + + deleteButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(20) + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(-20) + make.height.equalTo(48) + } + } + + + ///设置全选状态 + func setAllSelectedState(isSelected: Bool) { } + + + ///更新删除按钮状态 + func updateDeleteButtonState() { + let count = self.selectedCount + + deleteButton.isEnabled = count > 0 + let text = String(format: "Delet (%@)".localized, "\(selectedCount)") + deleteButton.setTitle(text, for: .normal) + } + + @objc func handelDeleteButton() { + + } + + +} diff --git a/ShortPlay/Class/MyList/Controller/SPMyListViewController.swift b/ShortPlay/Class/MyList/Controller/SPMyListViewController.swift index 2fb20ed..cd1912d 100644 --- a/ShortPlay/Class/MyList/Controller/SPMyListViewController.swift +++ b/ShortPlay/Class/MyList/Controller/SPMyListViewController.swift @@ -12,12 +12,40 @@ class SPMyListViewController: SPViewController { private lazy var titles = ["Follow List".localized, "Play List".localized] - private lazy var viewControllers: [SPViewController] = { + private lazy var viewControllers: [SPMyListChildViewController] = { let vc1 = SPCollectListViewController() + vc1.allSelectedStateDidChange = { [weak self] isAllSelected in + self?.allSelectedButton.isSelected = isAllSelected + } let vc2 = SPPlayHistoryViewController() + vc2.allSelectedStateDidChange = { [weak self] isAllSelected in + self?.allSelectedButton.isSelected = isAllSelected + } + return [vc1, vc2] }() + private lazy var sp_isEditing = false { + didSet { + editButton.isHidden = sp_isEditing + pageView.segmentedView.isHidden = sp_isEditing + + cancelButton.isHidden = !sp_isEditing + allSelectedButton.isHidden = !sp_isEditing + pageView.pageContentScrollView.isScrollEnabled = !sp_isEditing + + let vc = viewControllers[pageView.selectedIndex] + vc.sp_isEditing = sp_isEditing + + if !sp_isEditing { + vc.setAllSelectedState(isSelected: false) + allSelectedButton.isSelected = false + } + + } + } + + //MARK: UI属性 private lazy var pageView: JYPageController = { let pageView = JYPageController() pageView.delegate = self @@ -37,6 +65,39 @@ class SPMyListViewController: SPViewController { return pageView }() + private lazy var editButton: UIButton = { + let button = UIButton(type: .custom) + button.setImage(UIImage(named: "delete_icon_01"), for: .normal) + button.addTarget(self, action: #selector(handleEditButton), for: .touchUpInside) + return button + }() + + private lazy var cancelButton: UIButton = { + let button = UIButton(type: .custom) + button.setTitle("Cancel".localized, for: .normal) + button.setTitleColor(.colorFFFFFF(alpha: 0.9), for: .normal) + button.titleLabel?.font = .fontRegular(ofSize: 15) + button.addTarget(self, action: #selector(handleCancelButton), for: .touchUpInside) + button.isHidden = true + return button + }() + + ///全选按钮 + private lazy var allSelectedButton: UIButton = { + let button = JXButton(type: .custom) + button.setTitle("Select All".localized, for: .normal) + button.setTitleColor(.colorFFFFFF(alpha: 0.9), for: .normal) + button.setImage(UIImage(named: "check_icon_01"), for: .normal) + button.setImage(UIImage(named: "check_icon_01_selected"), for: .selected) + button.setImage(UIImage(named: "check_icon_01_selected"), for: [.selected, .highlighted]) + button.jx_font = .fontRegular(ofSize: 15) + button.titleDirection = .right + button.space = 6 + button.isHidden = true + button.addTarget(self, action: #selector(handleAllSelectedButton), for: .touchUpInside) + return button + }() + override func viewDidLoad() { super.viewDidLoad() @@ -48,19 +109,58 @@ class SPMyListViewController: SPViewController { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: true) } - - + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + self.sp_isEditing = false + } + + @objc private func handleEditButton() { + self.sp_isEditing = true + } + + @objc private func handleCancelButton() { + self.sp_isEditing = false + } + + @objc private func handleAllSelectedButton() { + let vc = viewControllers[pageView.selectedIndex] + if self.allSelectedButton.isSelected { + vc.setAllSelectedState(isSelected: false) + } else { + vc.setAllSelectedState(isSelected: true) + } + } } extension SPMyListViewController { private func _setupUI() { addChild(pageView) view.addSubview(pageView.view) + view.addSubview(editButton) + view.addSubview(cancelButton) + view.addSubview(allSelectedButton) pageView.view.snp.makeConstraints { make in make.edges.equalToSuperview() } + + editButton.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-5) + make.top.equalToSuperview().offset(kSPStatusbarHeight + 10) + make.height.equalTo(35) + make.width.equalTo(40) + } + + cancelButton.snp.makeConstraints { make in + make.top.bottom.equalTo(editButton) + make.right.equalTo(editButton) + } + + allSelectedButton.snp.makeConstraints { make in + make.left.equalToSuperview().offset(15) + make.top.bottom.equalTo(editButton) + } } } @@ -88,4 +188,12 @@ extension SPMyListViewController: JYPageControllerDelegate, JYPageControllerData return self.viewControllers[index] } + func pageController(_ pageController: JYPageController, didEnterControllerAt index: Int) { + if index == 0 { + self.editButton.isHidden = false + } else { + self.editButton.isHidden = true + } + } + } diff --git a/ShortPlay/Class/MyList/Controller/SPPlayHistoryViewController.swift b/ShortPlay/Class/MyList/Controller/SPPlayHistoryViewController.swift index 91047f2..a4966b7 100644 --- a/ShortPlay/Class/MyList/Controller/SPPlayHistoryViewController.swift +++ b/ShortPlay/Class/MyList/Controller/SPPlayHistoryViewController.swift @@ -7,11 +7,13 @@ import UIKit -class SPPlayHistoryViewController: SPViewController { +class SPPlayHistoryViewController: SPMyListChildViewController { private lazy var dataArr: [SPShortModel] = [] private var page: Int? + private lazy var deleteGorup = DispatchGroup() + //MARK: UI属性 private lazy var collectionViewLayout: UICollectionViewFlowLayout = { let itemWidth = floor((kSPScreenWidth - 30 - 9 * 2) / 3) @@ -21,7 +23,7 @@ class SPPlayHistoryViewController: SPViewController { layout.itemSize = .init(width: itemWidth, height: itemHeight) layout.minimumLineSpacing = 10 layout.minimumInteritemSpacing = 9 - layout.sectionInset = .init(top: 10, left: 15, bottom: 0, right: 15) + layout.sectionInset = .init(top: 0, left: 15, bottom: 0, right: 15) return layout }() @@ -30,6 +32,13 @@ class SPPlayHistoryViewController: SPViewController { let collectionView = SPCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) collectionView.delegate = self collectionView.dataSource = self + collectionView.contentInset = .init(top: 10, left: 0, bottom: 0, right: 0) + collectionView.sp_addRefreshHeader(insetTop: collectionView.contentInset.top) { [weak self] in + self?.handleHeaderRefresh(nil) + } + collectionView.sp_addRefreshBackFooter { [weak self] in + self?.handleFooterRefresh(nil) + } SPCollectListCell.registerCell(collectionView: collectionView) return collectionView }() @@ -45,7 +54,61 @@ class SPPlayHistoryViewController: SPViewController { override func setBgImageView() { } - + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + requestDataList(page: 1) { [weak self] in + self?.collectionView.sp_endHeaderRefreshing() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + guard let page = self.page else { return } + + requestDataList(page: page + 1) { [weak self] in + self?.collectionView.sp_endFooterRefreshing() + } + } + + override var sp_isEditing: Bool { + didSet { + self.collectionView.reloadData() + } + } + + override var isAllSelected: Bool { + var result = true + for model in dataArr { + if model.sp_isSelected != true { + result = false + break + } + } + return result + } + + override var selectedCount: Int { + var result = 0 + dataArr.forEach { + if $0.sp_isSelected ?? false { + result += 1 + } + } + return result + } + + + override func setAllSelectedState(isSelected: Bool) { + dataArr.forEach { + $0.sp_isSelected = isSelected + } + self.collectionView.reloadData() + allSelectedStateDidChange?(isSelected) + self.updateDeleteButtonState() + } + + override func handelDeleteButton() { + requestDelete() + } } @@ -68,12 +131,38 @@ extension SPPlayHistoryViewController: UICollectionViewDelegate, UICollectionVie func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = SPCollectListCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) + cell.sp_isEditing = self.sp_isEditing cell.model = dataArr[indexPath.row] return cell } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return self.dataArr.count + let count = self.dataArr.count + if count == 0 { + let parameters = SPEmptyParameters(image: UIImage(named: "empty_image_01")) + let emptyState = SPEmptyState.normail(parameters: parameters) + self.collectionView.emptyState.format = emptyState.format + self.collectionView.emptyState.show(emptyState) + } else { + self.collectionView.emptyState.hide() + } + + return count + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = dataArr[indexPath.row] + if sp_isEditing { + model.sp_isSelected = !(model.sp_isSelected ?? false) + self.collectionView.reloadData() + + allSelectedStateDidChange?(isAllSelected) + self.updateDeleteButtonState() + } else { + let vc = SPPlayerDetailViewController() + vc.shortPlayId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } } } @@ -82,7 +171,7 @@ extension SPPlayHistoryViewController { private func requestDataList(page: Int, completer: (() -> Void)?) { - SPVideoAPI.requestCollectList(page: page) { [weak self] listModel in + SPVideoAPI.requestPlayHistoryList(page: page) { [weak self] listModel in guard let self = self else { return } if let listModel = listModel, let list = listModel.list { @@ -94,12 +183,31 @@ extension SPPlayHistoryViewController { self.page = page self.collectionView.reloadData() - + if self.sp_isEditing { + self.allSelectedStateDidChange?(self.isAllSelected) + } } completer?() } - } + private func requestDelete() { + + dataArr.forEach { + if $0.sp_isSelected == true, let shortPlayId = $0.short_play_id { + self.deleteGorup.enter() + SPVideoAPI.requestCollectShort(isCollect: false, shortPlayId: shortPlayId, videoId: nil) { [weak self] in + self?.deleteGorup.leave() + } failure: { [weak self] in + self?.deleteGorup.leave() + } + } + } + + self.deleteGorup.notify(queue: DispatchQueue.main) { [weak self] in + self?.requestDataList(page: 1, completer: nil) + } + } + + } - diff --git a/ShortPlay/Class/MyList/View/SPCollectListCell.swift b/ShortPlay/Class/MyList/View/SPCollectListCell.swift index 10e3160..fd52a23 100644 --- a/ShortPlay/Class/MyList/View/SPCollectListCell.swift +++ b/ShortPlay/Class/MyList/View/SPCollectListCell.swift @@ -13,6 +13,14 @@ class SPCollectListCell: SPCollectionViewCell { didSet { coverImageView.sp_setImage(url: model?.image_url) titleLabel.text = model?.name + + selectedButton.isSelected = model?.sp_isSelected ?? false + } + } + + var sp_isEditing: Bool = false { + didSet { + selectedButton.isHidden = !sp_isEditing } } @@ -31,6 +39,15 @@ class SPCollectListCell: SPCollectionViewCell { return label }() + private lazy var selectedButton: UIButton = { + let button = UIButton(type: .custom) + button.isHidden = true + button.isUserInteractionEnabled = false + button.setImage(UIImage(named: "check_icon_01"), for: .normal) + button.setImage(UIImage(named: "check_icon_01_selected"), for: .selected) + return button + }() + override init(frame: CGRect) { super.init(frame: frame) @@ -49,6 +66,7 @@ extension SPCollectListCell { private func _setupUI() { contentView.addSubview(coverImageView) contentView.addSubview(titleLabel) + coverImageView.addSubview(selectedButton) coverImageView.snp.makeConstraints { make in make.left.right.top.equalToSuperview() @@ -61,6 +79,11 @@ extension SPCollectListCell { make.right.lessThanOrEqualToSuperview() } + selectedButton.snp.makeConstraints { make in + make.right.equalToSuperview().offset(-5) + make.top.equalToSuperview().offset(5) + } + } } diff --git a/ShortPlay/Class/Player/Controller/SPPlayerDetailViewController.swift b/ShortPlay/Class/Player/Controller/SPPlayerDetailViewController.swift index 3c3ac09..4be29aa 100644 --- a/ShortPlay/Class/Player/Controller/SPPlayerDetailViewController.swift +++ b/ShortPlay/Class/Player/Controller/SPPlayerDetailViewController.swift @@ -63,7 +63,7 @@ class SPPlayerDetailViewController: SPPlayerListViewController { override func play() { super.play() - if let _ = self.viewModel.currentPlayer?.model as? SPVideoDetailModel, + if let _ = self.detailModel, let videoInfo = self.viewModel.currentPlayer?.videoInfo { SPVideoAPI.requestRequestVideoPlayHistory(videoId: videoInfo.short_play_video_id ?? "", shortPlayId: videoInfo.short_play_id ?? "") diff --git a/ShortPlay/Class/Player/Model/SPShortModel.swift b/ShortPlay/Class/Player/Model/SPShortModel.swift index 2137277..af93082 100644 --- a/ShortPlay/Class/Player/Model/SPShortModel.swift +++ b/ShortPlay/Class/Player/Model/SPShortModel.swift @@ -30,6 +30,8 @@ class SPShortModel: SPModel, SmartCodable { @IgnoredKey var titleAttributedString: NSAttributedString? + @IgnoredKey + var sp_isSelected: Bool? static func mappingForKey() -> [SmartKeyTransformer]? { diff --git a/ShortPlay/Libs/Empty/SPEmptyState.swift b/ShortPlay/Libs/Empty/SPEmptyState.swift new file mode 100644 index 0000000..3e1e6e1 --- /dev/null +++ b/ShortPlay/Libs/Empty/SPEmptyState.swift @@ -0,0 +1,91 @@ +// +// SPEmptyState.swift +// ShortPlay +// +// Created by Overseas on 2025/4/19. +// + +import UIKit +import EmptyStateKit + +struct SPEmptyParameters { +// var title: String = "暂无内容" +// var titleFont: UIFont = UIFont.text_md +// var titleColor: UIColor = UIColor.system_text_secondary_300 + var image: UIImage? = UIImage(named: "empty_image_01") +// var buttonTitle: String? +} + +enum SPEmptyState { + case normail(parameters: SPEmptyParameters) +} + +extension SPEmptyState: CustomState { + + var image: UIImage? { + switch self { + case .normail(let parameters): + return parameters.image + + + } + } + + var title: String? { + switch self { + case .normail(let parameters): + return nil + + } + } + +// var titleButton: String? { +// switch self { +// case .normail(let parameters): +// return parameters.buttonTitle +// } + +} + +extension SPEmptyState { + var format: EmptyStateFormat { + + var format = EmptyStateFormat() + format.backgroundColor = .clear + format.imageSize = self.image?.size ?? .zero +// format.verticalMargin = -10 +// +// format.buttonWidth = 107 +// format.buttonTopMargin = 10 +// format.buttonColor = .system_fill_primary_100 +// format.buttonAttributes = [ +// .font: UIFont.text_md, +// .foregroundColor: UIColor.system_text_secondary_500 +// ] +// +// switch self { +// case .normail(let p): +// format.titleAttributes = [ +// .font: p.titleFont, +// .foregroundColor: p.titleColor +// ] +// +// +// case .login(let p): +// format.titleAttributes = [ +// .font: p.titleFont, +// .foregroundColor: p.titleColor +// ] +// +// +// } + + + + + return format + } +} + + + diff --git a/ShortPlay/Libs/Reachability/NetworkObserver.swift b/ShortPlay/Libs/Reachability/NetworkObserver.swift new file mode 100644 index 0000000..f109b4c --- /dev/null +++ b/ShortPlay/Libs/Reachability/NetworkObserver.swift @@ -0,0 +1,72 @@ +// +// NetworkObserver.swift +// ShortPlay +// +// Created by Overseas on 2025/4/21. +// + +import UIKit +import Network +import Reachability + + +class NetworkObserver { + static let share = NetworkObserver() + + + private let monitor = NWPathMonitor() + private let queue = DispatchQueue(label: "NetworkMonitorQueue") + + func startMonitoring() { + monitor.pathUpdateHandler = { path in + if path.status == .satisfied { + print("++++++Network is available") + } else { + print("++++++No network connection") + } + + if path.usesInterfaceType(.wifi) { + print("++++++Using Wi-Fi") + } + + if path.usesInterfaceType(.cellular) { + print("++++++Using Cellular") + } + } + + monitor.start(queue: queue) + } + + func stopMonitoring() { + monitor.cancel() + } + + /* + private let reachability = try! Reachability() + + func startMonitoring() { + reachability.whenReachable = { reachability in + if reachability.connection == .wifi { + print("++++++Network reachable via Wi-Fi") + } else if reachability.connection == .cellular { + print("++++++Network reachable via Cellular") + } + } + + reachability.whenUnreachable = { _ in + print("++++++Network not reachable") + } + + do { + try reachability.startNotifier() + } catch { + print("++++++Unable to start notifier") + } + } + + func stopMonitoring() { + reachability.stopNotifier() + } + */ + +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/Contents.json new file mode 100644 index 0000000..328d961 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "组件 67 – 2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "组件 67 – 2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/组件 67 – 2@2x.png b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/组件 67 – 2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..669f9bb5bd83b7e8ea76fd784faeda7092fc4183 GIT binary patch literal 764 zcmVPx%wn;=mR9HvVm`#YyVHC!HPZUuKv0{U=H47riM;2n?BMVD4l13YV!>8EQll({s40q$`%LGK|J?by*S+0)o%*ld_dW0PKcCNeMGX=W(}C5% zT3{A17nqSMz5so|C*T3_P}0|G)vKC~5wRFJ04xJ0R&xgU1@r=EB|RVS%$PtTVm@#L zSeJ@^0?&XR;1%!z_?&AqfjPj!+`j~vlxyC9O48fW0F4SHB5eN4z*OK{>5^;yBz+(6 z@4Oxn(@H>h0J~C0KhPz~ZW|^e0*Q#-z`=AwcS-LtN%nos5)qE2m|MMo+1!i!r9R+sjHEe7y*ovz%kP!sdErWM7TcO%IsMAuYp-D z_zd7DY5h&EGXoZhh?~HQEI#L|Ranoyh}fS+^0B0CiU^nJ7r<{|QMGlV9uS2(^Aea) z3Wp8@*#cYy29VWzK`rMCp4ej`<-j>A=|(Mz>fIX=+kun7Z3A(TI#{<#a+7MB6q2OZ zK%QnhUs_5fxACS)M3_eS{yqb7N1P1IljQE&G>M2Qz-yr2K;C7$ZaI*)am}4lk1>ha zEXky&X;K-iZIixjQ_#vK-ek9<$tB*c#bmsreVSf2Add@oozKAXmeGI&(|Tf*Kw3c+ z*GTeg^p`3o7|$}cj00$AOUQG%idBpgrzKrzM1_lpy}+T=HTF1B0j9MBRsl?L1Xw^upr(CnUWe&CUPEvqUBOWc;i0 up=NeILlhrsoQfa)NCP~QRJPW*@%{(%k6f7c#dAvl0000 literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/组件 67 – 2@3x.png b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01.imageset/组件 67 – 2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a17639af37ab7ccd4d94c4b6783a4d226aaf888f GIT binary patch literal 1415 zcmV;21$g?2P)Px)K}keGRA@upntjNfa~Q`zmq-bD`$I?y{|H;!yuY(34Jksc(TZ)%%Z9LN$w(eA zX>9X{mm!w@gGH9S&TGUTq=eEFlGucl$mRY%yMF8U-0tVN@8_Je^PF?lsdMi0yMOon z{ax=bMhD2yEHX10iQ+ydZ2V6WI*mTnoaww2Wz7fb+|SIGX{42Z1GoxmGrCOzp2 zxx4h|B;dvnK|M!+Rsk!=1Jnx4>=H-B<|XZz&Zfx2^ot`B^8{#_nXRtc>px&Z*^dJr z4UR|`UInggqTEeie7yBxB&3_CXMipR-Yy%3F<>&QwH(+lZho!s+*kDiNCFsuR%RUf zHuP$Yl`DghA9$eP#ED_Gq$BgUrD(O_kfMtfp+mBAZx+Vr%KVVaVC2ztL$X>6&Fqy< ziA=luxch10Op}$)L&Ax9)fMnR40@`g{*u zEWJ)(W);A0jqv?l;Bqrl1Uo6o-IXsr1RMh>+FojAPgr>R+lxT)g2E}vs}Ds8KH*ra z+b0mQoKg_!kD>+X`eK2R;>)8R8X>$yOiprAle?c9qNWt$GhnvB92tS560C24nZ0z7 zbx$xHsr34Q5Vi9JMv2y<*kp~FrSEn3?b$kaS6ZUzS~MgucZfxCVX>J#*0Z;3_+WRx zq_AkxchPErc?38kF3d5rmm2Qbv*qr7Ch%~)zxa(p34Gfr0rh3(^|HuO(FIW2GS|%1 zZr@6E`ZHRrQ&17TaXY)+I4^*x^E@N=QU~q-`!gjjRdvo(@K9TOn~=M!JuinovCdg$ z-4q!NMo%*gf&f)@o1a!wsvCYNs{CqMT-32{b4ldHX34F(1WC{2SXFcD_8fq!{LY&5Ky`zYI7zfLo+X2^ITODhV;V~0*pW%Ve*ps( VUCOkV*}wn*002ovPDHLkV1kY$ubcn? literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Contents.json new file mode 100644 index 0000000..813db8e --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "组件 67 – 9@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "组件 67 – 9@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/组件 67 – 9@2x.png b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/组件 67 – 9@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..76bcc226b494cc25edb1e9663af68baad5ade33c GIT binary patch literal 1093 zcmV-L1iJf)P)Px&|4BqaR9Hv7muqMoRTRhn=gw?4yR%KHCbYgjsNe&&ZjIn4h591hO=|nW;xnz8 zbrD1jf}ki!K`MR_tRQIJO&U=|Dx`F?(}cFRe(`}wMbKiA`Y2YEE+pyBCfS{tBQxoS zq&vGaJJWicP8-pJ{ny7TmZ6x463w$Git_I;6$AWPhz-a7if;x4p0pksTHiO^` zx*;KhLD(#k+!(GsTyQX;7oj2}DQF zHl-2>ofjKKx??S(PbXphqhtQfuNQ$DM`cEsJv6IoTO`8xrGnr&1EfSS|JFCKPEEU} zF&SG)AJRU6K=xvS)GJ{_ASS~&_9tqeHND;K)bEq7YEvLQ=n5hT(dT+0u3UwM50At8 z)qO?FwE-Xi=1Hn#iYFL!lk5GzPC;zv-QY?MkOdZYf7cQw5QLqW@iUcGZH5S4&HkE> zXEs2(tp})@EnxyfI3PUj2?9ar$R=CDgo1E5FiYi(_6q?wwA`#MV5Hu)h-Q*#V`Da? zV&J4*kuQmGkLRgzfiVvKhRCMtLqVLs-j9)<(Z&D_dV<&i%V8`Ab;^qn5#i^EHc!E{ zm(HmZj|dW<`T|)7BloVecf0f1tR4Q{>z-(7Z?W|#l^)l+Vln*7K(rm0=9OR=X2(aw3gcywdN*OWbde>a2n)#2-^wgKQ>06hTmxse$rz=znxD~Y}7AH1sO3#4u` zn=N#UniwDn{QzAD#^oUHcIKJRf=~kZ6q}f^B37Ym&%jwPfcpG@vLvmqDi78l00000 LNkvXXu0mjfk5T}8 literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/组件 67 – 9@3x.png b/ShortPlay/Source/Assets.xcassets/icon/check_icon_01_selected.imageset/组件 67 – 9@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..35b6827b77de0b880e232f64289cda411f28c95f GIT binary patch literal 1961 zcmV;a2UhrrP)Px+V@X6oRA@uhT5WJ#RT+Msb9XnpH=CqigrV4J7_796Ql>~t7!e(!v`MQYW224~ z+GHCm)0QvC!Ok#~KTerZ1X>JIngF(dQ^fIu-Lxq3QH9!y(3w_|f>Vk!rs+o}$?n}` zyZ5|$?~*i|X0vzmv5DvB-uImMdCvQs_q^wvB_^QBrdUb*oKX=-pPOydSS*4oAi9cR zl>k*B=Ro8%f#U)>4#9C6>Ys+#hf_ZPnXupP=JwkD@j~Hv2IyNK{gf^028diu;wk|? z4R9tP9>%2r(j|f;Bn|^SY*6nHK2i7HSTT8Udg0LBjeBSLn7#{8w-cBnV8|PRTreqw zBn3DP=%-EbJ83k!AT)t-=dZLk?O{urKr@C=)q zwU@r0$Vl@mzTOjwTBX!I1a1JJybL~08(V-^DR{)37iwqo7t{I1^F*e%AzH5#wgIYg zd~(VMXZUw#UFlA(vAL|RZco16qmt=Zv#+!)sBeep?Es4rjU0GIgR;pC&w7#%U7yUk z@^XEUrr(*CZG4Z!_XQ};H!DT>9tW`1RQAK%vC10BU(U!_k=Qo`*a;w91fX7B#0An6 z-dXpYCo%$IGSa?GfR_Q7UcD60PAqCw6KY$2fN<8-`F25MQcZi8q-?#5#FfPZSg0o+ z^^2?twAQ|zlg!zsJrzM6ZV}*{MM}SgvKX+}0{kMS;&;s2QQtlAV^(D14KLPE@waey z^l9HLCHzXLb%nDW+%`x?R__T}72($aTs!S)oCo-4vwOyu_%LcT1($|W|Tfa;ax*zSL_HmL;`EC zg7KM)T-Op$p>OM(kkdJHPs^!@kNyTK|#|ry8D;#&7_E`h_r-%?0{x zh&cJwht%#PNWcD3UQ7b+FZHRfGrm50H8fu%QJ%NgBpA36sb2)++Dm|xhS=IAqE9E0 z`srKH9f`bNMbJaw3rs{_Yy#Bdd3#KPL6)@oY)D#zrGDsB7E(J8Lw`89ALjKglyyu* zVm}11C9k!c`v~9XE``7LlhBi^l>5D(gRgF7^9jZ<1fF^kCS4w(}m=6NCG*p%F}6vl#? zkbWD`l95JN5`B;SHLv6*Tv|gw6ZnAfNX*FuWnRg!q6GeLT?yafN=WKsLZM8AMw8rR zNGmHcKySg3aivmGf1JXSJpzmX&t4rESCDcj9_!j~v)rQDS##+Wi-p!&9)dB{ zhMZI#JiKoE?I%`qE7O_U~TUf9vp!tWZM&39V&gxUKFfm&~Nx0XQRjIl~u!&uap5<8QfX-`+@#h*Rz?2S7`%e)pWmW2Kei9emgSb zv6WpTl5u{t)*8HEJ4fGf9UA@%h3bJtz{VPK00000NkvXXu0mjf{AQ|- literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/Contents.json new file mode 100644 index 0000000..42b0bd4 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "delet-选中@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "delet-选中@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/delet-选中@2x.png b/ShortPlay/Source/Assets.xcassets/icon/delete_icon_01.imageset/delet-选中@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c04e41d039a6bfc25a93a503794bbd91e2013d5 GIT binary patch literal 871 zcmV-t1DO1YP)Px&AxT6*R9HvtSTSf+K@goGfxCkg7AaChh!DZT!qP$^q97Il#YQ1Q0u})U355LF zD7X@3ccURGB0+)}Fkqt~n8HT1P;4zMg`^O)NRh(gAA}qKg#W`Q@&DWVcPBw_;ke|O znfG`*JF~M02YlfH=Li25L9KOnxm>=>%p-_6;Hy3}hluzE5$^;+@Xpsy>>5(gTKfzD zMjHW0+cNWZS6A22)YQ}`-x%HmXJ=>oYPH%A3Czrk0PxBegqeE~@gX7}W9Bub)UdCw zH$h{}5F);pz+o6xwAP_7h}aop#u0HT+JOxsI^ye_NzgfWmYI(u;-OeI$+?~FMMUij zkk~Qv2>`eV09#Sah1Boz|JSVC+(%GrT`rYMZxHcZqa>QKXXdxnYIRs^y`7G;kDznz zHZ$LkjW(JA_4Mrqfc|)AEakBCU^_023Z*4pO)Fd})u%ufq|`nUvAyz|m2k6_Z)R)}cK2dz;XYi*M6 znHU{{d8)Qe!KhZAm$DFsq0(CaOh{O3XXI+7l-ez}&bfYOo1b1?WnJ1M} zb3)J4dlGOaMuZVUOOda(?ous4Sf1_a3)<`Mk4qPWO##~0k5oVr9I);$6*3Qd! zdX_Q93Px*97#k$RA@u(T7QTXbrk=++1@^6 z=A6B~P3OV~ zFCsbw;EQN9df2PHJbzgLx3;!U85kJY0bmh;sQ^^33KCJ4ng0fGC=dv2ibNv2y~>pQ zo&hJ5$r-s^?o|MHl|!KtGExBU)^+_;uVZ)u%*>QXB_4VnUot;@vXdUK6A~D;x?H&M^07x-&gJBq5USyXQ z@Zb{PVi-o;i$aCGrfJS1qFn%HRTQugVhw=X0o08+fr9|91~A1@^eBMe%LN!fjRQ6W zzy|OufImjaPXqW0z#d)K<>5Ihm7HODAX%0*mzlQ>TKSH#1XaoRU5cV?&@`>Lls+W^ zx3sie8VCfsn0Z+_+*gGR!bJ3@ZQBnShH<>um?Z%x5{ad@ZNC9PE+9y^n(*B>4iV9T0DIbcC7L7>4mt1t-q+P^M`v zCZg8>Tqc=_C?1VQw~Pz05JI}4_X^#RyfPAzbOTjG%&Zd8@D&umaYa!UYnt};xBy$0 zbs;mi0eBFA^tb;9$}sb@!C-J}BodJU#~C#0P0O;ZD+g~l5oX?0?Pz5vNkmEcM5ECY zrSx@mwG=|s19;96a*~h)4$bk`6KR zorYm}j)=xmZnW>FX)Yq7?)*W;% zUUqn-S*ikXOH0cfMN!@Ya2Ce|W?{-X|KD}Y%#*H%n zJVeQ4a&9h{lYxNrAV-;bm0=iXYJf;0Z%Ri-kKYZFT`EJQ~OU0wGvSvJdKkWPAbK4J}$Y!$( znwy({EEO#gQD-O=+SJt4G+fQFEbDq^mQ@2;46p8J$!TGdH6B^|_^_s?=CP)xrvAd? zLkO`Nz*gs7v##s%|6y`ubO2ZgU@sA^EtXiX3b!P+mL-~jfq@%URo&m%*f_F10r7Y| zsH*C0`ENR%K2VtLC`bax-mf`C^i8QMLe&5+?hMNRc0vIQA?^q8vZMCTilQvhH0?n7 zVYruA1n_FZFl0@8RC48qEz7!vnfE%9WI1xJrfF}FC43^kTb8wgnO^{Kku%PJ(n+Pp zb_Lip&1;D069BTBXcN))P$;Aoo~{!KZlr7{8Q2bB{ptEQ{bbwrVmI|JSAd;b@$&%g zbFzv5FmrOShpH8W@*O);kHfOpvsfy(nDJc$mhL1R4zFkCXNc&6 ziJVEdvSkrG7!2NcLFnLm~mmj!9phI0$1#D8-6W}FozbJtIe zx4ZVN6qWU%Q>RYdY}@v=vJ%hC73l#Xq8u~-2H@bdY18)A*Vm7GE1eZ!kFzwX>^|U0 gHGc&LKksJvUz;E-h}aPD%>V!Z07*qoM6N<$f_NPb{{R30 literal 0 HcmV?d00001 diff --git a/ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/Contents.json b/ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/Contents.json new file mode 100644 index 0000000..6b57fb5 --- /dev/null +++ b/ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "delete@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "delete@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/delete@2x.png b/ShortPlay/Source/Assets.xcassets/icon/delete_icon_02.imageset/delete@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c7278c693f5f0c79091143c7314f05b03361eded GIT binary patch literal 929 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