【问题标题】:NSTableView - change GroupRow styleNSTableView - 更改 GroupRow 样式
【发布时间】:2017-12-10 04:22:21
【问题描述】:

我试图在我自己的应用程序中模仿 MacOS 联系人应用程序对 GroupRows 所做的事情,但无法弄清楚或找到如何摆脱组行上方和下方的行。我尝试添加自己的自定义 NSTableRowView 并且可以毫无问题地更改背景颜色,但不知道如何摆脱这些边框。

【问题讨论】:

  • 看看drawSeparatorInRect of NSTableRowView
  • 我想尽了办法。据我了解,这仅适用于非 groupRows 的分隔符。我可能错了;如果你有它的工作,我很乐意看看。
  • 如果它在viewFor(tableColumn:row: 中不起作用,您可以返回任何NSView 的子类。因此,使用自定义绘图的文本和分隔符创建您自己的视图。
  • 我知道我可以返回 NSView 的任何子类,但是当 isGroupRow 设置为 true 时,我一直得到相同的布局。如果我不这样做 - 那么我不会得到组行停留在屏幕顶部的行为,直到下一个组行将其移开。

标签: swift xcode macos cocoa nstableview


【解决方案1】:

子类 NSTableRowView。然后在您的子类中添加一个属性,如下所示:

@interface CustomTableRowView : NSTableRowView

@property (nonatomic, assign) BOOL isGroupRow;

@end

覆盖子类中的drawRect:

- (void)drawRect:(NSRect)dirtyRect {
    if (!self.isGroupRow)
        [super drawRect:dirtyRect];
}

然后在tableView:rowViewForRow中,设置isGroupRow:

tableRow.isGroupRow = [self tableView:tableView isGroupRow:row];

这将删除组行的顶部和底部分隔符。抱歉,我不了解 Swift,但您可以很容易地翻译它。希望对您有所帮助!

【讨论】:

    【解决方案2】:

    另外,如果您正确设置了[self tableView:tableView isGroupRow:row],我们可以省略自定义变量isGroupRow 而使用内置isGroupRowStyle

    在 Swift sn-p 下面创建一个浮动的分组样式表视图行——看起来很像 Finder。其中,isGroupRowStyle 区分普通行和组行; isFloating 当组行未锚定在表格视图顶部时为真;覆盖 drawBackground(in:) 会删除围绕组行的分隔符。

    class TableRowView: NSTableRowView {
    
        override func draw(_ dirtyRect: NSRect) {
            guard isGroupRowStyle && isFloating else {
                return super.draw(dirtyRect)
            }
    
            NSColor.gridColor.setFill()
            dirtyRect.fill()
        }
    
        override func drawBackground(in dirtyRect: NSRect) {
            // do not draw
        }
    }
    

    【讨论】:

    • 如果我这样做,拖放组行不会突出显示。你有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多