Cell Layout refresh after deleting one cell in UIC

2019-08-28 06:22发布

I created a UICollectionView with dynamic resizing of cell height. I am resizing the cell like this:

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)

}

When I delete one cell, the remaining cell’s layout get a bit strange. The content gets cut off.

Strangely enough, navigating to a previous viewcontroller and then coming back to this controller fixes the cell layout and cells go back to normal.

Any idea what’s wrong here?

Normal state State after deleting one cell

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)
}

}

1条回答
Explosion°爆炸
2楼-- · 2019-08-28 07:10

Even though dynamic resizing works well in collectionView using the above algorithm, it's just not complete. I switched to UITableView and used auto-layouts to do dynamic resizing. It's simple, easy and works quite well.

查看更多
登录 后发表回答