SwiftUI-如何更改视图的背景颜色?

jer*_*ter 39 background view modifier background-color swiftui

我开始尝试SwiftUI,但感到惊讶的是,更改A的背景颜色似乎并不简单View。您如何使用SwiftUI呢?

ARG*_*Geo 74

背景颜色

(在 iOS 17.4 Xcode 模拟器上测试)

请注意,foregroundColor(_:)修饰符已被弃用。foregroundStyle(_:)代替使用。

在此输入图像描述

1. 文字背景

要在文本视图上扩大背景颜色,请使用修改器的maxWidthmaxHeight参数.frame()

var body: some View {             // PINK COLOR
    Text("one")
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .foregroundStyle(.white)
        .font(.system(size: 100))
        .background(.pink)
}
Run Code Online (Sandbox Code Playgroud)

2.ZStack

要填充 ZStack 视图的背景,请使用Color对象作为基础层。

var body: some View {             // YELLOW COLOR
    ZStack {
        Color.yellow.ignoresSafeArea()
        Text("two").font(.system(size: 100))
    }
}
Run Code Online (Sandbox Code Playgroud)

3.VStack| 堆栈

如果您想为 VStack 或 HStack 分配新的 BG 颜色,请将修改器应用于堆栈本身。

var body: some View {             // TEAL COLOR
    VStack {
        Text("three").font(.system(size: 100))
    }
    .frame(maxWidth: .infinity, maxHeight: .infinity)
    .background(.teal)
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

4.渐变

您可以使用忽略屏幕安全区域并用渐变填充屏幕的矩形。

var body: some View {             // PURPLISH GRADIENT
    ZStack {
        Rectangle()
            .fill(Gradient(colors: [.indigo, .purple]))
            .ignoresSafeArea()
        Text("four").font(.system(size: 100))
            .foregroundStyle(.white)
    }
}
Run Code Online (Sandbox Code Playgroud)

5. 配色方案| 颜色反转

颜色反转是一种简单而智能的解决方案。

var body: some View {             // INVERSION OF A COLOR
    ZStack {
        List {
            ForEach(1..<6) { version in
                HStack {
                    Image(systemName: "swift")
                    Text("Swift \(version).0")
                }
            }
        }
        Text("five").font(.system(size: 100))
    }
    .environment(\.colorScheme, .dark)
    // .colorInvert()
}
Run Code Online (Sandbox Code Playgroud)

6. 图片

无缩进的图像可以包含纯色或渐变。

var body: some View {             // GREEN JPEG as BG COLOR
    ZStack {
        Image("green")
            .resizable()
            .ignoresSafeArea()
            .brightness(-0.2)
        Text("six").font(.system(size: 100))
            .foregroundStyle(.white)
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

7.场景视图

SceneKit 场景的背景颜色。

import SwiftUI
import SceneKit

struct ContentView : View {       // PURPLE COLOR
    var scene = SCNScene()
    var options: SceneView.Options = [.allowsCameraControl]

    init() {
        scene.background.contents = UIColor.purple

        let model = SCNNode(geometry: SCNSphere(radius: 0.25))
        model.geometry?.materials[0].diffuse.contents = UIColor.systemMint
        scene.rootNode.addChildNode(model)
        options.insert(.autoenablesDefaultLighting)
    }
    
    var body: some View {
        SceneView(scene: scene, options: options).ignoresSafeArea()
    }
}
Run Code Online (Sandbox Code Playgroud)

8.iOS 版 ARView

非 AR 模式下 RealityKit 场景的背景颜色。

import SwiftUI
import RealityKit

struct ContentView : View {       // DARK GRAY COLOR
    var body: some View {
        ARContainer().ignoresSafeArea()
    }
}

struct ARContainer : UIViewRepresentable {
    let arView = ARView(frame: .zero)
    let anchor = AnchorEntity()

    func makeUIView(context: Context) -> ARView {
        arView.environment.background = .color(.init(white: 0.2, alpha: 1))
        
        let model = ModelEntity(mesh: .generateSphere(radius: 0.25))
        model.setParent(anchor)
        arView.scene.anchors.append(anchor)
        return arView
    }
    func updateUIView(_ view: ARView, context: Context) { }
}
Run Code Online (Sandbox Code Playgroud)

9. 精灵视图

SpriteKit 场景的背景颜色。

import SwiftUI
import SpriteKit

struct ContentView : View {       // CHOCOLATE COLOR
    var scene = SKScene()

    init() {
        scene.backgroundColor = .init(Color(red: 0.2, green: 0.1, blue: 0))

        let node = SKShapeNode(circleOfRadius: 0.1)
        node.position = CGPoint(x: 0.5, y: 0.5)
        node.fillColor = .systemOrange
        node.lineWidth = 0
        scene.scaleMode = .aspectFill
        scene.addChild(node)
    }
    var body: some View {
        SpriteView(scene: scene).ignoresSafeArea()
    }
}
Run Code Online (Sandbox Code Playgroud)

混合模式

在 SwiftUI 中,还有影响背景颜色和/或图像颜色的合成技术。在此处阅读有关“photoshopic”混合模式的信息。


Sim*_*mon 42

您可以执行以下操作:

.background(Color.black)
Run Code Online (Sandbox Code Playgroud)

围绕您的观点。

例如。从默认模板(我将其包含在Group中):

    var body: some View {
        VStack {
          Text("Hello SwiftUI!")
        }
       .background(Color.black)
    }
Run Code Online (Sandbox Code Playgroud)

要为其添加一些不透明度,还可以添加.opacity方法:

.background(Color.black.opacity(0.5))
Run Code Online (Sandbox Code Playgroud)

您还可以使用的检查视图的元素通过CMD +点击查看并点击Show SwiftUI Inspector> Background>你的颜色

检查视图

检查细节视图

  • 我无法将它用于导航视图您知道如何处理导航视图吗? (5认同)

Mar*_*ens 40

屏幕背景色

(自Xcode版本11.1(11A1027)

我不确定原始海报是指整个屏幕还是单个视图的背景色。因此,我只添加此答案即可设置整个屏幕的背景色。

使用ZStack

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

            // Your other content here
            // Other layers will respect the safe area edges
    }
}
Run Code Online (Sandbox Code Playgroud)

我说.edgesIgnoringSafeArea(.all),否则,将在安全区边缘停止。

使用叠加层修改器

var body: some View {
    Color.purple
        .edgesIgnoringSafeArea(.vertical) // Ignore just for the color
        .overlay(
            VStack(spacing: 20) {
                Text("Overlay").font(.largeTitle)
                Text("Example").font(.title).foregroundColor(.white)
        })
}
Run Code Online (Sandbox Code Playgroud)

注:保持这一点很重要.edgesIgnoringSafeArea,那颜色正好让你的主要内容是不是太无视安全区的边缘。

  • 您知道如何更改NavigationView的背景颜色吗? (3认同)
  • 这将起作用,但是如果您有一个 NavigationView 和一个列表或滚动视图,导航栏标题将不会折叠 (3认同)
  • 我只是尝试了两者但没有运气。我一直在试图找出一种方法来使屏幕背景颜色与导航视图和滚动视图一起使用 (2认同)
  • 关于NavigationView,请在NavigationView内部使用上面的ZStack方法,如下所示:/sf/answers/4076133141/ (2认同)

baw*_*uru 30

填满整个屏幕:

var body: some View {
    Color.green.edgesIgnoringSafeArea(.all)
}
Run Code Online (Sandbox Code Playgroud)
代码 结果
代码图片 屏幕完全是绿色的,甚至凹口周围的区域

  • 这将一直有效,直到您添加内容为止。然后您需要将颜色放入 ZStack 中。 (15认同)

Moj*_*ini 12

对于List

所有 SwiftUI 的Lists 都由UITableViewiOS 中的 a 支持。所以你需要改变tableView的背景颜色。但由于ColorUIColor值略有不同,您可以去掉UIColor.

struct ContentView : View {
    init(){
        UITableView.appearance().backgroundColor = .clear
    }
    
    var body: some View {
        List {
            Section(header: Text("First Section")) {
                Text("First Cell")
            }
            Section(header: Text("Second Section")) {
                Text("First Cell")
            }
        }
        .background(Color.yellow)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用任何Color你想要的背景(包括所有的)


另外先看看这个结果:

查看层次结构

如您所见,您可以像这样设置 View 层次结构中每个元素的颜色:

struct ContentView: View {
    
    init(){
        UINavigationBar.appearance().backgroundColor = .green 
        //For other NavigationBar changes, look here:(/sf/answers/4025668881/)
    }

    var body: some View {
        ZStack {
            Color.yellow
            NavigationView {
                ZStack {
                    Color.blue
                    Text("Some text")
                }
            }.background(Color.red)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个是window

window.backgroundColor = .magenta
Run Code Online (Sandbox Code Playgroud)

非常常见的问题是我们无法移除 SwiftUI 的背景颜色HostingViewController(目前),因此我们无法navigationView通过视图层次结构看到某些视图。您应该等待 API 或尝试伪造这些视图(不推荐)。


PDK*_*PDK 9

iOS 部署目标 15 \xe2\x86\x92 使用修饰符.background(Color)

\n
\n

如果您的应用程序需要与较旧的 SwiftUI 版本兼容,例如 iOS 14,您可以按照 Apple 的建议并临时制作ViewModifier

\n
\n

ViewModifier protocol当您想要创建可应用于任何视图的可重用修改器时,请采用。

\n

您可以modifier(_:)直接应用于视图,但更常见和惯用的方法是modifier(_:)定义一个View包含视图修饰符的扩展

\n

来源:\xef\xa3\xbf 开发者文档 > SwiftUI > 视图基础知识 > ViewModifier

\n
\n
extension View {\n  @available(iOS, deprecated: 15.0, message: "No longer needed, use the default background modifier instead")\n  func backgroundColor(_ color: Color) -> some View {\n    modifier(BackgroundColorModifier(color: color))\n  }\n}\n\nstruct BackgroundColorModifier: ViewModifier {\n  var color: Color\n\n  func body(content: Content) -> some View {\n    if #available(iOS 15.0, *) {\n      content\n        .background(color)\n    } else {\n      ZStack {\n        color // background\n        content\n      }\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后您可以申请.backgroundColor(_:)任何View

\n
var body: some View {\n  ScrollView() {\n    \xe2\x80\xa6\n  }\n  .backgroundColor(.red)\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当您的应用程序不再支持旧的 iOS 版本时,您将收到警告,您的自定义视图修饰符不再需要 \xe2\x80\xa6 清理时间!

\n


小智 8

像这样

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))
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您需要将 `.edgesIgnoringSafeArea()` 添加到 **背景颜色**。来自 UIKit 的这很奇怪,但它确实有效! (2认同)
  • 注意:这是有效的,因为 `Spacer()` 将 VStack 推到屏幕的高度。 (2认同)

小智 6

您可以简单地更改视图的背景颜色:

var body : some View{


    VStack{

        Color.blue.edgesIgnoringSafeArea(.all)

    }


}
Run Code Online (Sandbox Code Playgroud)

您还可以使用 ZStack :

var body : some View{


    ZStack{

        Color.blue.edgesIgnoringSafeArea(.all)

    }


}
Run Code Online (Sandbox Code Playgroud)


jnb*_*ard 6

我喜欢声明一个修饰符来更改视图的背景颜色。

extension View {
  func background(with color: Color) -> some View {
    background(GeometryReader { geometry in
      Rectangle().path(in: geometry.frame(in: .local)).foregroundColor(color)
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我通过将颜色传递给视图来使用修改器。

struct Content: View {

  var body: some View {
    Text("Foreground Label").foregroundColor(.green).background(with: .black)
  }

}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


小智 6

struct Soview: View {
    var body: some View {
        VStack{
            Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
                .frame(maxWidth:.infinity,maxHeight: .infinity)
        }.background(Color.yellow).ignoresSafeArea(.all)
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

几种可能性:(SwiftUI / Xcode 11)

1 .background(Color.black) //for system colors

2 .background(Color("green")) //for colors you created in Assets.xcassets

  1. 否则,您可以在元素上执行Command+Click并从那里更改它。

希望它有帮助:)