Цвет фона списка SwiftUI

Я не могу изменить цвет фона представления, если я перечисляю статические элементы. это мой код:

NavigationView {
    ZStack {
        Color("AppBackgroundColor").edgesIgnoringSafeArea(.all)
        List {
            Section(header: Text("Now in theaters")) {
                ScrollMovies(type: .currentMoviesInTheater)
            }
            Section(header: Text("Popular movies")) {
                ScrollMovies(type: .popularMovies)
            }
        }.listStyle(.grouped)
    }
}

Вы хотите изменить цвет фона List или цвет фона ZStack?

Ketan Odedra 22.07.2019 10:49

я хочу изменить фон всего представления.

nunzio giulio caggegi 22.07.2019 12:24

Эй, ты видел мой рабочий ответ?

Mojtaba Hosseini 19.10.2019 22:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
3
21 314
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

так как вы просите изменить цвет фона представления,

вы можете использовать .colorMultiply() для этого.

Код:

var body: some View {
        VStack {
            ZStack {
                List {
                    Section(header: Text("Now in theaters")) {
                        Text("Row1")
                    }
                    Section(header: Text("Popular movies")) {
                        Text("Row2")
                    }

                    /*Section(header: Text("Now in theaters")) {
                        ScrollMovies(type: .currentMoviesInTheater)
                    }
                    Section(header: Text("Popular movies")) {
                        ScrollMovies(type: .popularMovies)
                    } */
                }.listStyle(.grouped)
            }.colorMultiply(Color.yellow)
        }
}

Выход:

Это не ожидаемый ответ. colorMultiply() окрашивает весь список, включая ячейки, что не является намерением, и это не то же самое, что цвет фона списка. Существует модификатор фона (.background(Color.red) для списка и для любого другого представления, но он не работает для списков.

Vladimir88dev 24.07.2019 09:48

Я думаю, что это разумный обходной путь в некоторых обстоятельствах.

Bart van Kuik 24.09.2019 11:17

Попробуйте отобразить изображение в одной из ячеек... к ним также будет применен желтый цвет

Tiziano Coroneo 12.11.2019 15:11

Вы можете указать модификатор для элементов в списке

NavigationView {
        ZStack {
            Color("AppBackgroundColor").edgesIgnoringSafeArea(.all)
            List {
                Section(header: Text("Now in theaters")) {
                    ScrollMovies(type: .currentMoviesInTheater)
                    .listRowBackground(Color.blue) // << Here
                }
                Section(header: Text("Popular movies")) {
                    ScrollMovies(type: .popularMovies)
                    .listRowBackground(Color.green)  // << And here
                }
            }.listStyle(.grouped)
        }
    }

Неправильный ответ - вы теряете липкие заголовки из-за стиля сгруппированного списка.

strangetimes 28.04.2020 01:20

Самый простой способ сделать это на данный момент — просто использовать прокси UIAppearance. SwiftUI молод, поэтому Apple еще не полностью реализовала несколько функций.

UITableView.appearance().backgroundColor = .red

Это в сочетании с listRowBackground() в строках списка решило это для меня. Результат неизменен даже при прокрутке представления, чего я и хотел добиться.

Stefan Edberg 28.04.2020 11:35
@State var users: [String] = ["User 1",
                              "User 2",
                              "User 3",
                              "User 4"]

init(){
    UITableView.appearance().backgroundColor = .red
    UITableViewCell.appearance().backgroundColor = .red
    UITableView.appearance().tableFooterView = UIView()
}

var body: some View {
    List(users, id: \.self){ user in
        Text(user)
    }
    .background(Color.red)
}

PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())

Это не работает, когда у вас есть градиентный фон позади списка.

strangetimes 28.04.2020 01:19

Использование UITableView.appearance() повлияет на все списки в приложении. См. мой предложенный ответ ниже.

Andy Thomas 06.01.2021 19:33
Ответ принят как подходящий

Все ListSwiftUI поддерживаются UITableViewв iOS. поэтому вам нужно изменить цвет фона таблицаView. Вы делаете это clear так, чтобы другие view были видны под ним:

struct ContentView: View {
    
    init(){
        UITableView.appearance().backgroundColor = .clear
    }
        
    var body: some View {
        Form {
            Section(header: Text("First Section")) {
                Text("First cell")
            }
            Section(header: Text("Second Section")) {
                Text("First cell")
            }
        }
        .background(Color.yellow)
    }
}

Теперь вы можете использовать Любой фон (включая все Color), которые хотите.

Preview

Обратите внимание, что эти верхние и нижние белые области — это безопасные районы, и вы можете использовать модификатор .edgesIgnoringSafeArea(), чтобы избавиться от них.

