以下代碼成功檢測顏色是否為黑色,但不會檢測顏色何時為白色或任何其他顏色。
知道為什么下面的代碼只能檢測黑色而不是白色嗎?
func bgColor(bgColor: Color?)->Color{
var col:Color = .systemBackground
if bgColor == Color(UIColor(red: 0, green: 0, blue: 0, alpha: 1)){
// Works fine, detects black
col = .red
} else if bgColor == Color(UIColor(red: 1, green: 1, blue: 1, alpha: 1)){
// Does NOT work, doesn't detect white
col = .blue
}
return col
}
編輯:
我有一個ViewModifier我在符號化身影像上使用的,在這個化身影像中,用戶可以從顏色選擇器中選擇一種顏色,我的問題是我將其.systemBackground作為默認背景顏色,如果用戶選擇白色或黑色作為他們的頭像,黑色在暗模式下不可見,白色在亮模式下不可見,所以,我想做的是檢測用戶是否選擇了白色,我需要為亮模式回傳暗背景色,如果用戶選擇黑色我想在黑暗模式下回傳淺色背景。
struct AvatarImageModifier : ViewModifier {
@Environment(\.colorScheme) var colorScheme
var avatarColor:Color?
func body(content: Content) -> some View { content
.background(bgColor(bgColor: avatarColor))
}
func bgColor(bgColor: Color?)->Color{
var col:Color = .systemBackground
if bgColor == Color(UIColor(red: 0, green: 0, blue: 0, alpha: 1)){
if colorScheme == .dark{
col = .systemGray3
}else{
col = .systemBackground
}
} else if bgColor == Color(UIColor(red: 1, green: 1, blue: 1, alpha: 1)){
if colorScheme == .light{
col = .systemGray3
}
}
return col
}
}
uj5u.com熱心網友回復:
您可以Color通過首先將其轉換為UIColor. 這是我為此所做的一個小擴展:
import UIKit
import SwiftUI
extension Color {
enum Brightness {
case light, medium, dark, transparent
private enum Threshold {
static let transparent: CGFloat = 0.1
static let light: CGFloat = 0.75
static let dark: CGFloat = 0.3
}
init(brightness: CGFloat, alpha: CGFloat) {
if alpha < Threshold.transparent {
self = .transparent
} else if brightness > Threshold.light {
self = .light
} else if brightness < Threshold.dark {
self = .dark
} else {
self = .medium
}
}
}
var brightness: Brightness {
var b: CGFloat = 0
var a: CGFloat = 0
let uiColor = UIColor(self)
uiColor.getHue(nil, saturation: nil, brightness: &b, alpha: &a)
return .init(brightness: b, alpha: a)
}
}
Color.white.brightness // .light
Color.gray.brightness // .medium
Color.black.brightness // .dark
Color.clear.brightness // .transparent
這些閾值是臨時的,未經任何實際目的測驗。在Color.init這里使用還需要iOS 14 (https://developer.apple.com/documentation/uikit/uicolor/3550899-init)。
uj5u.com熱心網友回復:
這是適合您的正確方法:
struct ContentView: View {
@State private var backgroundColor: Color = Color(UIColor.systemBackground)
@State private var avatarColor: Color = Color.green
var body: some View {
ZStack {
backgroundColor
VStack(spacing: 20.0) {
Image(systemName: "person")
.font(Font.system(size: 100.0))
.modifier(AvatarImageModifier(avatarColor: avatarColor) { colorValue in backgroundColor = colorValue })
Button("Set avatarColor to white") { avatarColor = Color.white }
Button("Set avatarColor to black") { avatarColor = Color.black }
}
}
}
}
struct AvatarImageModifier : ViewModifier {
@Environment(\.colorScheme) var colorScheme
let avatarColor: Color
let backgroundColor: (Color) -> Void
func body(content: Content) -> some View {
content
.foregroundColor(avatarColor)
.preference(key: ColorPreferenceKey.self, value: avatarColor)
.onPreferenceChange(ColorPreferenceKey.self) { newValue in
if (newValue == Color.black) {
if (colorScheme == .dark) {
backgroundColor(Color(UIColor.systemGray3))
}
else {
backgroundColor(Color(UIColor.systemBackground))
}
}
else if (newValue == Color.white) {
if (colorScheme == .dark) {
backgroundColor(Color(UIColor.systemBackground))
}
else {
backgroundColor(Color(UIColor.systemGray3))
}
}
}
.onChange(of: colorScheme, perform: { newValue in
if (avatarColor == Color.black) {
if (newValue == .dark) {
backgroundColor(Color(UIColor.systemGray3))
}
else {
backgroundColor(Color(UIColor.systemBackground))
}
}
else if (avatarColor == Color.white) {
if (newValue == .dark) {
backgroundColor(Color(UIColor.systemBackground))
}
else {
backgroundColor(Color(UIColor.systemGray3))
}
}
})
}
}
struct ColorPreferenceKey: PreferenceKey {
static var defaultValue: Color { get { return Color.clear } }
static func reduce(value: inout Color, nextValue: () -> Color) { value = nextValue() }
}
uj5u.com熱心網友回復:
在您的更新中,您說用戶可以選擇他們頭像的背景顏色。并且您需要根據darkMode 和lightMode 為其添加一些內容。
那么,當用戶選擇背景顏色時,為什么不存盤一些東西呢?
struct User {
enum Background {
case white
case black
var color: Color {
switch self {
case .white: return .white
case .black: return .black
}
}
}
var selectedBG: Background
}
現在您不必擔心檢測顏色是什么。您在自己的列舉中擁有它。
然后你可以使用這里的 colorScheme 環境屬性......在 SwiftUI 中以編程方式檢測暗模式以顯示適當的影像
決定你想用背景做什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368982.html
