我有一个包含多个部分的UICollectionView。每个部分都有一个HeaderView(类型为UICollectionReusableView)和多个单元格(类型为UICollectionViewCell)。
每个标题都有一个隐藏/显示单元格的隐藏/显示按钮。在任何时候,即使标题下的所有单元格都被折叠/隐藏,标题也不会被隐藏。
+------------------------+
| A Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
| -----------------------|
| B Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
| |
+------------------------+
如果单击“A Header”的“隐藏”按钮,设计将如下所示:
+------------------------+
| A Header [SHOW] |
| -----------------------|
| B Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
+------------------------+
我读过有关Accordion Menu的信息,但它似乎与TableView一起使用。 Making Simple Accordion TableView in swift?
我还尝试重新加载0个单元格以复制隐藏行为
public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
isFirstHidden = true
collectionView.performBatchUpdates({
let indexSet = IndexSet(integer: 0)
collectionView.collectionViewLayout.invalidateLayout()
collectionView.reloadSections(indexSet)
}, completion: nil)
}
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if (section == 1 && isFirstHidden) {
return 0;
}
return 4;
}
但我仍然得到NSInternalInconsistencyException - 无效更新:第1部分中的项目数无效。
您能否给我任何指示或分享文档的链接,这将有助于我了解细胞崩溃行为的工作原理。
编辑: 我想要实现的另一个例子。
+------------------------+
| A Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
| -----------------------|
| B Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
| -----------------------|
| C Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
| |
+------------------------+
如果单击标题B的隐藏按钮 -
+------------------------+
| A Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
| -----------------------|
| B Header [SHOW] |
| -----------------------|
| C Header [HIDE] |
| [Cell A] [Cell B] |
| [Cell c] [Cell D] |
| |
+------------------------+
答案 0 :(得分:0)
您必须添加数据源方法。在该方法中,您可以设计页眉或页脚视图。
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
case UICollectionElementKindSectionHeader:
let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Header", forIndexPath: indexPath) as! UICollectionReusableView
let headerBtn = UIButton()
headerBtn.addTarget(self, action:#selector(headerBtnTapped), for: .touchUpInside)
self.view.addSubview(headerBtn)
return headerView
case UICollectionElementKindSectionFooter:
let footerView = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "Footer", forIndexPath: indexPath) as! UICollectionReusableView
return footerView
default:
assert(false, "Unexpected element kind")
}
}
在标题视图中,headerBtnTapped
方法将在headerView上按下headerBtn后调用。因此,您可以在numberOfItemsInSection
方法中切换数组或内容(在headerBtnTapped
上返回)并重新加载。