228 votes

SwiftUI - Comment changer la couleur de fond d'une vue ?

Je commence à essayer SwiftUI et je suis surpris que cela ne semble pas être simple de changer la couleur d'arrière-plan d'une View. Comment faites-vous cela en utilisant SwiftUI?

277voto

Mark Moeykens Points 3494

Couleur de fond de l'écran

(À partir de la version Xcode 13)

Je ne suis pas sûr si l'auteur original faisait référence à la couleur de fond de l'écran entier ou des vues individuelles. Donc je vais simplement ajouter cette réponse qui consiste à définir la couleur de fond de l'écran entier.

Utilisation de ZStack

var body: some View {
    ZStack {
            Color.purple
                .ignoresSafeArea()

            // Votre autre contenu ici
            // Les autres couches respecteront les marges de la zone sûre
    }
}

J'ai ajouté .ignoresSafeArea() sinon, cela s'arrêtera aux marges de la zone sûre.

Utilisation du modificateur Overlay

var body: some View {
    Color.purple
        .ignoresSafeArea(.vertical) // Ignorer juste pour la couleur
        .overlay(
            VStack(spacing: 20) {
                Text("Superposition").font(.largeTitle)
                Text("Exemple").font(.title).foregroundColor(.white)
        })
}

Remarque : Il est important de garder .ignoresSafeArea uniquement sur la couleur pour que votre contenu principal n'ignore pas également les bords de la zone sûre.

iOS 15

iOS 15/Xcode 13 a introduit quelques changements dans la façon dont les Styles fonctionnent avec les bords des zones sûres.

D'après mon observation, la règle est : Si le style touche le bord de la zone sûre, il débordera dans la zone sûre.

Cela vous offre plus d'options pour définir une couleur/style de fond.

Qu'est-ce qu'un Style ?

Un Style peut être :

  • Couleurs
  • Matériaux (effets de flou)
  • Vues hiérarchiques (.secondary, .tertiary, .quaternary)
  • Dégradés

Utilisation du Background

Parce que l'arrière-plan du VStack touche le bord de la zone sûre, la couleur violette débordera dans la zone sûre.

var body: some View {
    VStack {
        Text("Bonjour, tout le monde !")
        Divider()
        Spacer()
    }
    .background(Color.purple)
}

TabView

En iOS 15, la TabView n'est plus translucide. Cela signifie que la couleur de fond débordera directement dans celle-ci.

Couleur de fond dans TabView

Si vous souhaitez fournir un style personnalisé pour votre TabView, vous pouvez ajouter un autre Style qui touche le bord inférieur de la zone sûre afin qu'il déborde dans votre TabView. Par exemple :

var body: some View {
    TabView {
        VStack {
            Text("Bonjour, tout le monde !")
            Divider()
            Spacer()
            // Déborde dans TabView
            Rectangle()
                .frame(height: 0)
                .background(.thinMaterial)
        }
        .background(Color.purple)
        .tabItem {
            Text("Onglet 1")
            Image(systemName: "wifi")
        }
    }
}

TabView avec Style

NavigationView

La même chose qui se produit avec TabView se produira également avec NavigationView.

Pour personnaliser le style de NavigationView, ajoutez un style qui touchera le bord supérieur de la zone sûre et débordera dans le NavigationView :

var body: some View {
    NavigationView {
        VStack {
            // Déborde dans NavigationView
            Rectangle()
                .frame(height: 0)
                .background(.ultraThinMaterial)
            Text("Bonjour, tout le monde !")
            Divider()
            Spacer()
        }
        .background(Color.purple)
        .navigationTitle(Text("Style"))
    }
}

NavigationView avec Style

Je suis totalement ouvert à d'autres façons d'accomplir cela. Laissez un commentaire ou éditez cette réponse si vous connaissez d'autres moyens.

7 votes

Savez-vous comment changer la couleur de fond pour NavigationView?

3 votes

Cela fonctionnera cependant si vous avez une NavigationView et une liste ou une barre de défilement, le titre de la barre de navigation ne se réduira pas

0 votes

Merci, @RichardWitherspoon, voulez-vous dire la solution ZStack ou Overlay? Ou les deux?

180voto

Simon Points 1525

Vous pouvez faire quelque chose comme :

.background(Color.black)

autour de votre vue.

