138 lines
4.6 KiB
Swift
138 lines
4.6 KiB
Swift
//
|
||
// EncounterAICardAlbumView.swift
|
||
// Crush
|
||
//
|
||
// Created by Leon on 2025/9/11.
|
||
//
|
||
import UIKit
|
||
|
||
class EncounterAICardAlbumView: UIView {
|
||
var cv: UICollectionView!
|
||
var layout: UICollectionViewFlowLayout!
|
||
|
||
// 数据源
|
||
var card: MeetCard?
|
||
private var albumItems: [AlbumPhotoItem] = []
|
||
|
||
override init(frame: CGRect) {
|
||
super.init(frame: frame)
|
||
setupViews()
|
||
}
|
||
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
|
||
private func setupViews() {
|
||
//backgroundColor = .random
|
||
|
||
let cardWidth = UIScreen.width - 12 * 2
|
||
let itemW = floor((cardWidth - 24 * 2 - 16) * 0.5) as CGFloat
|
||
let itemH = itemW
|
||
|
||
layout = UICollectionViewFlowLayout()
|
||
layout.itemSize = CGSize(width: itemW, height: itemH)
|
||
layout.minimumLineSpacing = 16
|
||
layout.minimumInteritemSpacing = 16
|
||
layout.sectionInset = UIEdgeInsets(top: 12, left: 24, bottom: 12 + UIWindow.safeAreaBottom, right: 24)
|
||
|
||
cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
|
||
cv.backgroundColor = .clear
|
||
cv.showsHorizontalScrollIndicator = false
|
||
cv.showsVerticalScrollIndicator = false
|
||
cv.register(RoleHomeAlbumGridCell.self, forCellWithReuseIdentifier: "RoleHomeAlbumGridCell")
|
||
cv.delegate = self
|
||
cv.dataSource = self
|
||
cv.isScrollEnabled = false
|
||
addSubview(cv)
|
||
|
||
cv.snp.makeConstraints { make in
|
||
make.edges.equalToSuperview()
|
||
make.height.equalTo(764) // Temp height!
|
||
}
|
||
}
|
||
|
||
// MARK: - Public Methods
|
||
func configCard(card: MeetCard?){
|
||
self.card = card
|
||
}
|
||
|
||
func config(_ albumItems: [AlbumPhotoItem]) {
|
||
|
||
self.albumItems = albumItems
|
||
cv.reloadData()
|
||
|
||
// 计算动态高度
|
||
let cardWidth = UIScreen.width - 12 * 2
|
||
let itemW = floor((cardWidth - 24 * 2 - 16) * 0.5) as CGFloat
|
||
let itemH = itemW
|
||
|
||
let itemsPerRow = 2 // 每行2个item
|
||
let lineSpacing: CGFloat = 16
|
||
let topInset: CGFloat = 12
|
||
let bottomInset: CGFloat = 12 + UIWindow.safeAreaBottom
|
||
|
||
var calculatedHeight: CGFloat
|
||
|
||
if albumItems.count > 0 {
|
||
// 有图片时,根据实际数量计算行数
|
||
let rowCount = ceil(CGFloat(albumItems.count) / CGFloat(itemsPerRow))
|
||
calculatedHeight = topInset + (rowCount * itemH) + ((rowCount - 1) * lineSpacing) + bottomInset
|
||
} else {
|
||
// 无图片时,留足两行cell高度给占位图
|
||
let emptyRowCount: CGFloat = 2
|
||
calculatedHeight = topInset + (emptyRowCount * itemH) + ((emptyRowCount - 1) * lineSpacing) + bottomInset
|
||
}
|
||
|
||
// 更新collectionView的高度约束
|
||
cv.snp.updateConstraints { make in
|
||
make.height.equalTo(calculatedHeight)
|
||
}
|
||
|
||
if albumItems.count > 0{
|
||
hideEmpty()
|
||
}else{
|
||
showEmpty(text: "No photos")
|
||
}
|
||
}
|
||
}
|
||
|
||
extension EncounterAICardAlbumView: UICollectionViewDelegate, UICollectionViewDataSource {
|
||
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
||
return albumItems.count
|
||
}
|
||
|
||
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
||
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "RoleHomeAlbumGridCell", for: indexPath) as! RoleHomeAlbumGridCell
|
||
cell.usedInMeetCard = true
|
||
let albumItem = albumItems[indexPath.item]
|
||
cell.config(data: albumItem)
|
||
return cell
|
||
}
|
||
|
||
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
||
print("did Select Meet album ItemAt \(indexPath)")
|
||
guard let aiId = card?.aiId else {return}
|
||
|
||
var photoModels = [PhotoBrowserModel]()
|
||
|
||
for (index, per) in albumItems.enumerated() {
|
||
let perAlbum = per
|
||
|
||
let model = PhotoBrowserModel()
|
||
model.aiAlbum = perAlbum
|
||
model.aiId = aiId
|
||
model.imageUrl = perAlbum.getImgUrl()
|
||
if index == indexPath.item{
|
||
if let cell = collectionView.cellForItem(at: indexPath) as? RoleHomeAlbumGridCell{
|
||
model.image = cell.imageView.image
|
||
model.sourceRect = cell.screenRect ?? .zero
|
||
}
|
||
}
|
||
photoModels.append(model)
|
||
}
|
||
|
||
ImageBrowser.show(models: photoModels, index: indexPath.item, type: .roleOthersInAlbum)
|
||
}
|
||
}
|