简体   繁体   中英

Can UIColor be initialised with both dark and light mode color?

I am using random pastel colours in my training app (bouncing circles), but when my iPad is in dark mode, the pastels looks very bland. Can I somehow initialise UIColor with two colours? Maybe something like:

UIColor(forLightMode: UIColor, forDarkMode: UIColor)

My current app is creating new colours properly, but they do not change automatically, when I change from dark to light mode. The app is just starting to generate new ones from pastel set.

func makeRandomColor() -> UIColor {

    let fullRange : ClosedRange<CGFloat> = 0...255
    let pastelRange : ClosedRange<CGFloat> = 127...255

    let randomPastelRed     = CGFloat.random(in: pastelRange) / 255
    let randomPastelGreen   = CGFloat.random(in: pastelRange) / 255
    let randomPastelBlue    = CGFloat.random(in: pastelRange) / 255

    let randomRed           = CGFloat.random(in: fullRange) / 255
    let randomGreen         = CGFloat.random(in: fullRange) / 255
    let randomBlue          = CGFloat.random(in: fullRange) / 255

    let randomAlpha         = CGFloat.random(in: 0.6...1)

    return UIColor.init(dynamicProvider: { traitCollection in
        if traitCollection.userInterfaceStyle == .dark {
            return UIColor(
                red: randomRed,
                green: randomGreen,
                blue: randomBlue,
                alpha: randomAlpha
            )
        } else {
            return UIColor(
                red: randomPastelRed,
                green: randomPastelGreen,
                blue: randomPastelBlue,
                alpha: randomAlpha
            )
        }
    })

}

You'd need to listen to traitCollectionDidChange notification and redraw your UI either by calling setNeedsLayout() or similar methods from your UIView or UIViewController . For more Information check Implementing Dark Mode on iOS ~22min

You can do something like this:

var dynamicColor =  UIColor {(traitCollection: UITraitCollection) -> UIColor in
    if traitCollection.userInterfaceStyle == .dark {
        return .white
    } else {
        return .black
    }
}

Taken from a Screencast course on Ray Wenderlich (I'm not affiliated with the website): https://www.raywenderlich.com/3979883-dark-mode-deep-dive

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM