在UICollectionView中删除一个单元格后,单元格布局刷新

我创build了一个dynamic调整单元格高度的UICollectionView。 我正在调整这个单元格的大小:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let approximatedwidthoftextview = view.frame.width - 70 let size = CGSize(width: approximatedwidthoftextview, height: 1000) let attributes = [NSAttributedStringKey.font: UIFont(name: "Avenir Next", size: 18)] let estimatedFrame = NSString(string: allnotes[indexPath.row].note).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attributes, context: nil) return CGSize(width: view.frame.width, height: estimatedFrame.height + 38) 

}

当我删除一个单元格时,剩余单元格的布局会变得有点奇怪。 内容被切断。

奇怪的是,导航到先前的视图控制器,然后回到这个控制器修复单元格布局和单元格恢复正常。

任何想法这里有什么问题?

正常状态 删除一个单元格后状态

 import UIKit private let reuseIdentifier = "Cell" class AddedNotesCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout { var allnotes = [notesarray]() override func viewDidAppear(_ animated: Bool) { print(allnotes.count) } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor(red:0.15, green:0.20, blue:0.22, alpha:1.0) // Uncomment the following line to preserve selection between presentations // self.clearsSelectionOnViewWillAppear = false // Register cell classes self.collectionView!.register(AddedNotesCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of items return allnotes.count } override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { var tag = indexPath.row print(tag) } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! AddedNotesCollectionViewCell // Configure the cell cell.deleteBtn.layer.setValue(indexPath.row, forKey: "index") cell.deleteBtn.addTarget(self, action: #selector(deleteUser(sender:)), for: UIControlEvents.touchUpInside) cell.backgroundColor = allnotes[indexPath.row].prioritycolor cell.textview.text = allnotes[indexPath.row].note // Remove the button from the first cell return cell } //deleting cell func @objc func deleteUser(sender:UIButton) { let i : Int = (sender.layer.value(forKey: "index")) as! Int allnotes.remove(at: i) addedNotesArrayGlobal.addednotesarrays.remove(at: i) collectionView?.reloadData() } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() collectionView?.collectionViewLayout.invalidateLayout() } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let approximatedwidthoftextview = view.frame.width - 70 let size = CGSize(width: approximatedwidthoftextview, height: 1000) let attributes = [NSAttributedStringKey.font: UIFont(name: "Avenir Next", size: 18)] let estimatedFrame = NSString(string: allnotes[indexPath.row].note).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attributes, context: nil) return CGSize(width: view.frame.width, height: estimatedFrame.height + 32) } 

}

尽pipedynamicresize在使用上述algorithm的collectionView中运行良好,但它并不完整。 我切换到UITableView,并使用自动布局做dynamicresize。 这很简单,容易,工作得很好。