如何使用UserDefaults保存UIColor? [英] How do I save a UIColor with UserDefaults?

查看:88
本文介绍了如何使用UserDefaults保存UIColor?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对我的代码进行编程,以便如果用户按下夜间"按钮,则背景将变为黑色,并且如果用户关闭应用程序,则背景将保持黑色. (白天模式也是如此.)

I'm trying to program my code so that if the user presses the Night Button the background will turn black and stay black if the user closes the app. (Same goes for day mode.)

请注意:我已经对按钮进行了编码,当他们按下按钮时,所有场景都会切换到该模式.

Please note: I already coded buttons and when they press it, all of the scenes change to that mode.

这是我的代码,需要保存背景色:(两个if语句都需要)

Here's my code where I'm going going to need the background color to be saved: (I need it in both if statements)

if GlobalData.dayBool == true && GlobalData.night == false {
    backgroundColor = GlobalData.dayColor 
}

if GlobalData.nightBool == true && GlobalData.dayBool == false {
    backgroundColor = GlobalData.nightColor 
}

我的昼夜颜色:

struct GlobalData {
    static var score = 0
    static var dayColor = UIColor(red:0.93, green:0.93, blue:0.93, alpha:1.0)
    static var nightColor = UIColor(red:0.10, green:0.10, blue:0.10, alpha:1.0)  
    static var dayBool = true
    static var nightBool = true
}

推荐答案

Swift 5.2或更高版本

请注意,这只会将RGBA CGFloat值另存为属性列表中的数据".使用NSKeyedUnarchiver(NSCoding)的标准方法时,它将使用32个字节(原始数据),而不是所需的424个字节:

Note that this will save only the RGBA CGFloat values as Data inside the property list. This will use 32 bytes (raw data) instead of 424 bytes needed when using the standard approach with NSKeyedUnarchiver (NSCoding):

extension Numeric {
    var data: Data {
        var bytes = self
        return Data(bytes: &bytes, count: MemoryLayout<Self>.size)
    }
}


extension Data {
    func object<T>() -> T { withUnsafeBytes{$0.load(as: T.self)} }
    var cgFloat: CGFloat { object() }
    var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
        let size = MemoryLayout<CGFloat>.size
        return (subdata(in: size*0..<size*1).cgFloat,
                subdata(in: size*1..<size*2).cgFloat,
                subdata(in: size*2..<size*3).cgFloat,
                subdata(in: size*3..<size*4).cgFloat)
    }
}


extension UIColor {
    var rgba: (red: CGFloat,green: CGFloat,blue: CGFloat, alpha: CGFloat)? {
        var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0
        return getRed(&red, green: &green, blue: &blue, alpha: &alpha) ?
        (red, green, blue, alpha) : nil
    }
}


extension UserDefaults {
    func set(_ color: UIColor?, forKey defaultName: String) {
        guard let (red, green, blue, alpha) = color?.rgba else {
            removeObject(forKey: defaultName)
            return
        }
        set(red.data + green.data + blue.data + alpha.data, forKey: defaultName)
    }
    func color(forKey defaultName: String) -> UIColor? {
        guard let data = data(forKey: defaultName) else { return nil }
        let (red, green, blue, alpha) = data.rgba
        return UIColor(red: red, green: green, blue: blue, alpha: alpha)
    }
}


extension UserDefaults {
    var backgroundColor: UIColor? {
        get {
            return color(forKey: "backgroundColor")
        }
        set {
            set(newValue, forKey: "backgroundColor")
        }
    }
}


UserDefaults.standard.backgroundColor = .red
UserDefaults.standard.backgroundColor  // r 1.0 g 0.0 b 0.0 a 1.0

这篇关于如何使用UserDefaults保存UIColor?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