diff --git a/SynthReel.xcodeproj/project.pbxproj b/SynthReel.xcodeproj/project.pbxproj index 57e8af3..50c4aae 100644 --- a/SynthReel.xcodeproj/project.pbxproj +++ b/SynthReel.xcodeproj/project.pbxproj @@ -101,6 +101,14 @@ 03E9A7F82EC4AA54000D1067 /* SRUserDefaultsKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */; }; 03E9A7FA2EC56D03000D1067 /* String+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F92EC56CFC000D1067 /* String+SRAdd.swift */; }; 03E9A7FD2EC57658000D1067 /* SRUserApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7FC2EC5763B000D1067 /* SRUserApi.swift */; }; + 370D2EF72ED000C400571E77 /* SRFavoritesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D2EF62ED000C400571E77 /* SRFavoritesViewController.swift */; }; + 370D2EF92ED000D200571E77 /* SRHistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D2EF82ED000D200571E77 /* SRHistoryViewController.swift */; }; + 370D2F052ED3FEE700571E77 /* SRHistoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D2F042ED3FEE700571E77 /* SRHistoryCell.swift */; }; + 370D2F072ED3FEFA00571E77 /* SRFavoritesCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D2F062ED3FEFA00571E77 /* SRFavoritesCell.swift */; }; + 370D2F092ED44A6D00571E77 /* SRListMenuCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D2F082ED44A6D00571E77 /* SRListMenuCell.swift */; }; + 370D2F0C2ED44ACB00571E77 /* SRListMenuDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D2F0B2ED44ACB00571E77 /* SRListMenuDataSource.swift */; }; + 370D2F102ED4534500571E77 /* SRUserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 370D2F0F2ED4534500571E77 /* SRUserViewController.swift */; }; + 3779D0612ECF1CB8006B1698 /* SRShortHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3779D0602ECF1CB8006B1698 /* SRShortHeaderView.swift */; }; 47BB39E2DD30787FA591F8EB /* Pods_SynthReel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */; }; /* End PBXBuildFile section */ @@ -200,6 +208,14 @@ 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserDefaultsKey.swift; sourceTree = ""; }; 03E9A7F92EC56CFC000D1067 /* String+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SRAdd.swift"; sourceTree = ""; }; 03E9A7FC2EC5763B000D1067 /* SRUserApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserApi.swift; sourceTree = ""; }; + 370D2EF62ED000C400571E77 /* SRFavoritesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRFavoritesViewController.swift; sourceTree = ""; }; + 370D2EF82ED000D200571E77 /* SRHistoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHistoryViewController.swift; sourceTree = ""; }; + 370D2F042ED3FEE700571E77 /* SRHistoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHistoryCell.swift; sourceTree = ""; }; + 370D2F062ED3FEFA00571E77 /* SRFavoritesCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRFavoritesCell.swift; sourceTree = ""; }; + 370D2F082ED44A6D00571E77 /* SRListMenuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRListMenuCell.swift; sourceTree = ""; }; + 370D2F0B2ED44ACB00571E77 /* SRListMenuDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRListMenuDataSource.swift; sourceTree = ""; }; + 370D2F0F2ED4534500571E77 /* SRUserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserViewController.swift; sourceTree = ""; }; + 3779D0602ECF1CB8006B1698 /* SRShortHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortHeaderView.swift; sourceTree = ""; }; 59DC746604B26E9FF802D317 /* Pods-SynthReel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SynthReel.debug.xcconfig"; path = "Target Support Files/Pods-SynthReel/Pods-SynthReel.debug.xcconfig"; sourceTree = ""; }; AA88214030574193B51DE563 /* Pods-SynthReel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SynthReel.release.xcconfig"; path = "Target Support Files/Pods-SynthReel/Pods-SynthReel.release.xcconfig"; sourceTree = ""; }; F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SynthReel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -222,9 +238,9 @@ 03980F542ECEEC990006E317 /* MyShort */ = { isa = PBXGroup; children = ( + 370D2F0A2ED44AAC00571E77 /* VM */, + 3779D05F2ECF1C8D006B1698 /* V */, 03980F552ECEECB30006E317 /* VC */, - 03980F562ECEECBC0006E317 /* V */, - 03980F572ECEECCC0006E317 /* M */, ); path = MyShort; sourceTree = ""; @@ -233,24 +249,12 @@ isa = PBXGroup; children = ( 03980F582ECEED190006E317 /* SRMyShortViewController.swift */, + 370D2EF62ED000C400571E77 /* SRFavoritesViewController.swift */, + 370D2EF82ED000D200571E77 /* SRHistoryViewController.swift */, ); path = VC; sourceTree = ""; }; - 03980F562ECEECBC0006E317 /* V */ = { - isa = PBXGroup; - children = ( - ); - path = V; - sourceTree = ""; - }; - 03980F572ECEECCC0006E317 /* M */ = { - isa = PBXGroup; - children = ( - ); - path = M; - sourceTree = ""; - }; 03B1A8372EC5C8BF006C353F /* SRHud */ = { isa = PBXGroup; children = ( @@ -494,6 +498,7 @@ 03E9A7D32EC4720F000D1067 /* Class */ = { isa = PBXGroup; children = ( + 370D2F0D2ED4532100571E77 /* User */, 03980F542ECEEC990006E317 /* MyShort */, 03B1A84E2EC5DB13006C353F /* Home */, 03B1A8EA2EC72BFB006C353F /* Player */, @@ -578,6 +583,41 @@ path = API; sourceTree = ""; }; + 370D2F0A2ED44AAC00571E77 /* VM */ = { + isa = PBXGroup; + children = ( + 370D2F0B2ED44ACB00571E77 /* SRListMenuDataSource.swift */, + ); + path = VM; + sourceTree = ""; + }; + 370D2F0D2ED4532100571E77 /* User */ = { + isa = PBXGroup; + children = ( + 370D2F0E2ED4532A00571E77 /* VC */, + ); + path = User; + sourceTree = ""; + }; + 370D2F0E2ED4532A00571E77 /* VC */ = { + isa = PBXGroup; + children = ( + 370D2F0F2ED4534500571E77 /* SRUserViewController.swift */, + ); + path = VC; + sourceTree = ""; + }; + 3779D05F2ECF1C8D006B1698 /* V */ = { + isa = PBXGroup; + children = ( + 3779D0602ECF1CB8006B1698 /* SRShortHeaderView.swift */, + 370D2F042ED3FEE700571E77 /* SRHistoryCell.swift */, + 370D2F062ED3FEFA00571E77 /* SRFavoritesCell.swift */, + 370D2F082ED44A6D00571E77 /* SRListMenuCell.swift */, + ); + path = V; + sourceTree = ""; + }; 8CAFCEC2C631CAE75726D90C /* Pods */ = { isa = PBXGroup; children = ( @@ -680,14 +720,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks.sh\"\n"; @@ -732,6 +768,7 @@ 03B1A8452EC5CBBB006C353F /* SRNavigationController.swift in Sources */, 03B1A9092ECAAF55006C353F /* SRHomeTopChartsView.swift in Sources */, 03E9A7E42EC49593000D1067 /* SRUrlPath.swift in Sources */, + 370D2EF92ED000D200571E77 /* SRHistoryViewController.swift in Sources */, 03B1A9462ECC5679006C353F /* SRSearchResultCell.swift in Sources */, 03B1A9502ECEB4E6006C353F /* SRRecommendPlayerViewController.swift in Sources */, 03B1A83E2EC5C91E006C353F /* SRTool.swift in Sources */, @@ -739,6 +776,8 @@ 03B1A8FD2EC81C62006C353F /* SRHomeBannerCell.swift in Sources */, 03E9A7DB2EC485BE000D1067 /* SRNetwork.swift in Sources */, 03E9A7F42EC4A94D000D1067 /* SRAccountToken.swift in Sources */, + 370D2EF72ED000C400571E77 /* SRFavoritesViewController.swift in Sources */, + 370D2F072ED3FEFA00571E77 /* SRFavoritesCell.swift in Sources */, 03B1A8E72EC7175D006C353F /* SRCategoryModel.swift in Sources */, 03B1A94A2ECC79AB006C353F /* SREpSelectorView.swift in Sources */, 03B1A94E2ECD604B006C353F /* SREpSelectorCell.swift in Sources */, @@ -754,6 +793,7 @@ 03B1A8392EC5C8D6006C353F /* SRHud.swift in Sources */, 03E9A7EC2EC499A9000D1067 /* SRDeviceId.swift in Sources */, 03E9A7E22EC494F9000D1067 /* SRTargetType.swift in Sources */, + 370D2F092ED44A6D00571E77 /* SRListMenuCell.swift in Sources */, 03980F532ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift in Sources */, 03B1A90F2ECAC768006C353F /* SRHomeBingeWorthyView.swift in Sources */, 03B1A9072EC86656006C353F /* SRGradientView.swift in Sources */, @@ -761,6 +801,7 @@ 03B1A8402EC5CA37006C353F /* AppDelegate+Config.swift in Sources */, 03B1A9152ECAEE63006C353F /* SRHomeViralHitsCell.swift in Sources */, 03B1A8472EC5CBCF006C353F /* SRViewController.swift in Sources */, + 370D2F052ED3FEE700571E77 /* SRHistoryCell.swift in Sources */, 03B1A9032EC8555B006C353F /* SRHomeYouLikeView.swift in Sources */, 03B1A9362ECC1D1D006C353F /* SRSearchRecordView.swift in Sources */, 03B1A8D82EC6D051006C353F /* SRCollectionView.swift in Sources */, @@ -773,6 +814,7 @@ 03B1A8432EC5CB99006C353F /* SRTabBarController.swift in Sources */, 03B1A8EF2EC72C78006C353F /* SRShortModel.swift in Sources */, 03B1A8ED2EC72C1F006C353F /* SRHomeModuleItem.swift in Sources */, + 370D2F102ED4534500571E77 /* SRUserViewController.swift in Sources */, 03B1A9112ECAC927006C353F /* SRHomeBingeWorthyCell.swift in Sources */, 03E9A7F22EC4A8F6000D1067 /* UserDefaults+SRAdd.swift in Sources */, 03B1A93A2ECC3F54006C353F /* SRSearchViewModel.swift in Sources */, @@ -783,6 +825,7 @@ 03980F592ECEED190006E317 /* SRMyShortViewController.swift in Sources */, 03B1A92A2ECC0738006C353F /* SRShortApi.swift in Sources */, 03B1A90B2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift in Sources */, + 370D2F0C2ED44ACB00571E77 /* SRListMenuDataSource.swift in Sources */, 03B1A94C2ECC7A2D006C353F /* SRPanModalContentView.swift in Sources */, 03B1A9052EC857B3006C353F /* SRHomeYouLikeCell.swift in Sources */, 03B1A92E2ECC0D7E006C353F /* SRShortDetailControlView.swift in Sources */, @@ -800,6 +843,7 @@ 03B1A9132ECAED04006C353F /* SRHomeViralHitsView.swift in Sources */, 03B1A8DC2EC6D0EB006C353F /* SRHomeChildCell.swift in Sources */, 03B1A8552EC5E434006C353F /* UIFont+SRAdd.swift in Sources */, + 3779D0612ECF1CB8006B1698 /* SRShortHeaderView.swift in Sources */, 03980F512ECEBEE20006E317 /* SRRecommendPlayerCell.swift in Sources */, 03B1A91B2ECAFFD6006C353F /* UIView+SRAdd.swift in Sources */, 03B1A9222ECB456C006C353F /* SRDetailPlayerViewController.swift in Sources */, @@ -841,9 +885,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 6XALB8RSYF; + DEVELOPMENT_TEAM = 6RZK7QBQQ7; EXCLUDED_ARCHS = ""; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; GENERATE_INFOPLIST_FILE = YES; @@ -861,9 +906,12 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_EMIT_LOC_STRINGS = YES; @@ -880,9 +928,10 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 6XALB8RSYF; + DEVELOPMENT_TEAM = 6RZK7QBQQ7; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SynthReel/Source/Info.plist; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -898,9 +947,12 @@ MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; STRING_CATALOG_GENERATE_SYMBOLS = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/SynthReel/Base/API/SRHomeApi.swift b/SynthReel/Base/API/SRHomeApi.swift index b70aeff..53e1187 100644 --- a/SynthReel/Base/API/SRHomeApi.swift +++ b/SynthReel/Base/API/SRHomeApi.swift @@ -89,4 +89,34 @@ struct SRHomeApi { } } + static func requestHistoryData(page: Int) async -> [SRShortModel]? { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/myHistorys") + param.method = .get + param.parameters = [ + "page_size" : 20, + "current_page" : page + ] + + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + } + + static func requestFavoritesData(page: Int) async -> [SRShortModel]? { + await withCheckedContinuation { continuation in + var param = SRNetwork.Parameters(path: "/myCollections") + param.method = .get + param.parameters = [ + "page_size" : 20, + "current_page" : page + ] + + SRNetwork.request(parameters: param) { (response: SRNetwork.Response>) in + continuation.resume(returning: response.data?.list) + } + } + } + } diff --git a/SynthReel/Class/Home/VC/SRHomeViewController.swift b/SynthReel/Class/Home/VC/SRHomeViewController.swift index a14df19..7b9c349 100644 --- a/SynthReel/Class/Home/VC/SRHomeViewController.swift +++ b/SynthReel/Class/Home/VC/SRHomeViewController.swift @@ -110,7 +110,6 @@ class SRHomeViewController: SRViewController { return view }() - @MainActor deinit { srPrint(message: "销毁") } diff --git a/SynthReel/Class/MyShort/V/SRFavoritesCell.swift b/SynthReel/Class/MyShort/V/SRFavoritesCell.swift new file mode 100644 index 0000000..7a821db --- /dev/null +++ b/SynthReel/Class/MyShort/V/SRFavoritesCell.swift @@ -0,0 +1,94 @@ +// +// SRFavoritesCell.swift +// SynthReel +// +// Created by CSGY on 2025/11/24. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRFavoritesCell: UICollectionViewCell { + + var model: SRShortModel? { + didSet{ + coverImageView.sr_setImage(model?.image_url) + collectButton.isSelected = true + } + } + + var onCollectChanged: ((SRFavoritesCell) -> Void)? + + lazy var bgImageView = UIImageView(image: UIImage(named: "historyCell")) + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 14 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var collectButton: UIButton = { + let button = UIButton(type: .custom, primaryAction: UIAction(handler: { [weak self] _ in + guard let self = self else { return } + guard let shortId = model?.short_play_id else { return } + let videoId = (self.model)?.short_play_video_id + let isCollect = false + +// Task { +// await SRShortApi.requestShortCollect(shortId: shortId, videoId: videoId, isCollect: isCollect) +// } + Task { + let success = await SRShortApi.requestShortCollect( + shortId: shortId, + videoId: videoId, + isCollect: isCollect + ) + + if success { + self.onCollectChanged?(self) + } else { + print("收藏失败") + } + } + })) + button.setImage(UIImage(named: "collect_icon_01_selected"), for: .normal) + button.setImage(UIImage(named: "collect_icon_01_selected"), for: .selected) + button.setImage(UIImage(named: "collect_icon_01_selected"), for: [.selected, .highlighted]) + return button + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +extension SRFavoritesCell { + + private func sr_setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(bgImageView) + contentView.addSubview(collectButton) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + collectButton.snp.makeConstraints { make in + make.right.bottom.equalTo(-7); + make.size.equalTo(CGSizeMake(28, 28)) + } + + } + +} diff --git a/SynthReel/Class/MyShort/V/SRHistoryCell.swift b/SynthReel/Class/MyShort/V/SRHistoryCell.swift new file mode 100644 index 0000000..b973ed7 --- /dev/null +++ b/SynthReel/Class/MyShort/V/SRHistoryCell.swift @@ -0,0 +1,107 @@ +// +// SRHistoryCell.swift +// SynthReel +// +// Created by CSGY on 2025/11/24. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRHistoryCell: UICollectionViewCell { + + var model: SRShortModel? { + didSet{ + coverImageView.sr_setImage(model?.image_url) + let text = String(format: "EP. %@ / EP. %d", model?.current_episode ?? "0", model?.episode_total ?? 0) + setEpisodeText(text) + } + } + + lazy var bgImageView = UIImageView(image: UIImage(named: "historyCell")) + + lazy var bottomImageView = UIImageView(image: UIImage(named: "historyBottom")) + + lazy var coverImageView: SRImageView = { + let imageView = SRImageView() + imageView.layer.cornerRadius = 14 + imageView.layer.masksToBounds = true + return imageView + }() + + lazy var titleLable : UILabel = { + let label = UILabel() + label.textColor = .white + label.font = .systemFont(ofSize: 12) + label.textAlignment = .center + return label + }() + + + + override init(frame: CGRect) { + super.init(frame: frame) + + sr_setupUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func setEpisodeText(_ text: String) { + let full = text as NSString + + let parts = text.components(separatedBy: " / ") + guard parts.count == 2 else { + titleLable.text = text + return + } + + let front = parts[0] + " " + let frontLen = (front as NSString).length + let fullLen = full.length + + let attr = NSMutableAttributedString(string: text) + + // 前段(白色) + attr.yy_setColor(.white, range: NSRange(location: 0, length: frontLen)) + attr.yy_setFont(.systemFont(ofSize: 12), range: NSRange(location: 0, length: frontLen)) + + // 后段(灰色) + attr.yy_setColor(UIColor.C_4_C_4_C_4, range: NSRange(location: frontLen, length: fullLen - frontLen)) + attr.yy_setFont(.systemFont(ofSize: 12), range: NSRange(location: frontLen, length: fullLen - frontLen)) + + titleLable.attributedText = attr + } +} + +extension SRHistoryCell { + + private func sr_setupUI() { + contentView.addSubview(coverImageView) + contentView.addSubview(bgImageView) + coverImageView.addSubview(bottomImageView) + bottomImageView.addSubview(titleLable) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + coverImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + bottomImageView.snp.makeConstraints { make in + make.left.right.bottom.equalToSuperview() + make.height.equalTo(27); + } + + titleLable.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + } + +} + diff --git a/SynthReel/Class/MyShort/V/SRListMenuCell.swift b/SynthReel/Class/MyShort/V/SRListMenuCell.swift new file mode 100644 index 0000000..a9ceeb6 --- /dev/null +++ b/SynthReel/Class/MyShort/V/SRListMenuCell.swift @@ -0,0 +1,58 @@ +// +// SRListMenuCell.swift +// SynthReel +// +// Created by CSGY on 2025/11/24. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXSegmentedView +import SnapKit + +class SRListMenuCell: JXSegmentedTitleCell/*JXSegmentedTitleCell*/ { + + + lazy var bgImageView: UIImageView = { + let imageView = UIImageView() + return imageView + }() + + + override func commonInit() { + super.commonInit() + + self.contentView.addSubview(bgImageView) + + bgImageView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + self.contentView.sendSubviewToBack(bgImageView) + } + + + + override func reloadData(itemModel: JXSegmentedBaseItemModel, selectedType: JXSegmentedViewItemSelectedType) { + super.reloadData(itemModel: itemModel, selectedType: selectedType) + +// if itemModel.isSelected { +// bgImageView.image = UIImage(named: "FavoritesSeleted") +// } else { +// bgImageView.image = UIImage(named: "Favorites") +// } + if itemModel.index == 0 { + if itemModel.isSelected { + bgImageView.image = UIImage(named: "FavoritesSeleted") + } else { + bgImageView.image = UIImage(named: "Favorite") + } + }else{ + if itemModel.isSelected { + bgImageView.image = UIImage(named: "historySeleted") + } else { + bgImageView.image = UIImage(named: "history") + } + } + } +} diff --git a/SynthReel/Class/MyShort/V/SRShortHeaderView.swift b/SynthReel/Class/MyShort/V/SRShortHeaderView.swift new file mode 100644 index 0000000..f5c338a --- /dev/null +++ b/SynthReel/Class/MyShort/V/SRShortHeaderView.swift @@ -0,0 +1,70 @@ +// +// SRShortHeaderView.swift +// SynthReel +// +// Created by CSGY on 2025/11/20. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRShortHeaderView: UIView { + + lazy var backImageView = UIImageView(image: UIImage(named: "listNavBg")) + + lazy var titleLabel: SRLabel = { + let label = SRLabel() + label.font = .font(ofSize: 18, weight: .bold) + label.textColors = [UIColor._4_CFFD_4.cgColor, UIColor._51_D_4_FF.cgColor] + label.textStartPoint = .init(x: 0.5, y: 0) + label.textEndPoint = .init(x: 0.5, y: 1) + label.text = "My Dramas" + return label + }() + + lazy var leftIcon: UIImageView = { + let img = UIImageView(image: UIImage(named: "闪光 1")) + img.contentMode = .scaleAspectFit + return img + }() + + lazy var rightIcon: UIImageView = { + let img = UIImageView(image: UIImage(named: "闪光 1")) + img.contentMode = .scaleAspectFit + return img + }() + + override init(frame: CGRect) { + super.init(frame: frame) + + self.addSubview(backImageView) + backImageView.snp.makeConstraints { make in + make.top.equalToSuperview().offset(UIScreen.safeTop + 14) + make.horizontalEdges.equalToSuperview().inset(15) + make.height.equalTo(57) + } + + backImageView.addSubview(titleLabel) + backImageView.addSubview(leftIcon) + backImageView.addSubview(rightIcon) + titleLabel.snp.makeConstraints { make in + make.center.equalToSuperview() + } + + // icon 固定大小 + leftIcon.snp.makeConstraints { make in + make.size.equalTo(CGSize(width: 26, height: 26)) + make.right.equalTo(titleLabel.snp.left).offset(-12) + make.centerY.equalToSuperview() + } + rightIcon.snp.makeConstraints { make in + make.size.equalTo(CGSize(width: 26, height: 26)) + make.left.equalTo(titleLabel.snp.right).offset(12) + make.centerY.equalToSuperview() + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/SynthReel/Class/MyShort/VC/SRFavoritesViewController.swift b/SynthReel/Class/MyShort/VC/SRFavoritesViewController.swift new file mode 100644 index 0000000..eab693c --- /dev/null +++ b/SynthReel/Class/MyShort/VC/SRFavoritesViewController.swift @@ -0,0 +1,135 @@ +// +// SRFavoritesViewController.swift +// SynthReel +// +// Created by CSGY on 2025/11/21. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPagingView +import JXSegmentedView + +class SRFavoritesViewController: SRViewController { + + var dataArr: [SRShortModel] = [] + + var page = 1 + + override func viewDidLoad() { + super.viewDidLoad() + + self.backgroundImageView.isHidden = true + self.view.backgroundColor = .clear + // Do any additional setup after loading the view. + + view.addSubview(collectionView); + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + Task { + await requestDataArr(page: self.page) + } + } + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let itemWidth = floor((UIScreen.width - 30 - 12) / 3.0) + let itemHeight = 148.0 / 111 * itemWidth + + let layout = UICollectionViewFlowLayout() + layout.minimumInteritemSpacing = 6 + layout.minimumLineSpacing = 10 + layout.itemSize = .init(width: itemWidth, height: itemHeight) + layout.sectionInset = .init(top: 10, left: 15, bottom: 10, right: 15) + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false +// collectionView.register(UINib(nibName: "SRHistoryCell", bundle: nil), forCellWithReuseIdentifier: "cell") + collectionView.register(SRFavoritesCell.self, forCellWithReuseIdentifier: "cell") + collectionView.sr_addRefreshFooter { [weak self] in + self?.handleFooterRefresh(nil) + } + return collectionView + }() + + override func listScrollView() -> UIScrollView { + return collectionView + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + Task { + await self.requestDataArr(page: 1) + completer?() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + Task { + await self.requestDataArr(page: self.page + 1) + self.collectionView.sr_endFooterRefreshing() + completer?() + } + } +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRFavoritesViewController: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRFavoritesCell + cell.model = self.dataArr[indexPath.row] + cell.onCollectChanged = { [weak self] clickedCell in + guard let self = self else { return } + + guard let indexPath = self.collectionView.indexPath(for: clickedCell) else { + return + } + self.dataArr.remove(at: indexPath.item) + self.collectionView.performBatchUpdates { + self.collectionView.deleteItems(at: [indexPath]) + } + } + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr.count + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + self.didScrollCallback?(scrollView) + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = dataArr[indexPath.row] + + let vc = SRDetailPlayerViewController() + vc.shortId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } +} + +extension SRFavoritesViewController { + + private func requestDataArr(page: Int) async { + + if let dataArr = await SRHomeApi.requestFavoritesData(page: page) { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += dataArr + self.page = page + self.collectionView.reloadData() + } + } + +} diff --git a/SynthReel/Class/MyShort/VC/SRHistoryViewController.swift b/SynthReel/Class/MyShort/VC/SRHistoryViewController.swift new file mode 100644 index 0000000..05546a2 --- /dev/null +++ b/SynthReel/Class/MyShort/VC/SRHistoryViewController.swift @@ -0,0 +1,123 @@ +// +// SRHistoryViewController.swift +// SynthReel +// +// Created by CSGY on 2025/11/21. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXPagingView +import JXSegmentedView + +class SRHistoryViewController: SRViewController { + + var dataArr: [SRShortModel] = [] + + var page = 1 + + override func viewDidLoad() { + super.viewDidLoad() + self.backgroundImageView.isHidden = true + self.view.backgroundColor = .clear + + view.addSubview(collectionView); + collectionView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + // Do any additional setup after loading the view. + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + Task { + await requestDataArr(page: self.page) + } + } + + lazy var collectionViewLayout: UICollectionViewFlowLayout = { + let itemWidth = floor((UIScreen.width - 30 - 12) / 3.0) + let itemHeight = 148.0 / 111 * itemWidth + + let layout = UICollectionViewFlowLayout() + layout.minimumInteritemSpacing = 6 + layout.minimumLineSpacing = 10 + layout.itemSize = .init(width: itemWidth, height: itemHeight) + layout.sectionInset = .init(top: 10, left: 15, bottom: 10, right: 15) + return layout + }() + + lazy var collectionView: SRCollectionView = { + let collectionView = SRCollectionView(frame: .zero, collectionViewLayout: collectionViewLayout) + collectionView.delegate = self + collectionView.dataSource = self + collectionView.showsVerticalScrollIndicator = false + collectionView.showsHorizontalScrollIndicator = false + collectionView.register(SRHistoryCell.self, forCellWithReuseIdentifier: "cell") + collectionView.sr_addRefreshFooter { [weak self] in + self?.handleFooterRefresh(nil) + } + return collectionView + }() + + override func listScrollView() -> UIScrollView { + return collectionView + } + + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + Task { + await self.requestDataArr(page: 1) + completer?() + } + } + + override func handleFooterRefresh(_ completer: (() -> Void)?) { + Task { + await self.requestDataArr(page: self.page + 1) + self.collectionView.sr_endFooterRefreshing() + completer?() + } + } +} + +//MARK: UICollectionViewDelegate UICollectionViewDataSource +extension SRHistoryViewController: UICollectionViewDelegate, UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SRHistoryCell + cell.model = self.dataArr[indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return self.dataArr.count + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + self.didScrollCallback?(scrollView) + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = dataArr[indexPath.row] + + let vc = SRDetailPlayerViewController() + vc.shortId = model.short_play_id + self.navigationController?.pushViewController(vc, animated: true) + } +} + +extension SRHistoryViewController { + + private func requestDataArr(page: Int) async { + + if let dataArr = await SRHomeApi.requestHistoryData(page: page) { + if page == 1 { + self.dataArr.removeAll() + } + self.dataArr += dataArr + self.page = page + self.collectionView.reloadData() + } + } + +} diff --git a/SynthReel/Class/MyShort/VC/SRMyShortViewController.swift b/SynthReel/Class/MyShort/VC/SRMyShortViewController.swift index dc560bb..582ed05 100644 --- a/SynthReel/Class/MyShort/VC/SRMyShortViewController.swift +++ b/SynthReel/Class/MyShort/VC/SRMyShortViewController.swift @@ -6,32 +6,161 @@ // Copyright © 2025 SR. All rights reserved. // + import UIKit import SnapKit +import JXSegmentedView +import JXPagingView + class SRMyShortViewController: SRViewController { + // MARK: - UI + private lazy var headerView = SRShortHeaderView( + frame: CGRect(x: 0, y: 0, width: UIScreen.width, height: 56) + ) + + private lazy var segmentedView = JXSegmentedView() + + private lazy var titles = ["Favorites", "History"] + + private lazy var dataSource: JXSegmentedTitleDataSource = { + let ds = SRListMenuDataSource() + ds.titles = titles + ds.titleNormalColor = .srBlue + ds.titleSelectedColor = .srGreen + ds.titleNormalFont = UIFont.systemFont(ofSize: 14) + ds.titleSelectedFont = UIFont.boldSystemFont(ofSize: 16) + ds.isTitleColorGradientEnabled = false + ds.itemWidth = 155 + return ds + }() + + // PagingView + private lazy var pagingView: JXPagingView = { + let view = JXPagingView(delegate: self) + view.layer.masksToBounds = true + view.mainTableView.backgroundColor = .clear + view.listContainerView.listCellBackgroundColor = .clear + view.mainTableView.gestureDelegate = self + view.automaticallyDisplayListVerticalScrollIndicator = false + view.mainTableView.sr_addRefreshHeader { [weak self] in + self?.handleHeaderRefresh(nil) + } + return view + }() + + // MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() + self.backgroundImageView.image = UIImage(named: "my_short_bg_image") self.backgroundImageView.contentMode = .scaleAspectFit - - sr_setupUI() + + setupSegmentedView() + setupUI() } + override func handleHeaderRefresh(_ completer: (() -> Void)?) { + Task { + self.pagingView.mainTableView.sr_endHeaderRefreshing() + } + if let vc = self.pagingView.listContainerView.validListDict[self.pagingView.listContainerView.currentIndex] as? SRViewController { + vc.handleHeaderRefresh(nil) + } + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: true) } - } extension SRMyShortViewController { - private func sr_setupUI() { - - self.backgroundImageView.snp.remakeConstraints { make in + + private func setupSegmentedView() { + segmentedView.dataSource = dataSource +// segmentedView.indicators = [indicator] + segmentedView.listContainer = pagingView.listContainerView + segmentedView.delegate = self; + } + + private func setupUI() { + + backgroundImageView.snp.remakeConstraints { make in make.edges.equalToSuperview() } + + // header + view.addSubview(headerView) + headerView.snp.makeConstraints { make in + make.left.right.top.equalToSuperview() + make.height.equalTo(113) + } + + // PagingView ONLY + view.addSubview(pagingView) + pagingView.snp.makeConstraints { make in + make.top.equalTo(headerView.snp.bottom).offset(20) + make.left.right.bottom.equalToSuperview() + } + } + +} + + +// MARK: - JXPagingViewDelegate +extension SRMyShortViewController: JXPagingViewDelegate { + + func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int { + return 0 + } + + func tableHeaderView(in pagingView: JXPagingView) -> UIView { + return UIView() + } + + func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int { + return 40 + } + + func viewForPinSectionHeader(in pagingView: JXPagingView) -> UIView { + return segmentedView + } + + func numberOfLists(in pagingView: JXPagingView) -> Int { + return titles.count + } + + func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> any JXPagingViewListViewDelegate { + if(index == 0){ + return SRFavoritesViewController() } + else{ + return SRHistoryViewController() + } + } +} + +//MARK: JXPagingMainTableViewGestureDelegate +extension SRMyShortViewController: JXPagingMainTableViewGestureDelegate { + func mainTableViewGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + if otherGestureRecognizer == segmentedView.collectionView.panGestureRecognizer { + return false + } + + if let view = otherGestureRecognizer.view { + var superview: UIView? = view.superview + while superview != nil { + if superview?.isKind(of: SRShortHeaderView.self) == true { + return false + } + superview = superview?.superview + } + } + + return gestureRecognizer.isKind(of: UIPanGestureRecognizer.self) && otherGestureRecognizer.isKind(of: UIPanGestureRecognizer.self) } } + +extension SRMyShortViewController: JXSegmentedViewDelegate {} diff --git a/SynthReel/Class/MyShort/VM/SRListMenuDataSource.swift b/SynthReel/Class/MyShort/VM/SRListMenuDataSource.swift new file mode 100644 index 0000000..43681ad --- /dev/null +++ b/SynthReel/Class/MyShort/VM/SRListMenuDataSource.swift @@ -0,0 +1,34 @@ +// +// SRListMenuDataSource.swift +// SynthReel +// +// Created by CSGY on 2025/11/24. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit +import JXSegmentedView + + +class SRListMenuDataSource: JXSegmentedTitleDataSource { + + nonisolated override init() { + super.init() + } + + nonisolated override func registerCellClass(in segmentedView: JXSegmentedView) { + MainActor.assumeIsolated { + segmentedView.collectionView.register(SRListMenuCell.self, forCellWithReuseIdentifier: "SRListMenuCell") + } + } + + nonisolated override func segmentedView(_ segmentedView: JXSegmentedView, cellForItemAt index: Int) -> JXSegmentedBaseCell { + return MainActor.assumeIsolated { + let cell = segmentedView.dequeueReusableCell(withReuseIdentifier: "SRListMenuCell", at: index) + return cell + } + } + + + +} diff --git a/SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift b/SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift index 73a3a20..c2d805f 100644 --- a/SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift +++ b/SynthReel/Class/Player/VC/SRDetailPlayerViewController.swift @@ -57,6 +57,11 @@ class SRDetailPlayerViewController: JXPlayerListViewController { } } + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + self.viewModel.currentCell?.pause() + } + override func play() { let videoInfo = self.viewModel.currentCell?.model as? SRVideoInfoModel super.play() diff --git a/SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift b/SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift index 475e8fe..fe88aab 100644 --- a/SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift +++ b/SynthReel/Class/Player/VC/SRRecommendPlayerViewController.swift @@ -40,7 +40,11 @@ class SRRecommendPlayerViewController: JXPlayerListViewController { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: true) } - + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + self.viewModel.currentCell?.pause() + } } diff --git a/SynthReel/Class/User/VC/SRUserViewController.swift b/SynthReel/Class/User/VC/SRUserViewController.swift new file mode 100644 index 0000000..b1aab6d --- /dev/null +++ b/SynthReel/Class/User/VC/SRUserViewController.swift @@ -0,0 +1,20 @@ +// +// SRUserViewController.swift +// SynthReel +// +// Created by CSGY on 2025/11/24. +// Copyright © 2025 SR. All rights reserved. +// + +import UIKit + +class SRUserViewController: SRViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + +} diff --git a/SynthReel/Source/Assets.xcassets/Color/#C4C4C4.colorset/Contents.json b/SynthReel/Source/Assets.xcassets/Color/#C4C4C4.colorset/Contents.json new file mode 100644 index 0000000..22c4bb0 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Color/#C4C4C4.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/Contents.json new file mode 100644 index 0000000..a3705bd --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "historyBottom@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "historyBottom@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@2x.png b/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@2x.png new file mode 100644 index 0000000..c3a2dc3 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@3x.png b/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@3x.png new file mode 100644 index 0000000..8286a23 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Contents.json new file mode 100644 index 0000000..ab79b65 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Favorite@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Favorite@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@2x.png b/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@2x.png new file mode 100644 index 0000000..d4303b6 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@3x.png b/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@3x.png new file mode 100644 index 0000000..c4d1237 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/Contents.json new file mode 100644 index 0000000..b99b409 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "FavoritesSeleted@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "FavoritesSeleted@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@2x.png b/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@2x.png new file mode 100644 index 0000000..ef260b5 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@3x.png b/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@3x.png new file mode 100644 index 0000000..96bd89a Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/history.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/history.imageset/Contents.json new file mode 100644 index 0000000..a9c623f --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/history.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "history@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "history@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@2x.png b/SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@2x.png new file mode 100644 index 0000000..6dbefef Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@3x.png b/SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@3x.png new file mode 100644 index 0000000..cef8e58 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/Contents.json new file mode 100644 index 0000000..7b0d0b4 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "historyCell@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "historyCell@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@2x.png b/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@2x.png new file mode 100644 index 0000000..22c4df1 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@3x.png b/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@3x.png new file mode 100644 index 0000000..dcdee03 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/Contents.json new file mode 100644 index 0000000..a9e5716 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "historySeleted@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "historySeleted@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@2x.png b/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@2x.png new file mode 100644 index 0000000..863793f Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@3x.png b/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@3x.png new file mode 100644 index 0000000..10e0094 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/Contents.json new file mode 100644 index 0000000..119c8a2 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "listNavBg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "listNavBg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@2x.png b/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@2x.png new file mode 100644 index 0000000..ca4836c Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@3x.png b/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@3x.png new file mode 100644 index 0000000..cdb9dd1 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/Contents.json new file mode 100644 index 0000000..2fcc7b2 --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "收藏@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "收藏@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@2x.png b/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@2x.png new file mode 100644 index 0000000..4a244f6 Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@3x.png b/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@3x.png new file mode 100644 index 0000000..13ec64c Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@3x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/Contents.json b/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/Contents.json new file mode 100644 index 0000000..52ce98a --- /dev/null +++ b/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "闪光 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "闪光 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@2x.png b/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@2x.png new file mode 100644 index 0000000..1e05c3d Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@2x.png differ diff --git a/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@3x.png b/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@3x.png new file mode 100644 index 0000000..da92f3b Binary files /dev/null and b/SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@3x.png differ