介紹
Environment 是 SwiftUI 中一個(gè)獨(dú)特而強(qiáng)大的功能,它不僅可以提供系統(tǒng)層面的環(huán)境信息,如colorScheme
(顏色模式)、locale
(本地化設(shè)置)等,還能獲取與特定視圖相關(guān)的狀態(tài),如presentationMode
(控制視圖的顯示與關(guān)閉)。通過合理使用 Environment,可以讓視圖在保持獨(dú)立性的同時(shí)具備對(duì)外部上下文的感知能力,是構(gòu)建可維護(hù) SwiftUI 應(yīng)用的重要工具。
設(shè)置
通過environment
修飾符可以設(shè)置 Environment 的值。
// 設(shè)置,第1個(gè)參數(shù)是KeyPath,第2個(gè)參數(shù)是對(duì)應(yīng)的值
ContentView().environment(\.colorScheme, .light)
獲取
通過@Environment
屬性包裝可以獲取 Environment 的值。
import SwiftUI
struct ContentView: View {
// 獲取,參數(shù)與設(shè)置時(shí)的KeyPath一致
@Environment(\.colorScheme) var colorScheme
var body: some View {
Group {
if colorScheme == .dark {
VStack {
Text("Hello")
Text("SwiftUI")
}
}
else {
HStack {
Text("Hello")
Text("SwiftUI")
}
}
}
}
}
自定義
Environment 支持自定義,可以創(chuàng)建一個(gè)自定義EnvironmentKey
,然后將所需的設(shè)置放到EnvironmentValues
中提供給外界使用。步驟如下。
- 遵守
EnvironmentKey
協(xié)議,提供默認(rèn)值。
struct ColorKey: EnvironmentKey {
static var defaultValue: Color = .red
}
- 擴(kuò)展
EnvironmentValues
,提供計(jì)算屬性,該屬性就是使用@Environment
時(shí)的參數(shù) KeyPath。
extension EnvironmentValues {
var customColor: Color {
get{ self[ColorKey.self] }
set{ self[ColorKey.self] = newValue }
}
}
- 使用。
import SwiftUI
struct ContentView: View {
@Environment(\.customColor) var customColor
var body: some View {
HStack {
Text("Hello")
Text("SwiftUI")
}
.foregroundColor(customColor) // 使用customColor
}
}
// 設(shè)置Environment值
ContentView().environment(\.customColor, .blue)
常見Environment
// 編輯模式
@Environment(\.editMode) var editMode
// 顏色模式
@Environment(\.colorScheme) var colorScheme
// 可判斷iPhone與iPad
@Environment(\.horizontalSizeClass) var horizontalSizeClass
// 關(guān)閉Modal
@Environment(\.presentationMode) var presentationMode
// 系統(tǒng)字體大小
@Environment(\.sizeCategory) private var category
// 本地化
@Environment(\.locale) var locale