gpt4 book ai didi

ios - 具有多个 CollectionViewLayout 的单个 CollectionView。为什么布局困惑?

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:46 25 4
gpt4 key购买 nike

我有一个 UICollectionView ,我想动态应用两个不同的布局。

  1. UICollectionViewFlowLayout:具有相同大小的单元格和圆形图像的布局。

    var flowLayout: UICollectionViewFlowLayout {
    let flowLayout = UICollectionViewFlowLayout()

    flowLayout.itemSize = CGSize(width: UIScreen.main.bounds.width/3, height: 140)
    flowLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)
    flowLayout.scrollDirection = UICollectionViewScrollDirection.vertical
    flowLayout.minimumInteritemSpacing = 0.0

    return flowLayout
    }
  2. Pintrest 布局: https://www.raywenderlich.com/392-uicollectionview-custom-layout-tutorial-pinterest

例如:当用户单击配置文件按钮时,将应用 FlowLayout,并且单元格会以圆形显示图像。当用户单击图片按钮时,将应用 pintrest 布局,并且单元格会显示为具有动态高度的矩形图像。

enter image description here

最初 CollectionView 有 1.flowLayout,它看起来很完美。但是当我点击 Picture 按钮时,Pintrest 布局与之前的布局混淆了,如上图所示。

以下是更改布局的代码。

if isGrid {
let horizontal = flowLayout
recentCollectionView.setCollectionViewLayout(horizontal, animated: true)
recentCollectionView.reloadData()
}
else {
let horizontal = PinterestLayout()
horizontal.delegate = self
recentCollectionView.setCollectionViewLayout(horizontal, animated: true)
recentCollectionView.reloadData()
}

ViewHiarchy:

我有包含标题和一个底部单元格的主 Collection View 。单元格包含我正在应用多个布局的其他 Collection View 。每个布局都有两个不同的单元格。我希望底部单元格大小等于内容 Collection View 内容大小,以便用户可以垂直滚动整个主 Collection View 。

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var cell : UICollectionViewCell!

switch isGrid {
case true:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SearchProfileCell", for: indexPath)
if let annotateCell = cell as? SearchProfileCell {
annotateCell.photo = photos[indexPath.item]
}
case false:
cell = collectionView.dequeueReusableCell(withReuseIdentifier: "AnnotatedPhotoCell", for: indexPath)

if let annotateCell = cell as? AnnotatedPhotoCell {
annotateCell.cellwidth = collectionView.contentSize.width/3
annotateCell.photo = photos[indexPath.item]

}
}

cell.contentView.layer.cornerRadius = 0
return cell
}

个人资料和图片按钮 Action 代码。

@IBAction func pictureClick(sender:UIButton) {
isGrid = false
self.searchCollectionView.reloadData()
}

@IBAction func profilClick(sender:UIButton) {
isGrid = true
self.searchCollectionView.reloadData()
}

最佳答案

我认为问题不在布局内部,而可能在 cellForItemAt 内部。如果您为两种布局使用不同的单元格,则不要在 cellForItemAt 方法中比较 bool。你应该比较布局类类型像下面的代码:

 func  collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if collectionView.collectionViewLayout.isKind(of: PinterestLayout.self) {
// return cell for PinterestLayout
guard let annotateCell = collectionView.dequeueReusableCell(withReuseIdentifier: "SearchProfileCell", for: indexPath) as? SearchProfileCell else {
fatalError("SearchProfileCell Not Found")
}
annotateCell.photo = photos[indexPath.item]
return annotateCell
} else {
// return cell for flowLayout
guard let annotateCell = collectionView.dequeueReusableCell(withReuseIdentifier: "AnnotatedPhotoCell", for: indexPath) as? AnnotatedPhotoCell else {
fatalError("AnnotatedPhotoCell Not Found")
}
annotateCell.cellwidth = collectionView.contentSize.width/3
annotateCell.photo = photos[indexPath.item]
return annotateCell
}
}

还需要更新布局更改操作方法,例如:

     @IBAction func pictureClick(sender:UIButton) {
isGrid = false

self.collectionView?.collectionViewLayout.invalidateLayout()
self.collectionView?.setCollectionViewLayout(PinterestLayout(),
animated: false, completion: { [weak self] (complite) in
guard let strongSelf = self else {
return
}
strongSelf.searchCollectionView?.reloadData()
})
}

@IBAction func profilClick(sender:UIButton) {
isGrid = true
self.collectionView?.collectionViewLayout.invalidateLayout()
self.collectionView?.setCollectionViewLayout(flowLayout,
animated: false, completion: { [weak self] (complite) in
guard let strongSelf = self else {
return
}
strongSelf.searchCollectionView?.reloadData()
})
}

关于ios - 具有多个 CollectionViewLayout 的单个 CollectionView。为什么布局困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53274380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com