目前,在我的代码中,我以编程方式在*.domain.com
中添加UITextView
,并添加了根据用户输入的内容自动调整单元格大小的功能。< / p>
目前看起来像这样:
UITableViewCell
我只关心第1部分,因为这是我想要自动调整单元格高度的唯一单元格。所有其他部分应保持静态单元格高度。
我遇到的问题是,只要我在override func viewDidLoad()
{
tableView.estimatedRowHeight = 30.0
tableView.rowHeight = UITableViewAutomaticDimension
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
// Dequeue the cell to load data
let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
if indexPath.section == 0
{
// Code
}
if indexPath.section == 1
{
let textView: UITextView = UITextView()
textView.delegate = self
textView.textColor = UIColor.black
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
cell.addSubview(textView)
let leadingConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.leading, multiplier: 1.0, constant: 8.0)
let trailingConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.trailing, multiplier: 1.0, constant: -8.0)
cell.contentView.addConstraint(leadingConstraint)
cell.contentView.addConstraint(trailingConstraint)
let topConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.top, multiplier: 1.0, constant: 0)
let bottomConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.bottom, multiplier: 1.0, constant: 0)
cell.contentView.addConstraint(topConstraint)
cell.contentView.addConstraint(bottomConstraint)
}
else if indexPath.section == 2
{
// Code
}
return cell
}
override func numberOfSections(in tableView: UITableView) -> Int
{
return 3
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return 1
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
{
let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell")
let titleLabel = headerCell?.viewWithTag(1) as! UILabel
if section == 0
{
titleLabel.text = "Title"
}
else if section == 1
{
titleLabel.text = "Title"
}
else if section == 2
{
titleLabel.text = "Title"
}
return headerCell?.contentView
}
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
{
let footerCell = tableView.dequeueReusableCell(withIdentifier: "FooterCell")
return footerCell
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
if indexPath.section == 1
{
return UITableViewAutomaticDimension
}
return super.tableView(tableView, heightForRowAt: indexPath)
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return 35.0
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
return 15.0
}
func textViewDidChange(_ textView: UITextView)
{
tableView.beginUpdates()
tableView.endUpdates()
}
中第一次按回车键跳到下一行,我就会很快看到一些&#34;鬼&#34;细胞并得到警告说明:
没有重复使用表格单元格的索引路径
单元格的高度相应地动态地重新调整自身大小,并且在按下初始返回键之后,任何后续的新行都不会重新生成&#34; ghost&#34;细胞,但我仍然收到警告。
我似乎做错了什么?
由于
答案 0 :(得分:0)
TextView继承自scrollView,因此textView的内容大小可能大于frame(在这种情况下textView将滚动)。为了让tableView计算单元格的自动大小,它需要具有隐式大小的组件,如label或button。因此,为了让tableView计算textView的隐式大小,您应该禁用滚动。
textView.isScrollEnabled = false
应该允许您的细胞扩展:)
修改强>
当可重用单元格用作节标题时(例如在您的情况下)看起来会发生这种情况看看:What is the meaning of the "no index path for table cell being reused" message in iOS 6/7?
建议:
创建普通xib添加视图并将其作为节头返回 否则按照上面链接中的答案
答案 1 :(得分:0)
试试这个。 也添加此方法。 func tableView(tableView:UITableView,estimatedHeightForRowAtIndexPath indexPath:NSIndexPath) - &gt; CGFloat的
答案 2 :(得分:0)
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
if(indexPath.row == 0){
return heightForFirstRow
}
return heightForStaticCell
}