1列表页

This commit is contained in:
HiBit 2025-11-24 16:49:59 +08:00
parent b89399a769
commit 8e142ebca7
43 changed files with 1132 additions and 30 deletions

View File

@ -101,6 +101,14 @@
03E9A7F82EC4AA54000D1067 /* SRUserDefaultsKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */; }; 03E9A7F82EC4AA54000D1067 /* SRUserDefaultsKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */; };
03E9A7FA2EC56D03000D1067 /* String+SRAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E9A7F92EC56CFC000D1067 /* String+SRAdd.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 */; }; 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 */; }; 47BB39E2DD30787FA591F8EB /* Pods_SynthReel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
@ -200,6 +208,14 @@
03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserDefaultsKey.swift; sourceTree = "<group>"; }; 03E9A7F72EC4AA4F000D1067 /* SRUserDefaultsKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserDefaultsKey.swift; sourceTree = "<group>"; };
03E9A7F92EC56CFC000D1067 /* String+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SRAdd.swift"; sourceTree = "<group>"; }; 03E9A7F92EC56CFC000D1067 /* String+SRAdd.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SRAdd.swift"; sourceTree = "<group>"; };
03E9A7FC2EC5763B000D1067 /* SRUserApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserApi.swift; sourceTree = "<group>"; }; 03E9A7FC2EC5763B000D1067 /* SRUserApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserApi.swift; sourceTree = "<group>"; };
370D2EF62ED000C400571E77 /* SRFavoritesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRFavoritesViewController.swift; sourceTree = "<group>"; };
370D2EF82ED000D200571E77 /* SRHistoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHistoryViewController.swift; sourceTree = "<group>"; };
370D2F042ED3FEE700571E77 /* SRHistoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRHistoryCell.swift; sourceTree = "<group>"; };
370D2F062ED3FEFA00571E77 /* SRFavoritesCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRFavoritesCell.swift; sourceTree = "<group>"; };
370D2F082ED44A6D00571E77 /* SRListMenuCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRListMenuCell.swift; sourceTree = "<group>"; };
370D2F0B2ED44ACB00571E77 /* SRListMenuDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRListMenuDataSource.swift; sourceTree = "<group>"; };
370D2F0F2ED4534500571E77 /* SRUserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRUserViewController.swift; sourceTree = "<group>"; };
3779D0602ECF1CB8006B1698 /* SRShortHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRShortHeaderView.swift; sourceTree = "<group>"; };
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 = "<group>"; }; 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 = "<group>"; };
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 = "<group>"; }; 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 = "<group>"; };
F9255BF4D4B1CFDDB5CFFB43 /* Pods_SynthReel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SynthReel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 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 */ = { 03980F542ECEEC990006E317 /* MyShort */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
370D2F0A2ED44AAC00571E77 /* VM */,
3779D05F2ECF1C8D006B1698 /* V */,
03980F552ECEECB30006E317 /* VC */, 03980F552ECEECB30006E317 /* VC */,
03980F562ECEECBC0006E317 /* V */,
03980F572ECEECCC0006E317 /* M */,
); );
path = MyShort; path = MyShort;
sourceTree = "<group>"; sourceTree = "<group>";
@ -233,24 +249,12 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
03980F582ECEED190006E317 /* SRMyShortViewController.swift */, 03980F582ECEED190006E317 /* SRMyShortViewController.swift */,
370D2EF62ED000C400571E77 /* SRFavoritesViewController.swift */,
370D2EF82ED000D200571E77 /* SRHistoryViewController.swift */,
); );
path = VC; path = VC;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
03980F562ECEECBC0006E317 /* V */ = {
isa = PBXGroup;
children = (
);
path = V;
sourceTree = "<group>";
};
03980F572ECEECCC0006E317 /* M */ = {
isa = PBXGroup;
children = (
);
path = M;
sourceTree = "<group>";
};
03B1A8372EC5C8BF006C353F /* SRHud */ = { 03B1A8372EC5C8BF006C353F /* SRHud */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -494,6 +498,7 @@
03E9A7D32EC4720F000D1067 /* Class */ = { 03E9A7D32EC4720F000D1067 /* Class */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
370D2F0D2ED4532100571E77 /* User */,
03980F542ECEEC990006E317 /* MyShort */, 03980F542ECEEC990006E317 /* MyShort */,
03B1A84E2EC5DB13006C353F /* Home */, 03B1A84E2EC5DB13006C353F /* Home */,
03B1A8EA2EC72BFB006C353F /* Player */, 03B1A8EA2EC72BFB006C353F /* Player */,
@ -578,6 +583,41 @@
path = API; path = API;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
370D2F0A2ED44AAC00571E77 /* VM */ = {
isa = PBXGroup;
children = (
370D2F0B2ED44ACB00571E77 /* SRListMenuDataSource.swift */,
);
path = VM;
sourceTree = "<group>";
};
370D2F0D2ED4532100571E77 /* User */ = {
isa = PBXGroup;
children = (
370D2F0E2ED4532A00571E77 /* VC */,
);
path = User;
sourceTree = "<group>";
};
370D2F0E2ED4532A00571E77 /* VC */ = {
isa = PBXGroup;
children = (
370D2F0F2ED4534500571E77 /* SRUserViewController.swift */,
);
path = VC;
sourceTree = "<group>";
};
3779D05F2ECF1C8D006B1698 /* V */ = {
isa = PBXGroup;
children = (
3779D0602ECF1CB8006B1698 /* SRShortHeaderView.swift */,
370D2F042ED3FEE700571E77 /* SRHistoryCell.swift */,
370D2F062ED3FEFA00571E77 /* SRFavoritesCell.swift */,
370D2F082ED44A6D00571E77 /* SRListMenuCell.swift */,
);
path = V;
sourceTree = "<group>";
};
8CAFCEC2C631CAE75726D90C /* Pods */ = { 8CAFCEC2C631CAE75726D90C /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -680,14 +720,10 @@
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-input-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
inputPaths = (
);
name = "[CP] Embed Pods Frameworks"; name = "[CP] Embed Pods Frameworks";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-output-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SynthReel/Pods-SynthReel-frameworks.sh\"\n";
@ -732,6 +768,7 @@
03B1A8452EC5CBBB006C353F /* SRNavigationController.swift in Sources */, 03B1A8452EC5CBBB006C353F /* SRNavigationController.swift in Sources */,
03B1A9092ECAAF55006C353F /* SRHomeTopChartsView.swift in Sources */, 03B1A9092ECAAF55006C353F /* SRHomeTopChartsView.swift in Sources */,
03E9A7E42EC49593000D1067 /* SRUrlPath.swift in Sources */, 03E9A7E42EC49593000D1067 /* SRUrlPath.swift in Sources */,
370D2EF92ED000D200571E77 /* SRHistoryViewController.swift in Sources */,
03B1A9462ECC5679006C353F /* SRSearchResultCell.swift in Sources */, 03B1A9462ECC5679006C353F /* SRSearchResultCell.swift in Sources */,
03B1A9502ECEB4E6006C353F /* SRRecommendPlayerViewController.swift in Sources */, 03B1A9502ECEB4E6006C353F /* SRRecommendPlayerViewController.swift in Sources */,
03B1A83E2EC5C91E006C353F /* SRTool.swift in Sources */, 03B1A83E2EC5C91E006C353F /* SRTool.swift in Sources */,
@ -739,6 +776,8 @@
03B1A8FD2EC81C62006C353F /* SRHomeBannerCell.swift in Sources */, 03B1A8FD2EC81C62006C353F /* SRHomeBannerCell.swift in Sources */,
03E9A7DB2EC485BE000D1067 /* SRNetwork.swift in Sources */, 03E9A7DB2EC485BE000D1067 /* SRNetwork.swift in Sources */,
03E9A7F42EC4A94D000D1067 /* SRAccountToken.swift in Sources */, 03E9A7F42EC4A94D000D1067 /* SRAccountToken.swift in Sources */,
370D2EF72ED000C400571E77 /* SRFavoritesViewController.swift in Sources */,
370D2F072ED3FEFA00571E77 /* SRFavoritesCell.swift in Sources */,
03B1A8E72EC7175D006C353F /* SRCategoryModel.swift in Sources */, 03B1A8E72EC7175D006C353F /* SRCategoryModel.swift in Sources */,
03B1A94A2ECC79AB006C353F /* SREpSelectorView.swift in Sources */, 03B1A94A2ECC79AB006C353F /* SREpSelectorView.swift in Sources */,
03B1A94E2ECD604B006C353F /* SREpSelectorCell.swift in Sources */, 03B1A94E2ECD604B006C353F /* SREpSelectorCell.swift in Sources */,
@ -754,6 +793,7 @@
03B1A8392EC5C8D6006C353F /* SRHud.swift in Sources */, 03B1A8392EC5C8D6006C353F /* SRHud.swift in Sources */,
03E9A7EC2EC499A9000D1067 /* SRDeviceId.swift in Sources */, 03E9A7EC2EC499A9000D1067 /* SRDeviceId.swift in Sources */,
03E9A7E22EC494F9000D1067 /* SRTargetType.swift in Sources */, 03E9A7E22EC494F9000D1067 /* SRTargetType.swift in Sources */,
370D2F092ED44A6D00571E77 /* SRListMenuCell.swift in Sources */,
03980F532ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift in Sources */, 03980F532ECEDEAB0006E317 /* SRRecommendPlayerControlView.swift in Sources */,
03B1A90F2ECAC768006C353F /* SRHomeBingeWorthyView.swift in Sources */, 03B1A90F2ECAC768006C353F /* SRHomeBingeWorthyView.swift in Sources */,
03B1A9072EC86656006C353F /* SRGradientView.swift in Sources */, 03B1A9072EC86656006C353F /* SRGradientView.swift in Sources */,
@ -761,6 +801,7 @@
03B1A8402EC5CA37006C353F /* AppDelegate+Config.swift in Sources */, 03B1A8402EC5CA37006C353F /* AppDelegate+Config.swift in Sources */,
03B1A9152ECAEE63006C353F /* SRHomeViralHitsCell.swift in Sources */, 03B1A9152ECAEE63006C353F /* SRHomeViralHitsCell.swift in Sources */,
03B1A8472EC5CBCF006C353F /* SRViewController.swift in Sources */, 03B1A8472EC5CBCF006C353F /* SRViewController.swift in Sources */,
370D2F052ED3FEE700571E77 /* SRHistoryCell.swift in Sources */,
03B1A9032EC8555B006C353F /* SRHomeYouLikeView.swift in Sources */, 03B1A9032EC8555B006C353F /* SRHomeYouLikeView.swift in Sources */,
03B1A9362ECC1D1D006C353F /* SRSearchRecordView.swift in Sources */, 03B1A9362ECC1D1D006C353F /* SRSearchRecordView.swift in Sources */,
03B1A8D82EC6D051006C353F /* SRCollectionView.swift in Sources */, 03B1A8D82EC6D051006C353F /* SRCollectionView.swift in Sources */,
@ -773,6 +814,7 @@
03B1A8432EC5CB99006C353F /* SRTabBarController.swift in Sources */, 03B1A8432EC5CB99006C353F /* SRTabBarController.swift in Sources */,
03B1A8EF2EC72C78006C353F /* SRShortModel.swift in Sources */, 03B1A8EF2EC72C78006C353F /* SRShortModel.swift in Sources */,
03B1A8ED2EC72C1F006C353F /* SRHomeModuleItem.swift in Sources */, 03B1A8ED2EC72C1F006C353F /* SRHomeModuleItem.swift in Sources */,
370D2F102ED4534500571E77 /* SRUserViewController.swift in Sources */,
03B1A9112ECAC927006C353F /* SRHomeBingeWorthyCell.swift in Sources */, 03B1A9112ECAC927006C353F /* SRHomeBingeWorthyCell.swift in Sources */,
03E9A7F22EC4A8F6000D1067 /* UserDefaults+SRAdd.swift in Sources */, 03E9A7F22EC4A8F6000D1067 /* UserDefaults+SRAdd.swift in Sources */,
03B1A93A2ECC3F54006C353F /* SRSearchViewModel.swift in Sources */, 03B1A93A2ECC3F54006C353F /* SRSearchViewModel.swift in Sources */,
@ -783,6 +825,7 @@
03980F592ECEED190006E317 /* SRMyShortViewController.swift in Sources */, 03980F592ECEED190006E317 /* SRMyShortViewController.swift in Sources */,
03B1A92A2ECC0738006C353F /* SRShortApi.swift in Sources */, 03B1A92A2ECC0738006C353F /* SRShortApi.swift in Sources */,
03B1A90B2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift in Sources */, 03B1A90B2ECAB2EA006C353F /* SRHomeTopChartsContentView.swift in Sources */,
370D2F0C2ED44ACB00571E77 /* SRListMenuDataSource.swift in Sources */,
03B1A94C2ECC7A2D006C353F /* SRPanModalContentView.swift in Sources */, 03B1A94C2ECC7A2D006C353F /* SRPanModalContentView.swift in Sources */,
03B1A9052EC857B3006C353F /* SRHomeYouLikeCell.swift in Sources */, 03B1A9052EC857B3006C353F /* SRHomeYouLikeCell.swift in Sources */,
03B1A92E2ECC0D7E006C353F /* SRShortDetailControlView.swift in Sources */, 03B1A92E2ECC0D7E006C353F /* SRShortDetailControlView.swift in Sources */,
@ -800,6 +843,7 @@
03B1A9132ECAED04006C353F /* SRHomeViralHitsView.swift in Sources */, 03B1A9132ECAED04006C353F /* SRHomeViralHitsView.swift in Sources */,
03B1A8DC2EC6D0EB006C353F /* SRHomeChildCell.swift in Sources */, 03B1A8DC2EC6D0EB006C353F /* SRHomeChildCell.swift in Sources */,
03B1A8552EC5E434006C353F /* UIFont+SRAdd.swift in Sources */, 03B1A8552EC5E434006C353F /* UIFont+SRAdd.swift in Sources */,
3779D0612ECF1CB8006B1698 /* SRShortHeaderView.swift in Sources */,
03980F512ECEBEE20006E317 /* SRRecommendPlayerCell.swift in Sources */, 03980F512ECEBEE20006E317 /* SRRecommendPlayerCell.swift in Sources */,
03B1A91B2ECAFFD6006C353F /* UIView+SRAdd.swift in Sources */, 03B1A91B2ECAFFD6006C353F /* UIView+SRAdd.swift in Sources */,
03B1A9222ECB456C006C353F /* SRDetailPlayerViewController.swift in Sources */, 03B1A9222ECB456C006C353F /* SRDetailPlayerViewController.swift in Sources */,
@ -841,9 +885,10 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6XALB8RSYF; DEVELOPMENT_TEAM = 6RZK7QBQQ7;
EXCLUDED_ARCHS = ""; EXCLUDED_ARCHS = "";
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@ -861,9 +906,12 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel; PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
@ -880,9 +928,10 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 6XALB8RSYF; DEVELOPMENT_TEAM = 6RZK7QBQQ7;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = SynthReel/Source/Info.plist; INFOPLIST_FILE = SynthReel/Source/Info.plist;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
@ -898,9 +947,12 @@
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel; PRODUCT_BUNDLE_IDENTIFIER = com.hbqinjiu.SynthReel;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
STRING_CATALOG_GENERATE_SYMBOLS = YES; STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO; SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES; SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;

View File

@ -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<SRNetwork.List<SRShortModel>>) 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<SRNetwork.List<SRShortModel>>) in
continuation.resume(returning: response.data?.list)
}
}
}
} }

