【问题标题】:Accurately get size of wrapping NSTextField (Swift)准确获取包装 NSTextField (Swift) 的大小
【发布时间】:2017-02-09 02:44:50
【问题描述】:

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

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

【问题讨论】:

  • 一旦消息出现在您的表格视图中,您是否打算允许用户对其进行编辑?
  • 第一次调用drawingRectForBounds并使用cellSizeForBounds中的结果。
  • @PaulPatterson :不。消息不会被编辑(它是一个聊天气泡,就像在 iMessage/Whatsapp/Facebook 中一样)。
  • @Willeke:您介意提供一个代码示例来准确解释您的意思吗?如果可行,我可以将其标记为答案。
  • 抱歉,我忘了问:包含消息的列会调整大小吗?

标签: swift cocoa nstableview nstextfield


【解决方案1】:

这似乎有效:

    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?

【讨论】:

  • so 几乎是正确的,但有时会出错。我不知道为什么会这样......
  • 是的,我注意到了。调整窗口大小时,有时最后一个单词“i”不合适。稍后重新计算修复它。感觉细胞还没有准备好。
  • 在编辑我的文本字段时,“i”无法正常工作。
  • 是的,稍后重新计算确实可以解决问题。嘎。不知道在这里做什么。我认为在 tableView 的 heightForRow 中准确计算包装 NSTextField 的高度是不可能的。也许我应该切换到 NSTextView...
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
相关资源
最近更新 更多