This commit is contained in:
zeng 2025-10-17 10:12:55 +08:00
parent f0628bd609
commit e7b1017d50
27 changed files with 616 additions and 2 deletions

View File

@ -10,6 +10,12 @@
B8B1DA3824F2148CEEF9F162 /* Pods_Fableon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4958FEE55B4555A94F11F00 /* Pods_Fableon.framework */; };
F301F6472E974B6300E76A90 /* FARecommendPlayerControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F301F6462E974B6300E76A90 /* FARecommendPlayerControlView.swift */; };
F34296922EA0C60200A58F99 /* FAHomePlayHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34296912EA0C60200A58F99 /* FAHomePlayHistoryView.swift */; };
F34296942EA0E8CB00A58F99 /* FAGenresViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34296932EA0E8CB00A58F99 /* FAGenresViewController.swift */; };
F34296972EA0EAAA00A58F99 /* FAGenresCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34296952EA0EAAA00A58F99 /* FAGenresCell.swift */; };
F34296982EA0EAAA00A58F99 /* FAGenresCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F34296962EA0EAAA00A58F99 /* FAGenresCell.xib */; };
F342969A2EA0F8E700A58F99 /* FAGenresListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F34296992EA0F8E700A58F99 /* FAGenresListViewController.swift */; };
F342969F2EA0FA2200A58F99 /* FAGenresListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F342969E2EA0FA2200A58F99 /* FAGenresListCell.xib */; };
F34296A02EA0FA2200A58F99 /* FAGenresListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F342969D2EA0FA2200A58F99 /* FAGenresListCell.swift */; };
F37103312E978F8C00E7F171 /* FACollectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F37103302E978F8C00E7F171 /* FACollectViewController.swift */; };
F37103352E97929F00E7F171 /* FACollectCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F37103342E97929F00E7F171 /* FACollectCell.xib */; };
F37103362E97929F00E7F171 /* FACollectCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F37103332E97929F00E7F171 /* FACollectCell.swift */; };
@ -129,6 +135,12 @@
DC14083E24B746ED3DE2FE0C /* Pods-Fableon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Fableon.release.xcconfig"; path = "Target Support Files/Pods-Fableon/Pods-Fableon.release.xcconfig"; sourceTree = "<group>"; };
F301F6462E974B6300E76A90 /* FARecommendPlayerControlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FARecommendPlayerControlView.swift; sourceTree = "<group>"; };
F34296912EA0C60200A58F99 /* FAHomePlayHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAHomePlayHistoryView.swift; sourceTree = "<group>"; };
F34296932EA0E8CB00A58F99 /* FAGenresViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAGenresViewController.swift; sourceTree = "<group>"; };
F34296952EA0EAAA00A58F99 /* FAGenresCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAGenresCell.swift; sourceTree = "<group>"; };
F34296962EA0EAAA00A58F99 /* FAGenresCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FAGenresCell.xib; sourceTree = "<group>"; };
F34296992EA0F8E700A58F99 /* FAGenresListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAGenresListViewController.swift; sourceTree = "<group>"; };
F342969D2EA0FA2200A58F99 /* FAGenresListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FAGenresListCell.swift; sourceTree = "<group>"; };
F342969E2EA0FA2200A58F99 /* FAGenresListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FAGenresListCell.xib; sourceTree = "<group>"; };
F37103302E978F8C00E7F171 /* FACollectViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACollectViewController.swift; sourceTree = "<group>"; };
F37103332E97929F00E7F171 /* FACollectCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FACollectCell.swift; sourceTree = "<group>"; };
F37103342E97929F00E7F171 /* FACollectCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FACollectCell.xib; sourceTree = "<group>"; };
@ -559,6 +571,10 @@
F37103642E9E3ABC00E7F171 /* FASearchResultCell.swift */,
F37103652E9E3ABC00E7F171 /* FASearchResultCell.xib */,
F34296912EA0C60200A58F99 /* FAHomePlayHistoryView.swift */,
F34296952EA0EAAA00A58F99 /* FAGenresCell.swift */,
F34296962EA0EAAA00A58F99 /* FAGenresCell.xib */,
F342969D2EA0FA2200A58F99 /* FAGenresListCell.swift */,
F342969E2EA0FA2200A58F99 /* FAGenresListCell.xib */,
);
path = V;
sourceTree = "<group>";
@ -568,6 +584,8 @@
children = (
F3A793032E77FB110097E0BC /* FAHomeViewController.swift */,
F371034C2E9DF9FB00E7F171 /* FASearchViewController.swift */,
F34296932EA0E8CB00A58F99 /* FAGenresViewController.swift */,
F34296992EA0F8E700A58F99 /* FAGenresListViewController.swift */,
);
path = C;
sourceTree = "<group>";
@ -828,8 +846,10 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F34296982EA0EAAA00A58F99 /* FAGenresCell.xib in Resources */,
F3A798B72E828C180097E0BC /* Localizable.strings in Resources */,
F37103572E9E1FA500E7F171 /* FASearchRecordCell.xib in Resources */,
F342969F2EA0FA2200A58F99 /* FAGenresListCell.xib in Resources */,
F39E663A2E77BAD0008AAAFA /* Assets.xcassets in Resources */,
F37103772E9FA15B00E7F171 /* FAAboutCell.xib in Resources */,
F371035E2E9E2E7400E7F171 /* FASearchRecommendCell.xib in Resources */,
@ -917,6 +937,7 @@
F3A7931C2E792D0D0097E0BC /* FAHomeMustSeeContentCell.swift in Sources */,
F37103612E9E379E00E7F171 /* FASearchResultView.swift in Sources */,
F3A792F52E77F8A80097E0BC /* FAHomeRecommendedItemView.swift in Sources */,
F34296972EA0EAAA00A58F99 /* FAGenresCell.swift in Sources */,
F37103842EA0873B00E7F171 /* Dictionary+FAAdd.swift in Sources */,
F3A792F72E77F8A80097E0BC /* FAHomeNewView.swift in Sources */,
F3A792F82E77F8A80097E0BC /* FAHomeMustSeeShortView.swift in Sources */,
@ -944,8 +965,10 @@
F3A7932C2E796EF80097E0BC /* FAPlayerDetailControlView.swift in Sources */,
F3A798BC2E82AB6F0097E0BC /* FAEpSelectorView.swift in Sources */,
F37103512E9E1D7800E7F171 /* FASearchHomeView.swift in Sources */,
F34296942EA0E8CB00A58F99 /* FAGenresViewController.swift in Sources */,
F3A792AF2E77DFB90097E0BC /* FATokenModel.swift in Sources */,
F38C25FA2E86A217008C22C3 /* UIView+FAAdd.swift in Sources */,
F342969A2EA0F8E700A58F99 /* FAGenresListViewController.swift in Sources */,
F3A7931A2E7911420097E0BC /* FAPagerViewTransformer.swift in Sources */,
F3DCC0672E8AA14A00D58007 /* FAMeItemModel.swift in Sources */,
F37103312E978F8C00E7F171 /* FACollectViewController.swift in Sources */,
@ -966,6 +989,7 @@
F3A792DC2E77F70C0097E0BC /* FAPlayerDetailViewController.swift in Sources */,
F38C25FF2E86B663008C22C3 /* AppDelegate+FAConfig.swift in Sources */,
F37103592E9E281C00E7F171 /* FASearchRecommendView.swift in Sources */,
F34296A02EA0FA2200A58F99 /* FAGenresListCell.swift in Sources */,
F3A792BF2E77E4B80097E0BC /* FATool.swift in Sources */,
F371033F2E97BDF800E7F171 /* FAHistoryViewController.swift in Sources */,
F3DCC08B2E8BB16F00D58007 /* FARecommendViewController.swift in Sources */,

