macOS Dev: NSTableView

2017-04-25  本文已影响0人  su3

实现一个 NSTableView,NSTableCellVIew 根据内容量和 window 宽度自动适应高度。

NSTableView 和 UITableView 有很大不同。比如 iOS 在设置好 autolayout 之后就不用去管 cell 的高度了。但是 macOS 中仍然需要提供高度数据。其他诸如点击事件,响应 cell 的背景色等等 api 也和 iOS 不一样。由于 window 的大小可变,渲染图形的时候要考虑到这种情况,不能依赖 autolayout 一劳永逸。总之, macOS 要考虑的情况多一些,能找到的资料又相对欠缺。

NSTableView

让 Cell 填满视图宽度

NSTableCellView

把值显示到 cell 的两种方式

1. 绑定 Object

2. 给 NSTableCellView 实例赋值

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let cell = tableView.make(withIdentifier: "CustomCell", owner: self) as! CustomCell
    let item = dataSource?[row]
    cell.setContent(item: item)
    return cell
}

动态高度

通过容器视图的 fittingSize 方法获得高度

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    let cell = tableView.make(withIdentifier: "CustomCell", owner: self) as! CustomCell
    let item = dataSource?[row]
    cell.setContent(item: item)
    return cell.contentView.fittingSize.height
}

收取窗口改变的通知,在 window 大小改变的时候 reloadData()。

 NotificationCenter.default.addObserver(self, selector: #selector(receivedNotification(notification:)), name: NSNotification.Name.NSWindowDidResize, object: nil)

demo

参考

上一篇下一篇

猜你喜欢

热点阅读