2016-09-30 4 views
0

Мне нужно точно рассчитать размер 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) 
    } 
} 

Это очень часто получает правильные результаты, но это просто слегка (часто, когда одно слово переносится на следующую строку, это не приведет к тому, что ячейка будет на одну строку выше).

+0

После того, как сообщение в вашем представлении таблицы, вы собираетесь, чтобы позволить пользователю редактировать его? –

+0

Сначала вызовите 'drawingRectForBounds' и используйте результат в' cellSizeForBounds'. – Willeke

+0

@PaulPatterson: Нет. Сообщение не будет редактироваться (это пузырь в чате, как в iMessage/Whatsapp/Facebook). – SuddenMoustache

ответ

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?

+0

Это * так * очень почти правильно, но иногда выключено. Я не знаю, почему это было бы ... – SuddenMoustache

+0

Да, я это заметил. При изменении размера моего окна иногда последнее слово «i» не подходит. Повторное вычисление позже исправляет это. Похоже, что камера еще не готова. – Willeke

+0

«i» работает некорректно, когда редактируется текстовое поле. – Willeke

Смежные вопросы