List Mac OS 的 SwiftUI 背景色

dav*_*dev 8 macos swift swiftui

我在 Mac OS 中使用 ListView。我正在尝试更改该 ListView 的背景颜色。然而,这并不像预期的那么容易。

我尝试.background(Color(.red))在 ListView 上使用属性。那没有改变任何东西。

我只能找到.listRowBackground(Color(.red))哪个对表格行有影响。但是,其他背景没有受到影响。

我准备了一个小demo来演示:

在我看来身体:

  VStack
    {
        List()
        {
            Text("Test")
                .listRowBackground(Color.green)

            Text("Test")
                .listRowBackground(Color.green)

            Text("Test")
                .listRowBackground(Color.green)

        }.background(Color(.red))

    }.background(Color(.red))
Run Code Online (Sandbox Code Playgroud)

这就是我得到的结果:

在此处输入图片说明

主背景没有变化。我读到了一个解决方案,UITableView.appearance但在 Mac OS 的 SwiftUI 中这对我来说是不可能的。

提前致谢

Sak*_*ket 12

更新:我找到了一种更好的方法来删除列表的背景而不影响整个应用程序:使用Introspect

import Introspect
import SwiftUI

extension List {
  /// List on macOS uses an opaque background with no option for
  /// removing/changing it. listRowBackground() doesn't work either.
  /// This workaround works because List is backed by NSTableView.
  func removeBackground() -> some View {
    return introspectTableView { tableView in
      tableView.backgroundColor = .clear
      tableView.enclosingScrollView!.drawsBackground = false
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

List {
  ForEach(items) { item in
    ...
  }
}.removeBackground()
Run Code Online (Sandbox Code Playgroud)

旧答案

@Asperi 的答案有效,但仅在调整窗口大小之前有效。这是覆盖List颜色的另一种解决方法:

extension NSTableView {
  open override func viewDidMoveToWindow() {
    super.viewDidMoveToWindow()

    backgroundColor = NSColor.clear
    enclosingScrollView!.drawsBackground = false
  }
}
Run Code Online (Sandbox Code Playgroud)

一个潜在的缺点是这会影响应用程序中的所有列表。