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

时间:2016-03-08 22:31:24

标签: ios uitableview autolayout uitextview

问题

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

这是我看到的问题的gif(相关项目已着色):

Self Sizing Bug

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

  • 细胞
  • Cell的内容视图
  • 文字视图

框架都是正确的!

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

以下是我在模拟器和调试器中看到的内容:

Side by side

在黄色停止的位置似乎有一个无关的细胞分离器。除此之外,我找不到任何关于为什么细胞没有扩展到其原始高度的指示器。

我的代码

在故事板中,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中,几乎在每个地方都无效。

    < / LI>
  • 我从头开始在故事板中重建整个视图,同样的事情。

  • 我尝试创建一个基本上只有上面代码的裸机项目,并且大小调整正常。

  • 我已经排除了大量其他变量作为罪魁祸首(例如,tableview在容器视图中,但行为在没有这种情况下仍然存在)。

最后一个奇怪的地方是有时如果我将笔记单元格从屏幕滚动,离开页面,然后再回来,一切看起来都应该如此。单元格已完全调整大小,一切都可见。但是,只要文本视图转到下一行,问题就会立即恢复,这次所有以前的文本都可见,但没有其他文本。

如果有人对我接下来会尝试的内容有任何想法,那将非常有帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

感谢史蒂夫要求展示行为的示例项目,我能够找出导致此问题的原因。

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

我没有抓住它,因为舍入实现是在扩展中抽象出来的。糟糕!