如何删除NSTableView的单元格之间的空间?

时间:2012-12-07 05:29:34

标签: macos cocoa nstableview

我通过发送:

将我的NSTableView中的单元间距设置为0
[self.tableView setIntercellSpacing:NSMakeSize(0, 0)];

在窗口控制器的awakeFromNib中但是行之间仍然有一个(可能是1个像素宽)的空白空间,我认为这是绘制网格线的地方,尽管我没有使用网格线。如何摆脱行之间的这个空间?

更新

NSTableView documentation似乎表示,当单元间间隔设置为0,0时,此1像素间距应该消失。在我的情况下,它不是。也许这是一个错误?

2 个答案:

答案 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)
      }
   }
}