1列表页
@ -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 = "<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>"; };
|
||||
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>"; };
|
||||
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; };
|
||||
@ -222,9 +238,9 @@
|
||||
03980F542ECEEC990006E317 /* MyShort */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
370D2F0A2ED44AAC00571E77 /* VM */,
|
||||
3779D05F2ECF1C8D006B1698 /* V */,
|
||||
03980F552ECEECB30006E317 /* VC */,
|
||||
03980F562ECEECBC0006E317 /* V */,
|
||||
03980F572ECEECCC0006E317 /* M */,
|
||||
);
|
||||
path = MyShort;
|
||||
sourceTree = "<group>";
|
||||
@ -233,24 +249,12 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
03980F582ECEED190006E317 /* SRMyShortViewController.swift */,
|
||||
370D2EF62ED000C400571E77 /* SRFavoritesViewController.swift */,
|
||||
370D2EF82ED000D200571E77 /* SRHistoryViewController.swift */,
|
||||
);
|
||||
path = VC;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
03980F562ECEECBC0006E317 /* V */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
path = V;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
03980F572ECEECCC0006E317 /* M */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
path = M;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
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 = "<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 */ = {
|
||||
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;
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -110,7 +110,6 @@ class SRHomeViewController: SRViewController {
|
||||
return view
|
||||
}()
|
||||
|
||||
@MainActor
|
||||
deinit {
|
||||
srPrint(message: "销毁")
|
||||
}
|
||||
|
||||
94
SynthReel/Class/MyShort/V/SRFavoritesCell.swift
Normal 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))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
107
SynthReel/Class/MyShort/V/SRHistoryCell.swift
Normal 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()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
58
SynthReel/Class/MyShort/V/SRListMenuCell.swift
Normal 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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
70
SynthReel/Class/MyShort/V/SRShortHeaderView.swift
Normal 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")
|
||||
}
|
||||
}
|
||||
135
SynthReel/Class/MyShort/VC/SRFavoritesViewController.swift
Normal 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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
123
SynthReel/Class/MyShort/VC/SRHistoryViewController.swift
Normal 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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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 {}
|
||||
|
||||
34
SynthReel/Class/MyShort/VM/SRListMenuDataSource.swift
Normal 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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -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()
|
||||
|
||||
@ -41,6 +41,10 @@ class SRRecommendPlayerViewController: JXPlayerListViewController {
|
||||
self.navigationController?.setNavigationBarHidden(true, animated: true)
|
||||
}
|
||||
|
||||
override func viewDidDisappear(_ animated: Bool) {
|
||||
super.viewDidDisappear(animated)
|
||||
self.viewModel.currentCell?.pause()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
20
SynthReel/Class/User/VC/SRUserViewController.swift
Normal 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.
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
22
SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 656 B |
BIN
SynthReel/Source/Assets.xcassets/Image/historyBottom.imageset/historyBottom@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 855 B |
6
SynthReel/Source/Assets.xcassets/myShort/Contents.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
22
SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/Favorite.imageset/Favorite@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 12 KiB |
22
SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/FavoritesSeleted.imageset/FavoritesSeleted@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 12 KiB |
22
SynthReel/Source/Assets.xcassets/myShort/history.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/history.imageset/history@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 12 KiB |
22
SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/historyCell.imageset/historyCell@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
22
SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 7.0 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/historySeleted.imageset/historySeleted@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 12 KiB |
22
SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 7.4 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/listNavBg.imageset/listNavBg@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 15 KiB |
22
SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/收藏.imageset/收藏@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 11 KiB |
22
SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/Contents.json
vendored
Normal 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
|
||||
}
|
||||
}
|
||||
BIN
SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
SynthReel/Source/Assets.xcassets/myShort/闪光 1.imageset/闪光 1@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 6.3 KiB |