如果您有多个单元格需要在集合视图单元格中触摸按钮时扩展到不同的高度,那么这里是代码。
我使用委托模式来让控制器知道使用indexPath触摸了哪个单元格的按钮。创建单元时,需要将单元的索引路径传递到该单元。
当触摸按钮时,单元格将调用委托(ViewController),该代理程序将相应地更新isExpandedArray并重新加载特定的单元格。
CollectionViewCell
protocol ExpandedCellDelegate:NSObjectProtocol{ func topButtonTouched(indexPath:IndexPath)}class ExpandableCell: UICollectionViewCell { @IBOutlet weak var topButton: UIButton! weak var delegate:ExpandedCellDelegate? public var indexPath:IndexPath! @IBAction func topButtonTouched(_ sender: UIButton) { if let delegate = self.delegate{ delegate.topButtonTouched(indexPath: indexPath) } }}查看控制器类
class ViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! var expandedCellIdentifier = "ExpandableCell" var cellWidth:CGFloat{ return collectionView.frame.size.width } var expandedHeight : CGFloat = 200 var notExpandedHeight : CGFloat = 50 var dataSource = ["data0","data1","data2","data3","data4"] var isExpanded = [Bool]() override func viewDidLoad() { super.viewDidLoad() isExpanded = Array(repeating: false, count: dataSource.count) }}extension ViewController:UICollectionViewDataSource{ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return dataSource.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: expandedCellIdentifier, for: indexPath) as! ExpandableCell cell.indexPath = indexPath cell.delegate = self //configure Cell return cell }}extension ViewController:UICollectionViewDelegateFlowLayout{ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { if isExpanded[indexPath.row] == true{ return CGSize(width: cellWidth, height: expandedHeight) }else{ return CGSize(width: cellWidth, height: notExpandedHeight) } }}extension ViewController:ExpandedCellDelegate{ func topButtonTouched(indexPath: IndexPath) { isExpanded[indexPath.row] = !isExpanded[indexPath.row] UIView.animate(withDuration: 0.8, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.9, options: UIViewAnimationOptions.curveEaseInOut, animations: { self.collectionView.reloadItems(at: [indexPath]) }, completion: { success in print("success") }) }}


