gpt4 book ai didi

ios - 更改颜色时 Swift 更新 UIColor

转载 作者:行者123 更新时间:2023-12-01 21:43:16 25 4
gpt4 key购买 nike

我正在使用扩展和结构中的 UIColor 和 CGColor 进行练习。一切正常,但我意识到如果将来我将添加“主题”功能,如果我从红色更改为蓝色,我如何在更改主题时更新所有 UIColor 和 CGColor?

例如,当我按下按钮将主题更改为蓝色时,它如何更新所有 UIColor/CGColor?

这是我的代码:

extension UIColor {
public class func dynamicColor(light: UIColor, dark: UIColor) -> UIColor {
return UIColor {
switch $0.userInterfaceStyle {
case .dark: return dark
default: return light
}
}
}
}
var themePick = "Red"
struct AiooColor {
static var tableviewerHeaderTitle: UIColor {
switch themePick {
case "Red": return UIColor.dynamicColor(light: UIColor.systemRed, dark: UIColor.systemRed)
case "Blue": return UIColor.dynamicColor(light: UIColor.systemBlue, dark: UIColor.systemBlue)
// DEFAULT WILL SET TO RED
default: return UIColor.dynamicColor(light: UIColor.systemRed, dark: UIColor.systemRed)
}
}

static var tableviewerHeaderBackground: UIColor {
switch themePick {
case "Red": return UIColor.dynamicColor(light: UIColor(red: 255/255, green: 204/255, blue: 204/255, alpha: 1), dark: UIColor(red: 30/255, green: 0/255, blue: 0/255, alpha: 1))
case "Blue": return UIColor.dynamicColor(light: UIColor(red: 204/255, green: 204/255, blue: 255/255, alpha: 1), dark: UIColor(red: 0/255, green: 0/255, blue: 30/255, alpha: 1))
// DEFAULT WILL SET TO RED
default: return UIColor.dynamicColor(light: UIColor(red: 20/255, green: 0/255, blue: 0/255, alpha: 1), dark: UIColor(red: 20/255, green: 0/255, blue: 0/255, alpha: 1))
}
}
}

最佳答案

假设您有以下结构来跟踪用户首选项键:

struct PreferenceKeys {
static let themeStyle = "theme_style"
}

以及以下枚举(带有原始类型)来描述您的主题风格:
enum ThemeStyle: Int {
case themeA = 0
case themeB
case themeC
case themeD
}

首先,我将创建一个自定义服务来管理您的主题。我们称之为 ThemeService。这将允许您存储和检索用户选择的事件主题样式。它可以像这样简单:
protocol ThemeServiceInterface {
func setThemeStyle(_ themeStyle: ThemeStyle)
func getThemeStyle() -> ThemeStyle
}

final class ThemeService: ThemeServiceInterface {

static let shared = ThemeService()

let userDefaults: UserDefaults

private init() {
self.userDefaults = UserDefaults.standard
}

func setThemeStyle(_ themeStyle: ThemeStyle) {
userDefaults.set(themeStyle.rawValue, forKey: PreferenceKeys.themeStyle)
}

func getThemeStyle() -> ThemeStyle {
let rawValue = userDefaults.integer(forKey: PreferenceKeys.themeStyle)
if let themeStyle = ThemeStyle(rawValue: rawValue) {
return themeStyle
}
return .themeA
}
}

因此,当您尝试访问特定颜色时,只需询问您的主题服务什么是事件主题样式,并相应地设置您的颜色。
extension UIColor {

static var primaryColor: UIColor {
switch ThemeService.shared.getThemeStyle() {
case .themeA: return .systemBlue
case .themeB: return .systemRed
case .themeC: return .systemGreen
case .themeD: return .systemIndigo
}
}

static var secondaryColor: UIColor {
.systemPink
}

// ...
}

现在,当您的用户想要设置新的主题样式时,您只需调用以下方法:
ThemeService.shared.setThemeStyle(.themeC)

这很棒,您新创建的所有 View 都将反射(reflect)新的主题风格。

但现在是我们需要为所有现有 View 重置 UI 的部分。好吧,根据你的项目结构,你会有不同的选择。

例如,您可以让 ThemeService 通过 NotificationCenter 发送通知。到你所有的屏幕,要求他们重新加载他们的 UI(例如使用 setNeedsDisplay()/ setNeedsLayout() 方法)

如果这听起来对您的项目来说工作量太大,另一种简单的方法可能是简单地重置 UIWindow 的 rootViewController。带有漂亮的动画,这将导致您的 UI 被重置并匹配事件的主题样式。

希望能帮助到你!

关于ios - 更改颜色时 Swift 更新 UIColor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62380191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com