How do I modify the background color of a List in SwiftUI?

后端 未结 14 1280
醉酒成梦
醉酒成梦 2020-12-03 02:33

I\'m trying to recreate an UI I built with UIKit in SwiftUI but I\'m running into some minor issues.

I want the change the color of the List here, but n

相关标签:
14条回答
  • 2020-12-03 02:46

    List is not perfect yet.

    An option would be to use it like this -> List { ForEach(elements) { }} instead of List($elements)

    On my end this is what worked best up to now. Like @FontFamily said, it shouldn't break any List default behaviors like swiping.

    0 讨论(0)
  • 2020-12-03 02:51

    You can do it by changing UITableView's appearance.

    UITableView.appearance().backgroundColor = UIColor.clear
    

    just put this line in Appdelegate's didFinishLaunchingWithOptions method. In replace of UIColor.clear set whatever color you want to add in background color of list.

    0 讨论(0)
  • 2020-12-03 02:51

    I've inspired some of the configurator used to config per page NavigationView nav bar style and write some simple UITableView per page configurator not use UITableView.appearance() global approach

       import SwiftUI
    
        struct TableViewConfigurator: UIViewControllerRepresentable {
    
            var configure: (UITableView) -> Void = { _ in }
    
            func makeUIViewController(context: UIViewControllerRepresentableContext<TableViewConfigurator>) -> UIViewController {
    
                UIViewController()
            }
    
            func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<TableViewConfigurator>) {
    
                let tableViews = uiViewController.navigationController?.topViewController?.view.subviews(ofType: UITableView.self) ?? [UITableView]()
    
                for tableView in tableViews {
                    self.configure(tableView)
                }
            }
        }
    

    Then there is UIView extension needed to find all UITableViews

    extension UIView {
        func subviews<T:UIView>(ofType WhatType:T.Type) -> [T] {
            var result = self.subviews.compactMap {$0 as? T}
            for sub in self.subviews {
                result.append(contentsOf: sub.subviews(ofType:WhatType))
            }
            return result
        }
    }
    

    And usage at the end is:

    List {
    
    }.background(TableViewConfigurator {
        $0.backgroundColor = .red
    })
    

    Maybe one thing should be improved that is usage of navigationController?.topViewController to make it work even without navigationController in view controllers hierarchy

    0 讨论(0)
  • 2020-12-03 02:55

    I was able to get the whole list to change color by using colorMultiply(Color:). Just add this modifier to the end of the list view, and then the padding will push the table to the device edges. For example:

    List {...}.colorMultiply(Color.green).padding(.top)
    

    https://www.hackingwithswift.com/quick-start/swiftui/how-to-adjust-views-by-tinting-and-desaturating-and-more

    0 讨论(0)
  • 2020-12-03 02:58

    I assume the listRowPlatterColor modifier should do this, but isn't as of Xcode 11 Beta 11M336w

    var body: some View {
        List(pokemon) { pokemon in
            PokemonCell(pokemon: pokemon)
                .listRowPlatterColor(.green)
        }
    }
    
    0 讨论(0)
  • 2020-12-03 03:05

    Ok, I found the solution for coloring the list rows:

    struct TestRow: View {
    
        var body: some View {
            Text("This is a row!")
            .listRowBackground(Color.green)
        }
    }
    

    and then in body:

    List {
        TestRow()
        TestRow()
        TestRow()
    }
    

    This works as I expect, but I have yet to find out how to then remove the dividing lines between the rows...

    0 讨论(0)
提交回复
热议问题