准确地获得包装NSTextField(Swift)的大小

时间:2016-09-30 13:38:40

标签: swift cocoa nstableview nstextfield

我需要准确计算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)
    }
}

这通常会得到正确的结果,但它只是略微偏离(通常,当一个单词包装到下一行时,它不会导致单元格高一行)。

1 个答案:

答案 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?