gpt4 book ai didi

ios - cellForItemAt 在 Swift collectionView 中只调用一次

转载 作者:行者123 更新时间:2023-11-28 11:36:28 26 4
gpt4 key购买 nike

如果我将流式布局与 collectionView 一起使用,那么我的所有单元格都对数据可见。如果我使用自定义布局,则仅针对索引 (0,0) 访问 cellForItemAt,并且相应地仅显示单个单元格。

我很困惑为什么 - 请帮忙!

下面的最小示例:

View Controller :

import UIKit
private let reuseIdentifier = "customCell"

class customCollectionViewController: UICollectionViewController {

@IBOutlet var customCollectionView: UICollectionView!


let dwarfArray = ["dopey", "sneezy", "bashful", "grumpy", "doc", "happy", "sleepy"]


override func viewDidLoad() {
super.viewDidLoad()
}

override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dwarfArray.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! customCollectionViewCell

let cellContentsIndex = indexPath.row
if cellContentsIndex <= dwarfArray.count
{
cell.displayContent(name: dwarfArray[cellContentsIndex])
}

return cell
}

自定义单元格

import UIKit
class customCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var nameLabel: UILabel!

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}

override init(frame: CGRect){
super.init(frame: frame)
}

public func displayContent(name: String){
nameLabel.text = name

}

func setup(){
self.layer.borderWidth = 1.0
self.layer.borderColor = UIColor.black.cgColor
}}

自定义布局如果这不在这里 - 我可以看到我期望的所有单元格(尽管没有我喜欢的布局)。当我使用它时,我只看到一个单元格。

import UIKit
class customCollectionViewLayout: UICollectionViewLayout {
let CELL_SIZE = 100.0

var cellAttrsDictionary = Dictionary<NSIndexPath, UICollectionViewLayoutAttributes>()
//define the size of the area the user can move around in within the collection view
var contentSize = CGSize.zero

var dataSourceDidUpdate = true

func collectionViewContentSize() -> CGSize{
return self.contentSize
}

override func prepare() {
if (collectionView?.numberOfItems(inSection: 0))! > 0 {
/// cycle through each item of the section
for item in 0...(collectionView?.numberOfItems(inSection: 0))!-1{
/// build the collection attributes
let cellIndex = NSIndexPath(item: item, section: 0)
let xPos = Double(item)*CELL_SIZE
let yPos = 40.0

let cellAttributes = UICollectionViewLayoutAttributes(forCellWith: cellIndex as IndexPath)
cellAttributes.frame = CGRect(x: xPos, y:yPos, width: CELL_SIZE, height: CELL_SIZE)
// cellAttributes.frame = CGRect(x: xPos, y:yPos, width: CELL_WIDTH + 2*CELL_SPACING, height: CELL_HEIGHT)
cellAttributes.zIndex = 1

//save
cellAttrsDictionary[cellIndex] = cellAttributes
}
}
}

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
/// create array to hold all the elements in our current view
var attributesInRTect = [UICollectionViewLayoutAttributes]()

/// check each element to see if they should be returned
for cellAttributes in cellAttrsDictionary.values {
if rect.intersects(cellAttributes.frame)
{
attributesInRTect.append(cellAttributes)
}
}

return attributesInRTect
}

override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
return cellAttrsDictionary[indexPath as NSIndexPath]!
}

override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}}

输出

I wanted all 7 dwarves!

最佳答案

问题出在 contentSize 值上

 func collectionViewContentSize() -> CGSize{
return self.contentSize
}

只需将 func collectionViewContentSize()... 替换成这样:

    func lastLayoutAttributes() -> UICollectionViewLayoutAttributes? {
return cellAttrsDictionary.values.map { $0 }.sorted(by: { $0.frame.maxX < $1.frame.maxX }).last
}

override var collectionViewContentSize: CGSize {
guard let collectionView = collectionView else { return .zero }
guard collectionView.frame != .zero else { return .zero }

let width: CGFloat
let height: CGFloat = collectionView.frame.height

if let lastLayoutAttributes = lastLayoutAttributes() {
width = lastLayoutAttributes.frame.maxX
} else {
width = 0
}

return CGSize(width: width, height: height)
}

而且您会看到不止一个单元格。

关于ios - cellForItemAt 在 Swift collectionView 中只调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55223333/

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