iOS 16 SwiftUI 列表背景

Tim*_*mmy 29 swift swiftui swiftui-list ios16

SwiftUI随着iOS 16 的新更新List,不再依赖UITableView. 因此,我们用来设置List背景颜色的以下代码片段.clear现在毫无用处:

UITableView.appearance().backgroundColor = .clear
Run Code Online (Sandbox Code Playgroud)

我看到有人曾经introspect解决过这个问题,但是有人知道另一种可能更干净的方法来实现相同的行为吗?

另请注意,在 上macOS,以下工作正常(使用Xcode 14 beta&测试macOS Ventura):

extension NSTableView {
    open override func viewDidMoveToWindow() {
        super.viewDidMoveToWindow()
        backgroundColor = NSColor.clear
        enclosingScrollView!.drawsBackground = false
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 37

iOS 16

更新:Xcode 14b3+

只需使用新的修饰符:

    List {
        Text("Item 1")
        Text("Item 2")
        Text("Item 3")
    }
    .scrollContentBackground(Color.red)     // << here !!
//    .scrollContentBackground(Color.clear)     // << transparent !!
//    .scrollContentBackground(.hidden)     // << can be combined with above !!
Run Code Online (Sandbox Code Playgroud)

原来的

现在它们用于UICollectionView后端,因此更新的解决方法是更改​​相应的背景颜色:

演示

主要部分:

extension UICollectionReusableView {
    override open var backgroundColor: UIColor? {
        get { .clear }
        set { }

        // default separators use same color as background
        // so to have it same but new (say red) it can be
        // used as below, otherwise we just need custom separators
        // 
        // set { super.backgroundColor = .red }

    }
}

struct ContentView: View {
    init() {
        UICollectionView.appearance().backgroundColor = .clear
    }
//...
Run Code Online (Sandbox Code Playgroud)

GitHub 上的测试模块

  • 我认为新的测试版不允许`scrollContentBackground`直接与`Style`一起使用。它应该设置为“.hidden”,然后与“.background(style)”组合。 (4认同)
  • 这是一个很大的帮助,尽管当我重写“backgroundColor” getter 时,我丢失了“listRowSeparatorTint”(如您的图片所示)。知道如何取回它吗? (2认同)
  • beta 3 中的新“.scrollContentBackground”使一切按预期工作,无需此解决方法和不同的颜色分隔符。 (2认同)

Mar*_*nig 29

为此,我创建了一个隐藏此自定义滚动背景的自定义标识符。

struct ListBackgroundModifier: ViewModifier {

    @ViewBuilder
    func body(content: Content) -> some View {
        if #available(iOS 16.0, *) {
            content
                .scrollContentBackground(.hidden)
        } else {
            content
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

List {
    ...
}
.modifier(ListBackgroundModifier())
Run Code Online (Sandbox Code Playgroud)


Jor*_*n H 17

iOS 16 添加了一个新的修饰符,scrollContentBackground(Visibility),用于自定义可滚动视图的背景可见性,包括List.

您可以像这样隐藏标准系统背景,如果您提供一个,这将显示列表的背景:

List {
    Text("One")
    Text("Two")
    Text("Three")
}
.background(Image("MyImage"))
.scrollContentBackground(.hidden)
Run Code Online (Sandbox Code Playgroud)


Law*_*nez 10

从 Xcode 15.1开始,工作代码是

List {
    Text("1")
    Text("2")
    Text("3")
}
.scrollContentBackground(.hidden)
.background(.purple)
Run Code Online (Sandbox Code Playgroud)