View File

@ -10,7 +10,7 @@ let FAWebBaseURL = "https://www.breeltv.com"
let FACampaignWebURL = "https://campaign.breeltv.com"
//hbqinjiu.com
///
let kFAFeedBackHomeWebUrl = FACampaignWebURL + "/pages/leave/index"

View File

@ -0,0 +1,74 @@
//
// FAGenresListViewController.swift
// Fableon
//
// Created by 鸿 on 2025/10/16.
//
import UIKit
class FAGenresListViewController: FAViewController {
private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
let width = floor((UIScreen.width - 32 - 16) / 3)
let height = 145 / 109 * width + 41
let layout = UICollectionViewFlowLayout()
layout.minimumLineSpacing = 12
layout.minimumInteritemSpacing = 8
layout.itemSize = .init(width: width, height: height)
layout.sectionInset = .init(top: 0, left: 16, bottom: 0, right: 16)
return layout
}()
private lazy var collectionView: FACollectionView = {
let collectionView = FACollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.contentInset = .init(top: 20, left: 0, bottom: UIScreen.safeBottom + 10, right: 0)
collectionView.register(UINib(nibName: "FAGenresListCell", bundle: nil), forCellWithReuseIdentifier: "cell")
return collectionView
}()
override func viewDidLoad() {
super.viewDidLoad()
fa_setupLayout()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: true)
fa_setNavigationStyle()
}
}
extension FAGenresListViewController {
private func fa_setupLayout() {
view.addSubview(collectionView)
collectionView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalToSuperview().offset(UIScreen.navBarHeight)
}
}
}
//MARK: UICollectionViewDelegate UICollectionViewDataSource
extension FAGenresListViewController: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! FAGenresListCell
return cell
}
}

