gpt4 book ai didi

ios - 使用自定义 UICollectionViewLayout 的 UICollectionView 中的部分标题

转载 作者:IT王子 更新时间:2023-10-29 05:19:25 24 4
gpt4 key购买 nike

我正在使用自定义布局处理 UICollectionView。这两天我无法理解如何将 header 添加到 UICollectionView。我有非常简单的 View Controller (在具有自定义布局的 Storyboard中创建):

class ACollectionViewController: UICollectionViewController {

enum Identifiers: String {
case CellIdentifier = "Cell"
case HeaderIdentifier = "Header"
}

override func viewDidLoad() {
super.viewDidLoad()
self.collectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: Identifiers.HeaderIdentifier.rawValue)
}

// MARK: UICollectionViewDataSource
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.CellIdentifier.rawValue, forIndexPath: indexPath) as Cell
cell.backgroundColor = UIColor.redColor()
return cell
}

override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
println("ip = \(indexPath.item)")
var supplementaryView = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView
supplementaryView.backgroundColor = UIColor.blueColor()
return supplementaryView
}

这是我的自定义布局:

class ALayout: UICollectionViewLayout {

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

override func collectionViewContentSize() -> CGSize {
return self.collectionView!.bounds.size
}

let itemWidth = 40
override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! {
var attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)

let x: Float = Float(10) * Float(indexPath.item)
let y: Float = Float(indexPath.item * itemWidth)
attributes.frame = CGRect(x: CGFloat(x), y: CGFloat(y), width: CGFloat(itemWidth), height: CGFloat(itemWidth))

return attributes
}

override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
var attributes = [UICollectionViewLayoutAttributes]()

let sectionsCount = self.collectionView!.dataSource!.numberOfSectionsInCollectionView!(self.collectionView!)
for section in 0..<sectionsCount {
/// add header
attributes.append(self.layoutAttributesForSupplementaryViewOfKind(UICollectionElementKindSectionHeader, atIndexPath: NSIndexPath(forItem: 0, inSection: section)))

let itemsCount = self.collectionView!.numberOfItemsInSection(section)
for item in 0..<itemsCount {
let indexPath = NSIndexPath(forItem: item, inSection: section)
attributes.append(self.layoutAttributesForItemAtIndexPath(indexPath))
}
}

return attributes
}

override func layoutAttributesForSupplementaryViewOfKind(elementKind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes! {
var attributes = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: elementKind, withIndexPath: indexPath)
attributes.frame = CGRect(x: 0, y: 0, width: 320, height: 50)

return attributes
}
}

问题是我不明白如何正确添加节标题,这个标题的 indexPath 应该是什么。添加标题的代码中有注释。应用程序在启动时崩溃并出现错误

2014-10-21 13:06:22.793 UICollectionViewLayout-Demo[3805:95924] *** Terminating app due to 
uncaught exception 'NSInternalInconsistencyException', reason: 'could not dequeue a view of
kind: UICollectionElementKindCell with identifier Header - must register a nib or a class for
the identifier or connect a prototype cell in a storyboard'

我明白,这是因为单元格具有与我要添加的节标题相同的 indexPath,但标题的 indexPath 应该是什么?或者也许我做的完全错了?

提前谢谢你。

最佳答案

你的崩溃是因为你正在使用

var supplementaryView = collectionView.dequeueReusableCellWithReuseIdentifier(Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView

尝试使页眉和页脚出队(在 collectionView:viewForSupplementaryElementOfKind 中)。将其更改为

var supplementaryView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier:Identifiers.HeaderIdentifier.rawValue, forIndexPath: indexPath) as UICollectionReusableView

应该摆脱崩溃,所以你可以调查 indexPath。但在我的测试中,indexPath 始终只是“0”。

关于ios - 使用自定义 UICollectionViewLayout 的 UICollectionView 中的部分标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26485349/

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