首页 > 解决方案 > macOS 上的 SwiftUI ListStyle

问题描述

在 macOS 上,使用 SwiftUI,关于 List:

我需要修改列表的背景颜色。

使用视图调试器,我看到 List 内部有一个 ListCoresScrollView,内部_NSScrollViewContentBackgroundView有一个 NSVisualEffectView。默认情况下,该视图具有白色背景。我想改变那个特定的视图(例如变得透明),因为它似乎是一个内部视图。

如何修改列表上的背景视图(在 macOS 中,而不是IOS)?

顺便说一句,我尝试使用 SidebarListStyle()。这确实提供了我想要的背景,但是......在 SidebarListStyle 中的拖动行为是不同的(不希望的)。因此,我的问题的替代解决方案可能是“如何修改 SidebarListStyle 上的拖动行为以模仿默认拖动行为”?

我花了好几个小时,但我想不出一个合适的解决方案。任何人都可以提供一个可行的解决方案吗?

标签: macoslistbackgroundswiftuidrag

解决方案


更新 #2(大约 30 分钟后)...

这有效:)

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

        // set the background color of every list
        backgroundColor = .clear
        enclosingScrollView?.drawsBackground = false
        enclosingScrollView?.backgroundColor = .clear
        enclosingScrollView?.autohidesScrollers = true
        enclosingScrollView?.verticalScroller = MyScroller()
    }
}

class MyScroller: NSScroller {
    override func draw(_ dirtyRect: NSRect) {
        self.drawKnob()
    }
}

原始答案

不确定您是否仍在寻找答案,但这是我设法得到的最接近的答案。仍然无法让滚动条(尤其是背景)真正透明。但是,比我更接近。

在你的项目中添加一个 swift 文件(现在,我只是把它放在我的 ContentView.swift 文件的顶部)。

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

        // set the background color of every list
        backgroundColor = .clear
        headerView = nil
        enclosingScrollView?.drawsBackground = false
        enclosingScrollView?.backgroundColor = .clear
        enclosingScrollView?.hasHorizontalScroller = false
        enclosingScrollView?.autohidesScrollers = true
    }
}

根据我的阅读,这应该有效。但是,事实并非如此。我可能不需要所有这些设置,但我会继续添加,直到我可以让它完全工作。

HTH - 如果你已经完全解决了,请告诉我。


推荐阅读