我需要准确计算NSTextField的大小(因为我需要该值来计算NSTextField所在的NSTableView行的高度)。我现在有一个粗略的近似值,但它似乎是关闭的(我不想用硬编码来捏造它......)。
我的近似值包括创建一个临时单元格,向其添加适当的文本,然后根据该文本计算高度:
func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat
{
let textDistanceFromTableEdge = 192
if let cell = tableView.make(withIdentifier: "IncomingMessage", owner: nil) as? IncomingMessage
{
cell.message.stringValue = messages[row].message
let width = ((tableView.tableColumns.last?.width)! - textDistanceFromTableEdge)
let height = (cell.message.cell!.cellSize(forBounds: NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(FLT_MAX))).height)
return (height + 50)
}
}
这通常会得到正确的结果,但它只是略微偏离(通常,当一个单词包装到下一行时,它不会导致单元格高一行)。
答案 0 :(得分:0)
这似乎有效:
let width = self.textField.bounds.width
let cell = (self.textField.cell() as? NSCell)!
let rect = cell.drawingRectForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), width, CGFloat(CGFloat.max)))
let size = cell.cellSizeForBounds(rect)
self.textField.setFrameSize(NSMakeSize(width, size.height))
使用其他解决方案的类似问题:NSTextFieldCell's cellSizeForBounds: doesn't match wrapping behavior?