Expand cell when tapped in Swift

后端 未结 5 1116
南方客
南方客 2020-12-13 01:14

I have been trying to implement a feature in my app so that when a user taps a cell in my table view, the cell expands downwards to reveal notes. I have found plenty of exam

5条回答
  •  醉话见心
    2020-12-13 01:30

    I suggest solving this with modyfing height layout constraint

    class ExpandableCell: UITableViewCell {
    
    @IBOutlet weak var img: UIImageView!
    
    
    @IBOutlet weak var imgHeightConstraint: NSLayoutConstraint!
    
    
    var isExpanded:Bool = false
        {
        didSet
        {
            if !isExpanded {
                self.imgHeightConstraint.constant = 0.0
    
            } else {
                self.imgHeightConstraint.constant = 128.0
            }
        }
    }
    
    }
    

    Then, inside ViewController:

    class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.delegate = self
        self.tableView.dataSource = self
        self.tableView.estimatedRowHeight = 2.0
        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.tableFooterView = UIView()
    }
    
    
    // TableView DataSource methods
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:ExpandableCell = tableView.dequeueReusableCell(withIdentifier: "ExpandableCell") as! ExpandableCell
        cell.img.image = UIImage(named: indexPath.row.description)
        cell.isExpanded = false
        return cell
    }
    
    // TableView Delegate methods
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
        guard let cell = tableView.cellForRow(at: indexPath) as? ExpandableCell
            else { return }
    
            UIView.animate(withDuration: 0.3, animations: {
                tableView.beginUpdates()
                cell.isExpanded = !cell.isExpanded
                tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true)
                tableView.endUpdates()
    
            })
    
        }
    
    
    
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        guard let cell = tableView.cellForRow(at: indexPath) as? ExpandableCell
            else { return }
        UIView.animate(withDuration: 0.3, animations: {
            tableView.beginUpdates()
            cell.isExpanded = false
            tableView.endUpdates()
        })
    }
    }
    

    Full tutorial available here

提交回复
热议问题