如何增加特定 UITableViewCell 的大小?

How to increase the size of particular UITableViewCell?

以上是我的 UITableView。我想要按下右(向下箭头)按钮时我的特定 UITableViewCell 如下图所示。

但问题是,当我按下右(向下箭头)按钮时,我收到如下警告。

2020-09-18 12:00:15.107030+0530 ET WIFI[1789:44926] [LayoutConstraints] 无法同时满足约束条件。 可能至少以下列表中的约束之一是您不想要的。 试试这个: (1)查看每个约束并尝试找出您不期望的; (2) 找到添加了不需要的约束或约束的代码并修复它。 ( “”, “”, “”, “” )

将尝试通过打破约束来恢复

在 UIViewAlertForUnsatisfiableConstraints 处创建符号断点以在调试器中捕获此问题。 中列出的 UIView 的 UIConstraintBasedLayoutDebugging 类别中的方法也可能有帮助。 下面是我的 UITableViewCell class.

class RoomTableViewCell: UITableViewCell {

@IBOutlet weak var roomIcon: UIImageView!
@IBOutlet weak var roomNameLabel: UILabel!
@IBOutlet weak var toggleButton: UIButton!

@IBOutlet var viewHeight: NSLayoutConstraint!

var viewController:HomeViewController?

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

func initializeViewController(myViewController:HomeViewController) {
    self.viewController = myViewController
}

@IBAction func toggleButtonPressed(_ sender: UIButton) {
    if toggleButton.image(for: .normal) == UIImage(named: "ArrowDownImage") {
        toggleButton.setImage(UIImage(named: "ArrowUpImage"), for: .normal)
        self.viewHeight.constant = 100
        self.viewController?.roomTableView.reloadData()
    } else {
        toggleButton.setImage(UIImage(named: "ArrowDownImage"), for: .normal)
        self.viewHeight.constant = 200
        self.viewController?.roomTableView.reloadData()
    }
}

}

现在它工作正常,但问题是当我按下右键时,我在控制台中收到以上警告消息。你能帮我解决这个问题吗?

您需要在增加视图高度时增加 tableView Cell 的高度

struct TableData {
    var height: CGFloat?
    var color: UIColor?
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    var tableData = [TableData]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        for i in 0...10{
            self.tableData.append(TableData(height: 50, color: .red))
        }
        self.tableView.reloadData()
        // Do any additional setup after loading the view.
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return self.tableData[indexPath.row].height ?? 0
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.tableData.count
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if self.tableData[indexPath.row].height == 100 {
            self.tableData[indexPath.row].color = .red
            self.tableData[indexPath.row].height = 50
            self.tableView.reloadRows(at: [indexPath], with: .automatic)
        }
        else {
            self.tableData[indexPath.row].color = .red
            self.tableData[indexPath.row].height = 100
            self.tableView.reloadRows(at: [indexPath], with: .automatic)
        }
        
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        cell!.backgroundColor = self.tableData[indexPath.row].color
        return cell!
    }

}

didselect part will come in ur button click part

不幸的是,有几种可能性。

  1. 您的单元格内部存在约束问题。我假设这是一个情节提要,并且有一个绑定到 viewHeight 并设置为 100 的约束。尝试将其设置为 200,看看情节提要中是否出现错误。如果这样做,请在此处修复它。如果你不这样做,那就继续前进。

  2. 您没有使用自动行高。检查是否在故事板中将它们设置为自动或在您的代码中。如果在您的代码中为行方法实现了高度,甚至在 table 视图上设置了行高,那么您必须在代码中修复此问题(在故事板中更改它是不够的)。

  3. 问题在优先级。这其实很常见。在其中一个步骤中,您的系统可能无法解决约束,因此它开始抱怨。它通常稍后会解决它们,但看到这些警告很烦人。在单元格中,它通常可以通过降低情节提要中的约束优先级来简单地修复。例如,我确信您可以在不破坏任何逻辑的情况下将此 viewHeight 优先级从 1000 降低到 900。在大多数情况下,我实际上降低了固定在单元格底部的约束的优先级。

与问题没有直接关系,但请在您的视图控制器上使用 weak,否则您将有保留周期和内存泄漏。应该只是:

weak var viewController: HomeViewController? 

此外,在调整单元格大小时,我们通常不会在 table 视图上调用重新加载。只需调用

就可以使它无效
self.viewHeight.constant = 200
self.viewController?.roomTableView?.beginUpdates()
self.viewController?.roomTableView?.endUpdates()