View File

@ -0,0 +1,83 @@
//
// FAGenresViewController.swift
// Fableon
//
// Created by 鸿 on 2025/10/16.
//
import UIKit
class FAGenresViewController: FAViewController {
private lazy var bgColorArr: [UIColor] = [
._5_CA_8_FF_0_5,
.A_783_FF_0_5,
.FF_5977_0_5,
.FE_8_CCA_0_5,
.FCB_072_0_5
]
private lazy var collectionViewLayout: UICollectionViewFlowLayout = {
let layout = UICollectionViewFlowLayout()
layout.minimumLineSpacing = 10
layout.itemSize = .init(width: UIScreen.width - 32, height: 140)
return layout
}()
private lazy var collectionView: FACollectionView = {
let collectionView = FACollectionView(frame: .zero, collectionViewLayout: self.collectionViewLayout)
collectionView.delegate = self
collectionView.dataSource = self
collectionView.contentInset = .init(top: 24, left: 0, bottom: UIScreen.safeBottom + 10, right: 0)
collectionView.register(UINib(nibName: "FAGenresCell", bundle: nil), forCellWithReuseIdentifier: "cell")
return collectionView
}()
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Genres".localized
fa_setupLayout()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController?.setNavigationBarHidden(false, animated: true)
self.fa_setNavigationStyle()
}
}
extension FAGenresViewController {
private func fa_setupLayout() {
view.addSubview(collectionView)
collectionView.snp.makeConstraints { make in
make.left.right.bottom.equalToSuperview()
make.top.equalToSuperview().offset(UIScreen.navBarHeight)
}
}
}
//MARK: UICollectionViewDelegate UICollectionViewDataSource
extension FAGenresViewController: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! FAGenresCell
cell.bgView.backgroundColor = bgColorArr[indexPath.row % 5]
return cell
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let vc = FAGenresListViewController()
self.navigationController?.pushViewController(vc, animated: true)
}
}

View File

