UITableViewCell 中的 UITextView - 高度调整正确但单元格被切断

UITextView in a UITableViewCell - Height resizes correctly but cell is cut off

问题

我在自定义 UITableViewCell 子类中有一个 UITextView,它产生了一些奇怪的行为。

这是我遇到的问题的 gif(相关项目是彩色的):

高度调整正确,但未显示单元格的全部内容。 但是当我暂停执行并打印出以下帧时:

帧数全部正确!

此外,当我使用视图层次结构调试器检查视图时,那里的框架也都是正确的。不过,使用视图调试器时有一个区别,那就是我能够查看文本视图的内容。

这是我在模拟器和调试器中看到的:

在黄色停止的地方似乎有一个无关的细胞分离器。除此之外,我找不到任何类型的指标来说明为什么单元格没有扩展到超过其原始高度。

我的代码

在情节提要中,UITextView 对单元格的内容视图具有顶部、底部和尾部约束,对 UIImageView 具有垂直间距约束。 UIImageView 具有固定宽度,并且对单元格的内容视图具有前导约束。我相信我的约束设置正确。哦,是的,在 UITextView 上禁用了滚动。

至于代码,我有一个自定义协议,当注释字段发生变化时通知 table 视图控制器:

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()
    }
}

讨论

最后一个奇怪的地方是 有时 如果我将笔记单元格滚动到屏幕外,离开页面,然后再次返回,一切看起来都应该如此。单元格已完全调整大小并且一切都可见。但是,一旦文本视图转到下一行,问题就会恢复,这次所有先前的文本都可见,但附加文本的 none。

如果有人对我下一步可能尝试的内容有任何想法,那将非常有帮助。谢谢!

感谢 Steve 要求提供一个展示该行为的示例项目,我才能够找出导致此问题的原因。

为了获得圆角效果,我一直在单元格上使用图层蒙版。掩码使用单元格的边界来计算其路径,因此当单元格更新自身以反映文本视图的高度时,掩码仍然存在并覆盖了单元格的其余部分。

我没听懂,因为舍入实现在扩展中被抽象掉了。哎呀!