UIColor greatest practices in Swift


What are shade fashions and shade areas?

A shade mannequin is a technique of describing a shade.

  • RGB – Purple+Inexperienced+Blue
  • HSB – Hue+Saturation+Brightness

There are a number of different shade fashions, however in case you are coping with iOS colours you ought to be accustomed to these two above. Normally you’ll work with the RGBA & HSBA shade fashions that are mainly the identical as above prolonged with the alpha channel the place the letter A stands for that. 😉

A shade house is the set of colours which could be displayed or reproduced in a medium (whether or not saved, printed or displayed). For instance, sRGB is a specific set of intensities for purple, inexperienced and blue and defines the colours that may be reproduced by mixing these ranges of purple, inexperienced and blue.

Sufficient from the idea, let’s do some shade magic! 💫💫💫

Learn how to work with UIColor objects utilizing RGBA and HSBA values in Swift?

Do you bear in mind the previous Paint program from old-school Home windows instances?

I’ve used Microsoft Paint so much, and I beloved it. 😅

Again then with none CS information I used to be at all times questioning in regards to the numbers between 0 and 255 that I needed to choose. In case you are working with RGB colours you often outline your shade the identical manner, besides that in iOS the values are between 0 and 1, however that is only a totally different illustration of the fraction of 255.

So you may make a shade with RGB codes utilizing the identical logic.

UIColor(
    purple: CGFloat(128)/CGFloat(255),
    inexperienced: CGFloat(128)/CGFloat(255),
    blue: CGFloat(128)/CGFloat(255),
    alpha: 1
)

UIColor(purple: 0.5, inexperienced: 0.5, blue: 0.5, alpha: 1)

See? Fairly straightforward, huh? 👍

Alternatively you need to use HSB values, virtually the identical logic applies for these values, besides that hue goes from 0 ’til 360 (due to the precise shade wheel), nonetheless saturation and brightness are measured in a “p.c like” format 0-100, so you need to take into consideration these numbers if you happen to map them to floating level values.

UIColor(hue: CGFloat(120)/CGFloat(360), saturation: 0.5, brightness: 0.5, alpha: 1)
UIColor(hue: 0.3, saturation: 0.5, brightness: 0.5, alpha: 1)

Now let’s reverse the state of affairs and let me present you easy methods to get again these elements from an precise UIColor occasion with the assistance of an extension.

public extension UIColor {
    public var rgba: (purple: CGFloat, inexperienced: CGFloat, blue: CGFloat, alpha: CGFloat) {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0
        self.getRed(&r, inexperienced: &g, blue: &b, alpha: &a)
        return (r, g, b, a)
    }

    public var hsba: (hue: CGFloat, saturation: CGFloat, brightness: CGFloat, alpha: CGFloat) {
        var h: CGFloat = 0
        var s: CGFloat = 0
        var b: CGFloat = 0
        var a: CGFloat = 0
        self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)
        return (h, s, b, a)
    }
}

So right here it’s easy methods to learn the purple, inexperienced blue slash hue saturation brightness and alpha elements from a UIColor. With this little neat extension you may merely get the part values and use them via their correct names.

UIColor.yellow.rgba.purple
UIColor.yellow.hsba.hue

Learn how to convert HEX colours to RGB and vica versa for UIColor objects in Swift?

iOS developer 101 course, first questions:

  • How the fuck can I create a UIColor from a hex string?
  • Learn how to convert a hex shade to a UIColor?
  • Learn how to use a hext string to make a UIColor?

Okay, possibly these usually are not the primary questions, nevertheless it’s undoubtedly inside widespread ones. The reply is fairly easy: via an extension. I’ve a very nice resolution on your wants, which is able to deal with a lot of the circumstances like utilizing just one, 2, 3 or 6 hex values.

public extension UIColor {

    public comfort init(hex: Int, alpha: CGFloat = 1.0) {
        let purple = CGFloat((hex & 0xFF0000) >> 16) / 255.0
        let inexperienced = CGFloat((hex & 0xFF00) >> 8) / 255.0
        let blue = CGFloat((hex & 0xFF)) / 255.0

        self.init(purple: purple, inexperienced: inexperienced, blue: blue, alpha: alpha)
    }

    public comfort init(hex string: String, alpha: CGFloat = 1.0) {
        var hex = string.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()

        if hex.hasPrefix("#") {
            let index = hex.index(hex.startIndex, offsetBy: 1)
            hex = String(hex[index...])
        }

        if hex.depend < 3 {
            hex = "(hex)(hex)(hex)"
        }

        if hex.vary(of: "(^[0-9A-Fa-f]{6}$)|(^[0-9A-Fa-f]{3}$)", choices: .regularExpression) != nil {
            if hex.depend == 3 {

                let startIndex = hex.index(hex.startIndex, offsetBy: 1)
                let endIndex = hex.index(hex.startIndex, offsetBy: 2)

                let redHex = String(hex[..<startIndex])
                let greenHex = String(hex[startIndex..<endIndex])
                let blueHex = String(hex[endIndex...])

                hex = redHex + redHex + greenHex + greenHex + blueHex + blueHex
            }

            let startIndex = hex.index(hex.startIndex, offsetBy: 2)
            let endIndex = hex.index(hex.startIndex, offsetBy: 4)
            let redHex = String(hex[..<startIndex])
            let greenHex = String(hex[startIndex..<endIndex])
            let blueHex = String(hex[endIndex...])

            var redInt: CUnsignedInt = 0
            var greenInt: CUnsignedInt = 0
            var blueInt: CUnsignedInt = 0

            Scanner(string: redHex).scanHexInt32(&redInt)
            Scanner(string: greenHex).scanHexInt32(&greenInt)
            Scanner(string: blueHex).scanHexInt32(&blueInt)

            self.init(purple: CGFloat(redInt) / 255.0,
                      inexperienced: CGFloat(greenInt) / 255.0,
                      blue: CGFloat(blueInt) / 255.0,
                      alpha: CGFloat(alpha))
        }
        else {
            self.init(purple: 0.0, inexperienced: 0.0, blue: 0.0, alpha: 0.0)
        }
    }

