Как установить цвет фона для viewController в swiftUI?

Я пытался установить цвет фона для всего viewController в swiftUI, но у меня не получалось. Представление не принимает атрибут .backgroundColor.

Я также пробовал использовать атрибут .backgroundColor для viewController в sceneDelegate, и он не принимает атрибут, но принимает атрибут foregroundColor.


person Rakesh    schedule 19.06.2019    source источник
comment
Сейчас самое время быть конкретным ... когда вы говорите viewController, вы говорите UIViewController, UIView или View? Существует огромная разница между первыми двумя, которые являются UIKit классами и требуют интеграции со SwiftUI, и третьим, которым является SwiftUI, и модификатор, подобный @rraphael, предоставлен вам, будет работать.   -  person dfd    schedule 19.06.2019
comment
Я предполагаю, что под viewController Ракеш означает весь экран iPhone. Я все еще не понимаю, окно это или сцена.   -  person Ryan    schedule 04.10.2019


Ответы (4)


До сих пор я обнаружил, что лучше всего работает ZStack в верхней части тела ContentView и имеет первый слой Color, который игнорирует безопасную область. Apple определяет Color как «токен позднего связывания», что бы это ни было, но он ведет себя так же, как и любой другой View.

struct ContentView: View {
  var body: some View {
    ZStack {
      Color.red
      .edgesIgnoringSafeArea(.all)

      /// Your Inner View content goes here.
      VStack {
        Text("Hello") 
      } // VStack

    } // ZStack
  } // body View
}  // ContentView

Примечание: будьте осторожны с тем, что находится внутри внутреннего представления, потому что оно может легко расшириться, чтобы заполнить все окно, таким образом, наложив цвет фона на белый и т. Д. Например, популярный NavigationView имеет тенденцию расширяться на все window, и для меня он имеет тенденцию игнорировать задокументированную настройку .background (). Вы можете использовать ту же стратегию ZStack и здесь.

NavigationView {
  ZStack { 
    Color.red.edgesIgnoringSafeArea(.all) 
    VStack {
      Text("Hello")
    } // VStack
  } // ZStack
}  // NavigationView
person Ryan    schedule 04.10.2019
comment
Это не сработало для меня с NavigationView, у которого есть список. - person user1366265; 21.10.2019
comment
Помните, что список - это представление, которое затем загружается поверх NavigationView и аналогичным образом расширяется, чтобы заполнить экран. Например, если внутри вашего NavigationView у вас есть List {Text (Hello)}. Opacity (0.2), вы увидите, что фон просвечивает. Таким образом, вам нужно будет стилизовать само представление списка. Вот вопрос StackOverflow по этому поводу: stackoverflow.com/questions/56517904/ - person Ryan; 22.10.2019

вы можете использовать приведенный ниже код для изменения всего цвета контроллера представления

ZStack {
        Color.red
        .edgesIgnoringSafeArea(.all)
    }

и используйте этот код для изменения цвета фона безопасной области

ZStack {
        Color.red
    }
person Masoud Roosta    schedule 16.10.2019

Если вы используете модификатор фона (.background (Color.red)) в виде сверху, вы просто обернете это представление новым представлением с красным цветом фона вокруг его отступа или размера. Поэтому вы должны использовать представление Rectangle () и стек Z, чтобы установить полный фон для всего представления, и, если вам нужно, используйте .edgesIgnoringSafeArea

    NavigationView {
        ZStack { 
            Rectangle().foregroundColor(.blue).edgesIgnoringSafeArea(.all)
            ScrollView {
                List()
                    ForEach(modelExampleList) { modelExample in
                        Row(model: modelExample)
                    }
                }.frame(height: 200)
            }.padding(.leading, 10)
        }.navigationBarTitle(Text("ModelExample List"), displayMode: .large)
    }
person Piero Sifuentes    schedule 19.06.2019

Я вытащил его из ZStack, затем использовал overlay, и это сработало.

var body: some View {
    NavigationView {
        sceneBackgroundColor
            .edgesIgnoringSafeArea(.all)
            .overlay(myView)
    }
}
person Alex    schedule 11.06.2021