Here is a Swift implementation that is safe to use. Works with colors in different color spaces, but mixes with RGBA:
func + (left: UIColor, right: UIColor) -> UIColor { var (r1, g1, b1, a1) = (CGFloat(0), CGFloat(0), CGFloat(0), CGFloat(0)) var (r2, g2, b2, a2) = (CGFloat(0), CGFloat(0), CGFloat(0), CGFloat(0)) left.getRed(&r1, green: &g1, blue: &b1, alpha: &a1) right.getRed(&r2, green: &g2, blue: &b2, alpha: &a2) return UIColor(red: (r1 + r2)/2, green: (g1 + g2)/2, blue: (b1 + b2)/2, alpha: (a1 + a2)/2) }
Using:
view.backgroundColor = .red + .white
Old answer:
extension UIColor { func blended(with color: UIColor) -> UIColor? { guard cgColor.colorSpace == color.cgColor.colorSpace else { return nil } return UIColor(cgColor: CGColor(colorSpace: cgColor.colorSpace!, components: zip(cgColor.components!, color.cgColor.components!).map { ($0 + $1) / 2 } )!) } }
But it only works with colors of the same color space, otherwise it will return zero. Here is a usage example:
let white = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) view.backgroundColor = UIColor.red.blended(with: white)
Artem sydorenko
source share