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()
}
}
讨论
我已经尝试将 setNeedsLayout()
添加到单元格、单元格的内容视图、table 视图或文本视图中,几乎在每个地方,无济于事。
我从头开始重建故事板中的整个视图,同样的事情。
我尝试创建一个基本上只有上面代码的基本项目,并且大小调整工作正常。
我已经排除了大量其他变量是罪魁祸首(例如,table视图在容器视图中,但没有它行为仍然存在)。
最后一个奇怪的地方是 有时 如果我将笔记单元格滚动到屏幕外,离开页面,然后再次返回,一切看起来都应该如此。单元格已完全调整大小并且一切都可见。但是,一旦文本视图转到下一行,问题就会恢复,这次所有先前的文本都可见,但附加文本的 none。
如果有人对我下一步可能尝试的内容有任何想法,那将非常有帮助。谢谢!
感谢 Steve 要求提供一个展示该行为的示例项目,我才能够找出导致此问题的原因。
为了获得圆角效果,我一直在单元格上使用图层蒙版。掩码使用单元格的边界来计算其路径,因此当单元格更新自身以反映文本视图的高度时,掩码仍然存在并覆盖了单元格的其余部分。
我没听懂,因为舍入实现在扩展中被抽象掉了。哎呀!
问题
我在自定义 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()
}
}
讨论
我已经尝试将
setNeedsLayout()
添加到单元格、单元格的内容视图、table 视图或文本视图中,几乎在每个地方,无济于事。我从头开始重建故事板中的整个视图,同样的事情。
我尝试创建一个基本上只有上面代码的基本项目,并且大小调整工作正常。
我已经排除了大量其他变量是罪魁祸首(例如,table视图在容器视图中,但没有它行为仍然存在)。
最后一个奇怪的地方是 有时 如果我将笔记单元格滚动到屏幕外,离开页面,然后再次返回,一切看起来都应该如此。单元格已完全调整大小并且一切都可见。但是,一旦文本视图转到下一行,问题就会恢复,这次所有先前的文本都可见,但附加文本的 none。
如果有人对我下一步可能尝试的内容有任何想法,那将非常有帮助。谢谢!
感谢 Steve 要求提供一个展示该行为的示例项目,我才能够找出导致此问题的原因。
为了获得圆角效果,我一直在单元格上使用图层蒙版。掩码使用单元格的边界来计算其路径,因此当单元格更新自身以反映文本视图的高度时,掩码仍然存在并覆盖了单元格的其余部分。
我没听懂,因为舍入实现在扩展中被抽象掉了。哎呀!