Мне нужно точно рассчитать размер NSTextField (потому что мне нужно это значение, чтобы вычислить высоту строки NSTableView, в которой сидит NSTextField). Сейчас у меня грубое приближение, но кажется, что это не так (и я не хочу, чтобы жестко кодировать его ...).Точно получите размер обертывания NSTextField (Swift)
Моего приближение предполагает создание временной ячейки, добавив соответствующий текст к нему, а затем вычислению высоты на основе этого текста:
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)
}
}
Это очень часто получает правильные результаты, но это просто слегка (часто, когда одно слово переносится на следующую строку, это не приведет к тому, что ячейка будет на одну строку выше).
После того, как сообщение в вашем представлении таблицы, вы собираетесь, чтобы позволить пользователю редактировать его? –
Сначала вызовите 'drawingRectForBounds' и используйте результат в' cellSizeForBounds'. – Willeke
@PaulPatterson: Нет. Сообщение не будет редактироваться (это пузырь в чате, как в iMessage/Whatsapp/Facebook). – SuddenMoustache