Также обратите внимание, чтоList с модификатором .listStyle(GroupedListStyle()) можно заменить простым Form. Но имейте в виду, что элементы управления SwiftUI ведут себя по-разному в зависимости от окружающего их представления.

Также вы также можете установить цвет фона UITableViewCell на clear для простых табличных представлений.

Хороший ответ, но это работает только для iOS. Вы знаете, как сделать то же самое на macOS?

Lupurus 09.11.2019 11:52

Я посмотрю на это @Lupurus и дам вам знать

Mojtaba Hosseini 09.11.2019 11:53

Обратите внимание, что List в GroupedStyle НЕ совпадает с Form. Элементы управления SwiftUI ведут себя по-разному в зависимости от включающего их представления.

Tiziano Coroneo 12.11.2019 15:17

@Lupurus я добавил решение для macOS, если вы хотите stackoverflow.com/a/60424034/4100181

Anthony 27.02.2020 00:19

Дополнительно установите tableviewcells для очистки. UITableViewCell.appearance().backgroundColor = .clear Это можно установить в SceneDelegate.swift перед добавлением ContenView в сцену.

AAV 27.06.2020 06:26

Для SwiftUI на macOS это работает:

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

        // set the background color of every list to red
        backgroundColor = .red
    }
}

Он установит цвет фона каждого списка на красный (в этом примере).

List нельзя "красить". Вместо этого используйте следующее:

Список предметов:

ForEach(items) { item in
    HStack {
        Text(item)
    }
}.background(Color.red)

Прокручиваемый список предметов:

ScrollView {
    ForEach(items) { item in
        HStack {
            Text(item)
        }
    }.background(Color.red)
}

В твоем случае:

VStack { // or HStack for horizontal alignment
    Section(header: Text("Now in theaters")) {
        ScrollMovies(type: .currentMoviesInTheater)
    }
    Section(header: Text("Popular movies")) {
        ScrollMovies(type: .popularMovies)
    }
}.background(Color.red)

Это лучший ответ, я также хочу оставить комментарий о том, что вы можете использовать @State в строке поиска, чтобы отфильтровать свой ForEach, как и обычный список. Общий пример: ForEach(items.filter({ searchText.isEmpty ? true : $0.name.contains(searchText) })) { item in HStack {Text(item)}} также будет работать!!!

DaWiseguy 10.07.2020 22:36

Что вы имеете в виду под "нарисованным"?

Peter Schorn 13.12.2020 23:46

Использование UITableView.appearance().backgroundColor может повлиять на цвет фона всех элементов управления списком в приложении. Если вы хотите, чтобы было затронуто только одно конкретное представление, в качестве обходного пути вы можете установить для него значение onAppear и вернуть значение onDisappear по умолчанию.

import SwiftUI
import PlaygroundSupport

struct PlaygroundRootView: View {
    @State var users: [String] = ["User 1",
                                  "User 2",
                                  "User 3",
                                  "User 4"]
    var body: some View {
        Text("List")
        List(users, id: \.self){ user in
            Text(user)
        }
        .onAppear(perform: {
            // cache the current background color
            UITableView.appearance().backgroundColor = UIColor.red
        })
        .onDisappear(perform: {
            // reset the background color to the cached value
            UITableView.appearance().backgroundColor = UIColor.systemBackground
        })
    }
}
PlaygroundPage.current.setLiveView(PlaygroundRootView())

Немного поздно на вечеринку, но это может помочь. Я использую комбинацию:

  • Настройка внешнего вида UITableView.appearance
  • Настройка внешнего вида UITableViewCell.appearance
  • Устанавливает модификатор ListlistRowBackground.

Настройка внешнего вида влияет на все приложение, поэтому вы можете сбросить его на другие значения, где это применимо.

Образец кода:

struct ContentView: View {
    var body: some View {
        
        let items = ["Donald", "Daffy", "Mickey", "Minnie", "Goofy"]

        UITableView.appearance().backgroundColor = .clear
        UITableViewCell.appearance().backgroundColor = .clear
        
        return ZStack {
            Color.yellow
                .edgesIgnoringSafeArea(.all)
            List {
                Section(header: Text("Header"), footer: Text("Footer")) {
                    ForEach(items, id: \.self) { item in
                        HStack {
                            Image(systemName: "shield.checkerboard")
                                .font(.system(size: 40))
                            Text(item)
                                .foregroundColor(.white)
                        }
                        .padding([.top, .bottom])
                    }
                    .listRowBackground(Color.orange))
                }
                .foregroundColor(.white)
                .font(.title3)
            }
            .listStyle(InsetGroupedListStyle())
        }
        
    }
}

Другие вопросы по теме