The following extension makes it really simple to blend two colours together into a non-transparent colour.
For example, if you have a red colour (UIColor.redColor()
) and want to make it slightly darker, you could add UIColor(white: 0, alpha: 0.1)
to it (10% black).
This is achieved using the following code, which extracts the red, green, blue and alpha channels, and adds them together, returning a new UIColor
object.
import UIKit
extension UIColor {
func add(overlay: UIColor) -> UIColor {
var bgR: CGFloat = 0
var bgG: CGFloat = 0
var bgB: CGFloat = 0
var bgA: CGFloat = 0
var fgR: CGFloat = 0
var fgG: CGFloat = 0
var fgB: CGFloat = 0
var fgA: CGFloat = 0
self.getRed(&bgR, green: &bgG, blue: &bgB, alpha: &bgA)
overlay.getRed(&fgR, green: &fgG, blue: &fgB, alpha: &fgA)
let r = fgA * fgR + (1 - fgA) * bgR
let g = fgA * fgG + (1 - fgA) * bgG
let b = fgA * fgB + (1 - fgA) * bgB
return UIColor(red: r, green: g, blue: b, alpha: 1.0)
}
}
You can now make red slightly darker using the following:
let red = UIColor.redColor()
let black10 = UIColor(white: 0, alpha: 0.1)
let darkerRed = red.add(black10)
And of course, in Swift you can make this even easier by overriding the +
operator.
func +(lhs: UIColor, rhs: UIColor) -> UIColor {
return lhs.add(rhs)
}
This means you can now use:
let darkerRed = red + black10