    var hexValue: String {
        var shade = self

        if shade.cgColor.numberOfComponents < 4 {
            let c = shade.cgColor.elements!
            shade = UIColor(purple: c[0], inexperienced: c[0], blue: c[0], alpha: c[1])
        }
        if shade.cgColor.colorSpace!.mannequin != .rgb {
            return "#FFFFFF"
        }
        let c = shade.cgColor.elements!
        return String(format: "#%02Xpercent02Xpercent02X", Int(c[0]*255.0), Int(c[1]*255.0), Int(c[2]*255.0))
    }
}

Right here is how you need to use it with a number of enter variations:

let colours = [
    UIColor(hex: "#cafe00"),
    UIColor(hex: "cafe00"),
    UIColor(hex: "c"),
    UIColor(hex: "ca"),
    UIColor(hex: "caf"),
    UIColor(hex: 0xcafe00),
]
let values = colours.map { $0.hexValue }
print(values) 

As you may see I’ve tried to copy the habits of the CSS guidelines, so you should have the liberty of much less characters if a hext string is like #ffffff (you need to use simply f, as a result of # is elective). Additionally you may present integers as nicely, that is only a easy “overloaded” comfort init technique.

Additionally .hexValue will return the string illustration of a UIColor occasion. 👏👏👏

Learn how to generate a random UIColor in Swift?

That is additionally a quite common query for newcomers, I do not actually need to waste the house right here by deep rationalization, arc4random() is simply doing it is job and the output is a pleasant randomly generated shade.

public extension UIColor {
    public static var random: UIColor {
        let max = CGFloat(UInt32.max)
        let purple = CGFloat(arc4random()) / max
        let inexperienced = CGFloat(arc4random()) / max
        let blue = CGFloat(arc4random()) / max

        return UIColor(purple: purple, inexperienced: inexperienced, blue: blue, alpha: 1.0)
    }
}

Learn how to create a 1×1 pixel large UIImage object with a single strong shade in Swift?

I am utilizing this trick to set the background shade of a UIButton object. The explanation for that is state administration. In case you press the button the background picture can be darker, so there can be a visible suggestions for the consumer. Nonetheless by setting the background shade instantly of a UIButton occasion will not work like this, and the colour will not change in any respect on the occasion. 👆

public extension UIColor {
    public var imageValue: UIImage {
        let rect = CGRect(origin: .zero, measurement: CGSize(width: 1, peak: 1))
        UIGraphicsBeginImageContext(rect.measurement)
        let context = UIGraphicsGetCurrentContext()!
        context.setFillColor(self.cgColor)
        context.fill(rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

The snippet above will produce a 1×1 pixel picture object from the supply shade. You should utilize that anywere, however right here is my instance with a button background:

button.setBackgroundImage(UIColor.purple.imageValue, for: .regular)

On-line shade palettes

You possibly can’t discover the correct shade? No downside, these hyperlinks will enable you to to decide on the correct one and to get some inspiration. Additionally in case you are in search of flat UI colours or materials design colours these are the correct hyperlinks the place you must head first.

A private factor of mine: expensive designers, please by no means ever attempt to use materials design ideas for iOS apps. Thanks. HIG

Convert colours on-line

Lastly there are some nice on-line shade converter instruments, in case you are in search of an awesome one, you must attempt these first.

Managing UIColors

In case your app goal is iOS 11+ you need to use asset catalogs to arrange your shade palettes, but when it is advisable go under iOS 11, I would counsel to make use of an enum or struct with static UIColor properties. These days I am often doing one thing like this.

class App {
    struct Shade {
        static var inexperienced: UIColor { return UIColor(hex: 0x4cd964) }
        static var yellow: UIColor { return UIColor(hex: 0xffcc00) }
        static var purple: UIColor { return UIColor(hex: 0xff3b30) }
    }

    
}

App.Shade.yellow

Normally I am grouping collectively fonts, colours and many others inside structs, however this is only one manner of doing issues. You can even use one thing like R.swift or something that you simply choose.

That is it for now, I believe I’ve coated a lot of the fundamental questions on UIColor.

Be at liberty to contact me you probably have a subject or suggestion that you simply’d wish to see coated right here within the weblog. I am at all times open for brand new concepts. 😉

Recent Articles

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Stay on op - Ge the daily news in your inbox