问题
我在自定义UITableViewCell子类中有一个UITextView,它会产生一些奇怪的行为。
这是我看到的问题的gif(相关项目已着色):
高度正确调整大小,但不显示单元格的全部内容。 但是,当我暂停执行并打印出以下帧时:
框架都是正确的!
此外,当我使用视图层次结构调试器检查视图时,帧也都是正确的。使用视图调试器时有一个区别,那就是我能够查看文本视图的内容。
以下是我在模拟器和调试器中看到的内容:
在黄色停止的位置似乎有一个无关的细胞分离器。除此之外,我找不到任何关于为什么细胞没有扩展到其原始高度的指示器。
我的代码
在故事板中,UITextView具有对单元格内容视图的顶部,底部和尾部约束,以及对UIImageView的垂直间距约束。 UIImageView具有固定的宽度,并且对单元格的内容视图具有前导约束。我相信我的约束设置正确。哦是的,在UITextView上禁用了滚动。
至于代码,我有一个自定义协议,当notes字段发生变化时通知表视图控制器:
protocol AddContactCellDelegate {
func notesViewDidChange(textView: UITextView)
}
以下是我的UITableViewCell子类的相关代码:
class AddContactCell: UITableViewCell, UITextViewDelegate {
var delegate: AddContactCellDelegate?
func textViewDidChange(textView: UITextView) {
delegate?.notesViewDidChange(textView)
}
}
并从我的UITableViewController子类:
class AddContactViewController: UITableViewController, AddContactCellDelegate {
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 60.0
tableView.rowHeight = UITableViewAutomaticDimension
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let row = rows[indexPath.row]
let cell = tableView.dequeueReusableCellWithIdentifier(row.cellIdentifier, forIndexPath: indexPath) as! AddContactCell
cell.configureForRow(row)
cell.delegate = self
return cell
}
func notesViewDidChange(textView: UITextView) {
tableView.beginUpdates()
tableView.endUpdates()
}
}
讨论
我尝试将setNeedsLayout()
添加到单元格,单元格的内容视图,tableview或textview中,几乎在每个地方都无效。
我从头开始在故事板中重建整个视图,同样的事情。
我尝试创建一个基本上只有上面代码的裸机项目,并且大小调整正常。
我已经排除了大量其他变量作为罪魁祸首(例如,tableview在容器视图中,但行为在没有这种情况下仍然存在)。
最后一个奇怪的地方是有时如果我将笔记单元格从屏幕滚动,离开页面,然后再回来,一切看起来都应该如此。单元格已完全调整大小,一切都可见。但是,只要文本视图转到下一行,问题就会立即恢复,这次所有以前的文本都可见,但没有其他文本。
如果有人对我接下来会尝试的内容有任何想法,那将非常有帮助。谢谢!
答案 0 :(得分:0)
感谢史蒂夫要求展示行为的示例项目,我能够找出导致此问题的原因。
为了获得圆角效果,我一直在我的细胞上使用图层蒙版。掩码使用单元格的边界来计算其路径,因此当单元格更新自身以反映文本视图的高度时,掩码仍然存在并覆盖单元格的其余部分。
我没有抓住它,因为舍入实现是在扩展中抽象出来的。糟糕!