在iOS项目中,我会做这样的事情:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 30

并有很好的调整单元格大小。
我该怎么做才能在macOS项目中重现相同的行为?
好的,func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat
我应该配置我的子视图(单元格视图)(实际上是NSView)两次。。。
在这两种方法中-heightOfRowviewFor tableColumn
我听说过细胞的再利用,但是没有笔尖能做到吗?
不管怎样,如果我这样做,我就得不到预期的结果。
委托/数据源:
let items = ["second label",
             "second label with alotoftext alotof...", // long line
             "second label"]

func numberOfRows(in tableView: NSTableView) -> Int {
    return 3
}

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    let cell = SubView(text: items[row])
    cell.layoutSubtreeIfNeeded()
    return cell.frame.size.height
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    return SubView(text: items[row])
}

子视图:
init(text: String) {
    super.init(frame: CGRect.zero)

    let text1 = NSTextField(labelWithString: "first label")
    let text2 = NSTextField(labelWithString: text)

    text2.lineBreakMode = .byWordWrapping
    text2.setContentCompressionResistancePriority(100, for: .horizontal)

    self.addSubview(text1)
    self.addSubview(text2)

    text1 <- [Top(5), Left(5), Right(5)]
    text2 <- [Top(0).to(text1, .bottom), Left(5), Right(5), Bottom(5)]

}

最后两行是EasyPeasy约束。
所以,结果是:swift - 我应该使用UITableViewAutomaticDimension的哪些替代品才能在NSTableView中获得相同的效果?-LMLPHP
我的错误在哪里?
还有一个问题:我该怎么做才能使单元格垂直增大/减小以适应其中的所有子视图,从而调整tableView的宽度?
哦,好像意识到了。
刚才观察员补充道:
name: NSNotification.Name.NSViewFrameDidChange,
object: self.scrollView

以及
let vr = scrollView.contentView.visibleRect
let indexes = tableView.rows(in: vr).toRange()!
tableView.noteHeightOfRows(withIndexesChanged: IndexSet(integersIn: indexes))

在选择器方法中。
是的。同样的视图(子视图)在没有tableView的情况下工作得很好。
swift - 我应该使用UITableViewAutomaticDimension的哪些替代品才能在NSTableView中获得相同的效果?-LMLPHPswift - 我应该使用UITableViewAutomaticDimension的哪些替代品才能在NSTableView中获得相同的效果?-LMLPHP
但我仍然有上述问题与错误大小的细胞视图。
备注:对不起,我的英语,希望一切都清楚。

最佳答案

在macOS上,这有点困难,但不是很难做到。
corbin dunn对此有一个很好的答案,他是NSTableViewhere的作者。
简而言之:
你需要知道你的单元格的大小并将该值返回到

func tableView(NSTableView, heightOfRow: Int)

这是NSTableViewDelegate中的一种方法。
2016年11月20日更新:
你快到了!您创建的视图没有宽度设置。所以我猜视图本身假设它比tableView窄得多,因此也就更高。
func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    let cell = SubView(text: items[row])
    cell.frame.size.width = tableView.frame.size.width
    cell.layoutSubtreeIfNeeded()
    return cell.frame.size.height
}

我没有测试过这个代码,但应该是它。

关于swift - 我应该使用UITableViewAutomaticDimension的哪些替代品才能在NSTableView中获得相同的效果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40688353/

10-09 08:54