我通过发送:
将我的NSTableView中的单元间距设置为0[self.tableView setIntercellSpacing:NSMakeSize(0, 0)];
在窗口控制器的awakeFromNib
中但是行之间仍然有一个(可能是1个像素宽)的空白空间,我认为这是绘制网格线的地方,尽管我没有使用网格线。如何摆脱行之间的这个空间?
更新
NSTableView documentation似乎表示,当单元间间隔设置为0,0时,此1像素间距应该消失。在我的情况下,它不是。也许这是一个错误?
答案 0 :(得分:4)
正如trudyscousin所说,我将发布我如何解决问题的方法:
事实证明,当我将像素间距设置为0时,空白空间确实消失了。我的问题是我的NSTableCellView
子类中的绘图代码没有一直绘制到视图的边缘。我看到的差距不是细胞间分离,而是我NSTableCellView
子类的边界。
答案 1 :(得分:0)
在我的情况下,任务是使用 0.5 pt (在Retina显示屏上为1 px)分隔符。即使intercellSpacing
设置为.zero
(在我的情况下为0.5 pt),AppKit仍在选择绘图时仍在行之间保留1 pt的空间。
我最终通过继承NSTableRowView
来继承。使用自定义行,我可以将分隔符设置为任意高度。这是一个Swift 4.2示例:
class WelcomeRecentDocumentsView: View {
private lazy var tableView = TableView().autolayoutView()
private lazy var scrollView = ScrollView(tableView: tableView).autolayoutView()
override var intrinsicContentSize: NSSize {
return CGSize(width: 240, height: 400)
}
private var recentDocumentsURLs = (0 ..< 10).map { $0 }
}
extension WelcomeRecentDocumentsView: NSTableViewDataSource {
func numberOfRows(in tableView: NSTableView) -> Int {
return recentDocumentsURLs.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
return tableView.makeView(ItemView.self)
}
}
extension WelcomeRecentDocumentsView: NSTableViewDelegate {
func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
// Returning custom RowView.
return RowView(separatorHeight: separatorHeight, separatorColor: tableView.gridColor)
}
}
extension WelcomeRecentDocumentsView {
private var separatorHeight: CGFloat {
return convertFromBacking(1)
}
override func setupUI() {
addSubview(scrollView)
let column = NSTableColumn(identifier: "com.example.column", resizingMask: .autoresizingMask)
tableView.addTableColumn(column)
tableView.columnAutoresizingStyle = .uniformColumnAutoresizingStyle
tableView.headerView = nil
tableView.setAutomaticRowHeight(estimatedHeight: ItemView.defaultHeight)
tableView.intercellSpacing = CGSize(height: separatorHeight)
tableView.gridStyleMask = .solidHorizontalGridLineMask
}
override func setupHandlers() {
tableView.delegate = self
tableView.dataSource = self
}
override func setupLayout() {
LayoutConstraint.pin(to: .bounds, scrollView).activate()
}
override func setupDefaults() {
tableView.sizeLastColumnToFit()
}
}
extension WelcomeRecentDocumentsView {
class RowView: NSTableRowView {
let separatorHeight: CGFloat
let separatorColor: NSColor
init(separatorHeight: CGFloat = 1, separatorColor: NSColor = .gridColor) {
self.separatorHeight = separatorHeight
self.separatorColor = separatorColor
super.init(frame: .zero)
}
required init?(coder decoder: NSCoder) {
fatalError()
}
override func drawSelection(in dirtyRect: NSRect) {
let rect = bounds.insetBottom(by: -separatorHeight)
NSColor.alternateSelectedControlColor.setFill()
rect.fill()
}
override func drawSeparator(in dirtyRect: NSRect) {
let rect = bounds.insetTop(by: bounds.height - separatorHeight)
separatorColor.setFill()
rect.fill()
}
}
class ItemView: View {
static let defaultHeight: CGFloat = 52
override var intrinsicContentSize: NSSize {
return CGSize(intrinsicHeight: type(of: self).defaultHeight)
}
}
}