View File

@ -110,7 +110,6 @@ class SRHomeViewController: SRViewController {
return view return view
}() }()
@MainActor
deinit { deinit {
srPrint(message: "销毁") srPrint(message: "销毁")
} }

View File

@ -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))
}
}
}

View File

@ -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()
}
}
}

View File

@ -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")
}
}
}
}

View File

@ -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")
}
}

View File

@ -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()
}
}
}

View File

@ -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()
}
}
}

View File

@ -6,32 +6,161 @@
// Copyright © 2025 SR. All rights reserved. // Copyright © 2025 SR. All rights reserved.
// //
import UIKit import UIKit
import SnapKit import SnapKit
import JXSegmentedView
import JXPagingView
class SRMyShortViewController: SRViewController { 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() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
self.backgroundImageView.image = UIImage(named: "my_short_bg_image") self.backgroundImageView.image = UIImage(named: "my_short_bg_image")
self.backgroundImageView.contentMode = .scaleAspectFit 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) { override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: true) self.navigationController?.setNavigationBarHidden(true, animated: true)
} }
} }
extension SRMyShortViewController { extension SRMyShortViewController {
private func sr_setupUI() {
private func setupSegmentedView() {
self.backgroundImageView.snp.remakeConstraints { make in segmentedView.dataSource = dataSource
// segmentedView.indicators = [indicator]
segmentedView.listContainer = pagingView.listContainerView
segmentedView.delegate = self;
}
private func setupUI() {
backgroundImageView.snp.remakeConstraints { make in
make.edges.equalToSuperview() 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 {}

View File

@ -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
}
}
}

View File

@ -57,6 +57,11 @@ class SRDetailPlayerViewController: JXPlayerListViewController {
} }
} }
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
self.viewModel.currentCell?.pause()
}
override func play() { override func play() {
let videoInfo = self.viewModel.currentCell?.model as? SRVideoInfoModel let videoInfo = self.viewModel.currentCell?.model as? SRVideoInfoModel
super.play() super.play()

View File

@ -40,7 +40,11 @@ class SRRecommendPlayerViewController: JXPlayerListViewController {
super.viewWillAppear(animated) super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(true, animated: true) self.navigationController?.setNavigationBarHidden(true, animated: true)
} }
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
self.viewModel.currentCell?.pause()
}
} }

View File

@ -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.
}
}

View File

@ -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
}
}

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB