Я не могу изменить цвет фона представления, если я перечисляю статические элементы. это мой код:
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)
}
}
я хочу изменить фон всего представления.
Эй, ты видел мой рабочий ответ?





так как вы просите изменить цвет фона представления,
вы можете использовать .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) для списка и для любого другого представления, но он не работает для списков.
Я думаю, что это разумный обходной путь в некоторых обстоятельствах.
Попробуйте отобразить изображение в одной из ячеек... к ним также будет применен желтый цвет
Вы можете указать модификатор для элементов в списке
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)
}
}
Неправильный ответ - вы теряете липкие заголовки из-за стиля сгруппированного списка.
Самый простой способ сделать это на данный момент — просто использовать прокси UIAppearance. SwiftUI молод, поэтому Apple еще не полностью реализовала несколько функций.
UITableView.appearance().backgroundColor = .red
Это в сочетании с listRowBackground() в строках списка решило это для меня. Результат неизменен даже при прокрутке представления, чего я и хотел добиться.
@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())
Это не работает, когда у вас есть градиентный фон позади списка.
Использование UITableView.appearance() повлияет на все списки в приложении. См. мой предложенный ответ ниже.
Все 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), которые хотите.
Обратите внимание, что эти верхние и нижние белые области — это безопасные районы, и вы можете использовать модификатор .edgesIgnoringSafeArea(), чтобы избавиться от них.
Также обратите внимание, чтоList с модификатором .listStyle(GroupedListStyle()) можно заменить простым Form. Но имейте в виду, что элементы управления SwiftUI ведут себя по-разному в зависимости от окружающего их представления.
Также вы также можете установить цвет фона UITableViewCell на clear для простых табличных представлений.
Хороший ответ, но это работает только для iOS. Вы знаете, как сделать то же самое на macOS?
Я посмотрю на это @Lupurus и дам вам знать
Обратите внимание, что List в GroupedStyle НЕ совпадает с Form. Элементы управления SwiftUI ведут себя по-разному в зависимости от включающего их представления.
@Lupurus я добавил решение для macOS, если вы хотите stackoverflow.com/a/60424034/4100181
Дополнительно установите tableviewcells для очистки. UITableViewCell.appearance().backgroundColor = .clear Это можно установить в SceneDelegate.swift перед добавлением ContenView в сцену.
Для 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)}} также будет работать!!!
Что вы имеете в виду под "нарисованным"?
Использование 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.appearanceUITableViewCell.appearanceListlistRowBackground.Настройка внешнего вида влияет на все приложение, поэтому вы можете сбросить его на другие значения, где это применимо.
Образец кода:
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())
}
}
}
Вы хотите изменить цвет фона
Listили цвет фонаZStack?