求助:自定义UITableViewCell仅显示窄水平条问题
解决自定义UITableViewCell显示窄条的问题
问题描述
我尝试创建自定义UITableViewCell,但在模拟器里只显示一条窄水平条。换更大尺寸的设备也一样,而且我已经确认outlets连接正常。
相关代码
自定义Cell代码:
import UIKit class EstimatedIncomeCell: UITableViewCell { static let identifier = "EstimatedIncomeCell" @IBOutlet weak var amountTextField: UITextField! @IBAction func buttonClicked(_ sender: Any) { } }
ViewController代码:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{ @IBOutlet weak var incomesTableView: UITableView! var amountOfIncomes = 1 override func viewDidLoad() { super.viewDidLoad() self.incomesTableView.delegate = self self.incomesTableView.dataSource = self self.registerTableViewCell() } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if let cell = incomesTableView.dequeueReusableCell(withIdentifier: "EstimatedIncomeCell") as? EstimatedIncomeCell{ return cell } return UITableViewCell() } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 2 } private func registerTableViewCell(){ let incomeCell = UINib(nibName: "EstimatedIncomeCell", bundle: nil) self.incomesTableView.register(incomeCell, forCellReuseIdentifier: "EstimatedIncomeCell") } }
解决方案
造成这个问题的核心原因是UITableView无法正确计算或获取Cell的高度,以下是几种解决方式:
1. 设置固定行高
在viewDidLoad中直接指定行高,数值根据你的Cell内容调整:
override func viewDidLoad() { super.viewDidLoad() self.incomesTableView.delegate = self self.incomesTableView.dataSource = self // 设置固定行高 incomesTableView.rowHeight = 80 self.registerTableViewCell() }
2. 启用自动行高(推荐)
如果Cell内容高度不固定,启用自动行高让TableView根据布局约束自动计算高度:
override func viewDidLoad() { super.viewDidLoad() self.incomesTableView.delegate = self self.incomesTableView.dataSource = self // 启用自动行高 incomesTableView.estimatedRowHeight = 80 // 预估高度,可根据实际调整 incomesTableView.rowHeight = UITableView.automaticDimension self.registerTableViewCell() }
3. 检查Cell的布局约束
确保自定义Cell内的控件(TextField、按钮)设置了完整的上下左右约束:
- 控件顶部与Cell的contentView顶部有间距约束
- 控件之间(比如TextField和按钮)有垂直间距约束
- 底部控件与contentView底部有间距约束
只有约束完整,AutoLayout才能正确计算出Cell的高度。
4. 排查Storyboard冲突
如果同时在Storyboard中设置了TableView的行高,可能会和代码设置冲突。建议保持代码和Storyboard设置一致,或者优先用代码控制行高。
内容的提问来源于stack exchange,提问作者NekNek
相关产品推荐
相关产品推荐

