簡體   English   中英

為什么單元格顯示溢出 Swift 中的表格視圖

[英]Why cell is display overflow the table view in Swift

我試圖在幾天內找到解決方案。 但是,網上的答案都不適合我的情況。 我已經修復了在表格視圖中將單元格設置為 cliptobounds 並分配約束來修復表格 position 和高度。 以下是我的代碼的一部分。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    
    if hiddenRow.contains(indexPath.row) || hiddenRow2.contains(indexPath.row){
        rowHeight.append(300)
        return 300 //Expanded
    }
    else{
        rowHeight.append(120)
        return 120 //Not Expanded
    }
    
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "med_reusable_cell", for: indexPath as IndexPath) as! MedListTableViewCell
    
    cell.backgroundColor = TRANSPARENT
    cell.layer.cornerRadius = DEFAULT_CORNER_RADIUS
    
    active_table_height.constant = self.view.frame.size.height * 11/36
    expired_table_height.constant = self.view.frame.size.height * 11/36

單元格溢出

我的代碼和其他代碼的不同之處在於

  1. 這是一個可消耗的視圖單元格,其高度將根據單元格是否被消耗而改變
  2. 我為兩個表格使用了一個可重復使用的單元格。

希望能得到一些關於如何解決這個問題的想法。 先謝謝了。

您可以通過向每個單元格添加 header 來實現此目的,然后當您單擊它時,使用打開的單元格重新加載表格視圖,看看這個例子:

數據模型

struct  DataItem {
    var isExpand: Bool
    var title: String
    var value:String
    
    
    init(isExpand:Bool = false, title:String, value:String) {

        self.isExpand = isExpand
        self.title = title
        self.value = value
    }
}

自定義 Header女巫將監聽事件:

protocol CustomHeaderViewDelegate: AnyObject {
    func headerViewTap(_ section: Int)
}

class CustomHeaderView: UITableViewHeaderFooterView {
    
    weak var delegate: CustomHeaderViewDelegate?
    var sectionNumber: Int?
            
     required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let gesture = UITapGestureRecognizer(target: self, action: #selector(CustomHeaderView.tableViewSectionTapped(_:)))
        self.addGestureRecognizer(gesture)
    }

    @objc func tableViewSectionTapped(_ gesture: UIGestureRecognizer) {
        if let sectionNumber =  sectionNumber{
            delegate?.headerViewTap(sectionNumber)
        }
    }
}

TableView 和自定義 Header 代表

extension ViewController :  UITableViewDelegate, UITableViewDataSource{
    //The number of sections fits the number of cells, the current list is an array of DataObject, holding a title and a content.
    func numberOfSections(in tableView: UITableView) -> Int {
        return self.currentList.count
    }
    //Each section(group of cells) contains one row
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell
        return cell
    }
    
    //update heights for row if the header has been taped
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let isExpanded = self.currentList[indexPath.section].isExpand
        if isExpanded {
            return UITableView.automaticDimension
        }
        return 0
    }
    //update the estimatedHeightForRowAt if the hader has been taped
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        let isExpanded = self.currentList[indexPath.section].isExpand
        if isExpanded{
            return UITableView.automaticDimension
        }
        return 0
    }
    
    //returns a custom header
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "Header") as! CustomHeaderView
        return headerView
    }
}

extension ViewController : CustomeHeaderViewDelegate{
    func headerViewTap(_ section: Int) {
        selectedItem = self.currentList[section]
        let output = self.currentList.map({ (item:DataItem) -> DataItem in
            var result = item
            if result.title == self.selectedItem?.title{
                result.isExpand = !result.isExpand
            }
            return result
        })
        self.currentList = output
        self.tableView.reloadSections(IndexSet(integer: section), with: UITableView.RowAnimation.automatic)
        self.tableView.endUpdates()
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM