自定义 NSTableRowView 的高亮颜色

问题描述 投票:0回答:1

我愿意

  1. 将强调背景设置为红色。
  2. 当内容不是关键(例如,我们选择 UI 的另一个元素)或应用程序位于背景上时,保留用 unemphasizedSelectedContentBackgroundColor 替换强调背景的行为。

enter image description here

swift appkit
1个回答
0
投票

为了指示选择,macOS 使用圆角矩形填充 NSColor.selectedContentBackgroundColor。我会模仿它,但使用自定义的红色。当控件不是按键或应用程序位于后台时,变量

isEmphasized
会变为 false,因此我将使用它来触发刷新。

import AppKit

final class CustomTableRowView: NSTableRowView {
    override func layout() {
        super.layout()
        // the default .none won’t even call drawSelection(in:)
        selectionHighlightStyle = .regular
    }

    override func drawSelection(in dirtyRect: NSRect) {
        guard selectionHighlightStyle != .none else { 
            return 
        }
        let selectionRect = NSInsetRect(bounds, 10, 0)
        let fillColor = isEmphasized ? NSColor.red : NSColor.unemphasizedSelectedContentBackgroundColor
        fillColor.setFill()
        let selectionPath = NSBezierPath.init(roundedRect: selectionRect, xRadius: 5, yRadius: 5)
        selectionPath.fill()
    }

    override var isEmphasized: Bool {
        didSet {
            needsDisplay = true
        }
    }
}

这里我告诉 NSViewController 将默认的 NSTableRowView 替换为上面的自定义类:

// MARK: - NSOutlineViewDelegate

func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView? {
    CustomTableRowView()
}
© www.soinside.com 2019 - 2024. All rights reserved.