par exemple, à partir du modèle par défaut (je l'englobe autour d'un Group) :

    var body: some View {
        VStack {
          Text("Bonjour SwiftUI!")
        }
       .background(Color.black)
    }

Pour ajouter un peu d'opacité à cela, vous pouvez ajouter la méthode .opacity également :

.background(Color.black.opacity(0.5))

Vous pouvez également utiliser l'élément d'inspection de la vue en faisant CMD + clic sur la vue et en cliquant sur Afficher l'inspecteur SwiftUI > Arrière-plan > Votre couleur.

Inspecter la vue

Inspecter la vue en détail

5 votes

Je n'ai pas pu l'utiliser pour afficher la vue de navigation. Avez-vous une idée de ce qu'il faut faire avec la vue de navigation?

0 votes

Quelle version utilisez-vous ?

0 votes

Atalayasa, UINavigationBar.appearance().backgroundColor = .black

38voto

bawasuru Points 117

Remplissez tout l'écran :

var body: some View {
    Color.green.edgesIgnoringSafeArea(.all)
}

Code

Résultat

Image of code

L'écran est complètement vert, même la zone autour de l'encoche

8 votes

Cela fonctionne jusqu'à ce que vous ajoutiez du contenu. Ensuite, vous devez placer votre couleur à l'intérieur d'un ZStack.

25voto

余书懿 Points 181

Comme ça

struct ContentView : View {
    @State var fullName: String = "yushuyi"
    var body: some View {        
        VStack
            {
                TextField($fullName).background(SwiftUI.Color.red)
                Spacer()
        }.background(SwiftUI.Color.yellow.edgesIgnoringSafeArea(.all))
    }
}

2 votes

Notez que vous devez ajouter .edgesIgnoringSafeArea() à la couleur de fond. Venant de UIKit, c'est bizarre, mais ça fonctionne!

2 votes

Note : Cela fonctionne car le Espaceur() pousse le VStack à la hauteur de l'écran.

0 votes

Cette solution ne fonctionne pas pour moi

17voto

Mojtaba Hosseini Points 2525

Pour List :

Tous les List de SwiftUI sont soutenus par une UITableView dans iOS. Vous avez donc besoin de changer la couleur de fond du tableView. Mais comme les valeurs Color et UIColor sont légèrement différentes, vous pouvez vous débarrasser du UIColor.

struct ContentView : View {
    init(){
        UITableView.appearance().backgroundColor = .clear
    }

    var body: some View {
        List {
            Section(header: Text("Première Section")) {
                Text("Première Cellule")
            }
            Section(header: Text("Deuxième Section")) {
                Text("Première Cellule")
            }
        }
        .background(Color.yellow)
    }
}

Maintenant, vous pouvez utiliser une couleur de fond (incluant tous les Color que vous voulez


Regardez d'abord ce résultat :

Hiérarchie de la vue

Comme vous pouvez le voir, vous pouvez définir la couleur de chaque élément dans la hiérarchie de la vue comme ceci :

struct ContentView: View {

    init(){
        UINavigationBar.appearance().backgroundColor = .green 
        //Pour d'autres changements de NavigationBar, regardez ici : (https://stackoverflow.com/a/57509555/5623035)
    }

    var body: some View {
        ZStack {
            Color.yellow
            NavigationView {
                ZStack {
                    Color.blue
                    Text("Un peu de texte")
                }
            }.background(Color.red)
        }
    }
}

Et le premier est window :

window.backgroundColor = .magenta

Le problème très courant est que nous ne pouvons pas supprimer la couleur de fond du HostingViewController de SwiftUI (pour l'instant), donc nous ne pouvons pas voir certaines des vues comme navigationView à travers la hiérarchie des vues. Vous devriez attendre l'API ou essayer de simuler ces vues (non recommandé).

0 votes

Une question similaire, au lieu de définir une couleur sur une ligne de liste, comment puis-je la rendre transparente, il semble que toutes mes tentatives échouent à révéler la couleur sous-jacente et que les lignes restent blanches, en particulier, il y a ListCoreCellHost qui reste blanc. pasteboard.co/JeWCgMV.png

0 votes

D'accord, j'ai compris 15 minutes plus tard en postant ici, j'ai dû définir UITableViewCell.appearance().backgroundColor = .clear aussi. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X