@ -11,6 +11,8 @@ struct FAHomeMustSeeContentView: View {
@Binding var list: [FAShortPlayModel]
var moduleKey: FAHomeModuleItem.ModuleKey?
@ObservedObject var viewModel: FAHomeViewModel
@ -23,6 +25,12 @@ struct FAHomeMustSeeContentView: View {
.padding(.leading, 10)
.padding(.top, 12)
Spacer()
// Image("Frame 3013")
// .padding(.top, 14)
// .padding(.trailing, 10)
// .onTapGesture {
// self.viewModel.pushMustSee(moduleKey)
// }
}
VStack(spacing: 11) {

View File

@ -86,7 +86,9 @@ struct FAHomeMustSeeView: View {
}
private func contentView(index: Int) -> some View {
return FAHomeMustSeeContentView(list: $viewModel.mustSeeArr[index].list, viewModel: self.viewModel)
return FAHomeMustSeeContentView(list: $viewModel.mustSeeArr[index].list,
moduleKey: viewModel.mustSeeArr[index].module_key,
viewModel: self.viewModel)
.padding(.trailing, 16)
}
}

View File

@ -0,0 +1,53 @@
//
// FAGenresCell.swift
// Fableon
//
// Created by 鸿 on 2025/10/16.
//
import UIKit
class FAGenresCell: UICollectionViewCell {
@IBOutlet weak var bgView: UIView!
@IBOutlet weak var coverImageView: FAImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var hotCountLabel: UILabel!
private lazy var smallImageViewArr: [UIView] = []
override func awakeFromNib() {
super.awakeFromNib()
coverImageView.layer.borderWidth = 3
coverImageView.layer.borderColor = UIColor.FFFFFF.cgColor
for i in 0..<4 {
let imageView = createSmallCoverImageView()
contentView.addSubview(imageView)
imageView.snp.makeConstraints { make in
make.bottom.equalToSuperview()
make.width.height.equalTo(34)
make.right.equalToSuperview().offset(-(24 + i * 23))
}
smallImageViewArr.append(imageView)
}
}
private func createSmallCoverImageView() -> UIImageView {
let imageView = FAImageView()
imageView.layer.cornerRadius = 17
imageView.layer.masksToBounds = true
imageView.layer.borderWidth = 1
imageView.layer.borderColor = UIColor.CEE_2_F_5.cgColor
return imageView
}
}

View File

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="FAGenresCell" customModule="Fableon" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="413" height="153"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="413" height="153"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="T3X-Bw-MIB">
<rect key="frame" x="0.0" y="40" width="413" height="106"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LbS-0P-tAf">
<rect key="frame" x="152" y="15" width="50" height="24"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="20"/>
<color key="textColor" name="#FFFFFF"/>
<nil key="highlightedColor"/>
</label>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Frame 3014" translatesAutoresizingMaskIntoConstraints="NO" id="hqB-yr-uhy">
<rect key="frame" x="372" y="19" width="16" height="16"/>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon_火" translatesAutoresizingMaskIntoConstraints="NO" id="dr5-yQ-gX9">
<rect key="frame" x="152" y="48" width="9" height="9.3333333333333357"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JZp-LI-PlL">
<rect key="frame" x="162" y="46.666666666666671" width="27" height="12"/>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="10"/>
<color key="textColor" name="#FFFFFF"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" name="#5CA8FF_0.5"/>
<constraints>
<constraint firstItem="LbS-0P-tAf" firstAttribute="leading" secondItem="T3X-Bw-MIB" secondAttribute="leading" constant="152" id="Nrm-d1-SY5"/>
<constraint firstItem="dr5-yQ-gX9" firstAttribute="top" secondItem="LbS-0P-tAf" secondAttribute="bottom" constant="9" id="PFQ-Cy-rgv"/>
<constraint firstItem="JZp-LI-PlL" firstAttribute="centerY" secondItem="dr5-yQ-gX9" secondAttribute="centerY" id="Rx2-sn-DTb"/>
<constraint firstItem="dr5-yQ-gX9" firstAttribute="leading" secondItem="LbS-0P-tAf" secondAttribute="leading" id="i4k-zs-CdI"/>
<constraint firstItem="JZp-LI-PlL" firstAttribute="leading" secondItem="dr5-yQ-gX9" secondAttribute="trailing" constant="1" id="jH5-jE-fIE"/>
<constraint firstItem="hqB-yr-uhy" firstAttribute="centerY" secondItem="LbS-0P-tAf" secondAttribute="centerY" id="llL-b1-yDx"/>
<constraint firstAttribute="trailing" secondItem="hqB-yr-uhy" secondAttribute="trailing" constant="25" id="p5x-Kl-yiW"/>
<constraint firstItem="LbS-0P-tAf" firstAttribute="top" secondItem="T3X-Bw-MIB" secondAttribute="top" constant="15" id="ty5-31-WUP"/>
<constraint firstAttribute="height" constant="106" id="zSV-U3-XZ2"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="13"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
</userDefinedRuntimeAttributes>
</view>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="wHQ-zC-Ekt" customClass="FAImageView" customModule="Fableon" customModuleProvider="target">
<rect key="frame" x="25" y="0.0" width="96" height="125"/>
<constraints>
<constraint firstAttribute="width" constant="96" id="BEO-gx-JNt"/>
<constraint firstAttribute="height" constant="125" id="nwn-Av-SSD"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="10"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</imageView>
</subviews>
</view>
<viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/>
<constraints>
<constraint firstItem="wHQ-zC-Ekt" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="1tb-bS-p63"/>
<constraint firstItem="wHQ-zC-Ekt" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="25" id="9H9-bt-Bez"/>
<constraint firstAttribute="bottom" secondItem="T3X-Bw-MIB" secondAttribute="bottom" constant="7" id="Ckw-RZ-eod"/>
<constraint firstItem="T3X-Bw-MIB" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="X3G-8K-Lge"/>
<constraint firstAttribute="trailing" secondItem="T3X-Bw-MIB" secondAttribute="trailing" id="ZIq-Pi-rAC"/>
</constraints>
<size key="customSize" width="413" height="153"/>
<connections>
<outlet property="bgView" destination="T3X-Bw-MIB" id="6LA-r0-Pm1"/>
<outlet property="coverImageView" destination="wHQ-zC-Ekt" id="5oi-3V-uYl"/>
<outlet property="hotCountLabel" destination="JZp-LI-PlL" id="qPk-3g-2vp"/>
<outlet property="nameLabel" destination="LbS-0P-tAf" id="MiT-7A-RUM"/>
</connections>
<point key="canvasLocation" x="416.03053435114504" y="77.112676056338032"/>
</collectionViewCell>
</objects>
<resources>
<image name="Frame 3014" width="16" height="16"/>
<image name="icon_火" width="9" height="9.3333330154418945"/>
<namedColor name="#5CA8FF_0.5">
<color red="0.36078431372549019" green="0.6588235294117647" blue="1" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<namedColor name="#FFFFFF">
<color red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
</resources>
</document>

View File

@ -0,0 +1,17 @@
//
// FAGenresListCell.swift
// Fableon
//
// Created by 鸿 on 2025/10/16.
//
import UIKit
class FAGenresListCell: UICollectionViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="FAGenresListCell" customModule="Fableon" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="229" height="312"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="229" height="312"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="utm-U3-G8N" customClass="FAImageView" customModule="Fableon" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="229" height="271"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="6"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7Si-zr-lN5">
<rect key="frame" x="0.0" y="278" width="31" height="14.333333333333314"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" name="#FFFFFF"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</view>
<viewLayoutGuide key="safeArea" id="ZTg-uK-7eu"/>
<constraints>
<constraint firstItem="utm-U3-G8N" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="98u-Kk-pCp"/>
<constraint firstItem="utm-U3-G8N" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="PB0-C5-REN"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="7Si-zr-lN5" secondAttribute="trailing" id="a09-yq-Qk2"/>
<constraint firstAttribute="trailing" secondItem="utm-U3-G8N" secondAttribute="trailing" id="hye-Zu-8CL"/>
<constraint firstItem="7Si-zr-lN5" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="jdV-h0-WJe"/>
<constraint firstAttribute="bottom" secondItem="utm-U3-G8N" secondAttribute="bottom" constant="41" id="rdd-F2-IN5"/>
<constraint firstItem="7Si-zr-lN5" firstAttribute="top" secondItem="utm-U3-G8N" secondAttribute="bottom" constant="7" id="z5d-BM-XIT"/>
</constraints>
<size key="customSize" width="229" height="312"/>
<point key="canvasLocation" x="275.57251908396944" y="133.80281690140845"/>
</collectionViewCell>
</objects>
<resources>
<namedColor name="#FFFFFF">
<color red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
</resources>
</document>

View File

@ -125,4 +125,10 @@ extension FAHomeViewModel {
FATool.topViewController?.navigationController?.pushViewController(vc, animated: true)
}
func pushMustSee(_ key: FAHomeModuleItem.ModuleKey?) {
debugLog("\(key?.rawValue)")
let vc = FAGenresViewController()
FATool.topViewController?.navigationController?.pushViewController(vc, animated: true)
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.500",
"blue" : "0xFF",
"green" : "0xA8",
"red" : "0x5C"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.500",
"blue" : "0xFF",
"green" : "0x83",
"red" : "0xA7"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF5",
"green" : "0xE2",
"red" : "0xCE"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.500",
"blue" : "0x72",
"green" : "0xB0",
"red" : "0xFC"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.500",
"blue" : "0xCA",
"green" : "0x8C",
"red" : "0xFE"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "0.500",
"blue" : "0x77",
"green" : "0x59",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame 3012@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame 3012@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Frame 3013@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Frame 3013@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "icon_火@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "icon_火@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

View File

@ -17,3 +17,4 @@
"Setting" = "Setting";
"Settings" = "Settings";
"Last WatchEp.##" = "Last WatchEp.##";
"Genres" = "Genres";