【问题标题】:SwiftUI ListStyle on macOSmacOS 上的 SwiftUI ListStyle
【发布时间】:2020-04-11 03:04:01
【问题描述】:

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

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

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

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

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

我花了好几个小时,但我想不出一个合适的解决方案。谁能提供一个可行的解决方案?

【问题讨论】:

    标签: macos list background swiftui drag


    【解决方案1】:

    我更多地使用了 RichS 的答案,发现在我的项目中以下内容就足够了:

    extension NSTableView {
        open override func viewDidMoveToWindow() {
            super.viewDidMoveToWindow()
    
            backgroundColor = .clear
            enclosingScrollView?.drawsBackground = false
        }
    }
    

    YMMV,所以如果您的滚动没有按预期工作,请查看上面 RichS 的答案。

    【讨论】:

      【解决方案2】:

      更新 #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 - 如果你完全解决了,请告诉我。

      【讨论】:

      • 非常感谢您的回答 RichS。这实际上非常有效。事实上,我发现即使在 viewDidMoveToWindow() 中没有将 backgroundcolor 设置为 .clear 的情况下,它似乎也可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-31
      • 2022-01-27
      • 2020-02-13
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多