【问题标题】:Dynamic row height for NSTableView in Swift/CocoaSwift/Cocoa 中 NSTableView 的动态行高
【发布时间】:2016-09-22 16:24:14
【问题描述】:

编辑:链接的回复没有回答这个问题。我仍然坚持这个......

我有一张用于聊天消息的表格。每条消息都是一个包含一些文本的大小可变的框。我希望表格中的行高根据消息框的大小动态变化。

如果我在 IB 中为尺寸样式勾选“自动”,它会使所有行的高度都很小。看起来 iOS 有 UITableViewAutomaticDimension 可以自动缩放表格,但我找不到 NSTableView 类似的东西。

我知道有一个选项可以创建以下函数:

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat
{
       return 50 // ????
}

并且我可以使用它设置行高(上面将我的所有行设置为高度 50),但我不知道如何使它取决于我框中文本的大小。我怎样才能有效地做到这一点?

【问题讨论】:

  • 非常感谢您的回复!对我来说,答案在 Sunkas 对 Corbin 帖子的阐述中。但两者都在 Objective-C 中,我很难弄清楚如何将它们翻译成 Swift。有没有人可以在这里发布 Swift 版本作为答案?
  • 另外,Corbin 的答案是否会在调整窗口大小时或仅在重绘表格时调整行大小?后者是有问题的,因为如果用户水平缩小窗口,那么消息会变得更高更薄,正如人们所期望的那样......

标签: cocoa nstableview swift3


【解决方案1】:

这里有一个解决方案

首先,您在代码中设置了一个 NSTextfield。这是一个“虚拟”字段,因为它从未实际绘制过

    var fakefield = NSTextField()  
// Set the fontsize etc to be what you will use in the table

然后在heightOfRow函数中

func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat {

    let item = yourArray[row] 
    let fakefield.stringValue = item 
    // exactly how you get the text out of your data array depends on how you set it up

    let yourHeight = fakefield.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), yourWidth, CGFloat(FLT_MAX))).height
    // yourWidth = the width of your cell as CGFloat.  

    return yourHeight
}

更多细节和 NSTextfield 扩展可以在Here找到。请注意,这个答案在 Swift 2.3 中(还没有降到 3)

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2015-04-12
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2022-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多