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