Skip to content

Instantly share code, notes, and snippets.

@vadimsmirnovnsk
Created April 7, 2017 04:17
Show Gist options
  • Save vadimsmirnovnsk/f1d1e3d82e7740add79e57dd77ec5bbf to your computer and use it in GitHub Desktop.
Save vadimsmirnovnsk/f1d1e3d82e7740add79e57dd77ec5bbf to your computer and use it in GitHub Desktop.
UIImage+Colorizable – paint image with color
internal extension UIImage {
private static let kSubstrateCircleDiameter: CGFloat = 24.0
/// Возвращает картинку, покрашенную в цвет color
internal func colorized(with color: UIColor?) -> UIImage {
guard let color = color else { return self }
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context = UIGraphicsGetCurrentContext()!
context.translateBy(x: 0.0, y: self.size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.setBlendMode(.normal)
let rect = CGRect(x: 0.0, y: 0.0, width: self.size.width, height: self.size.height)
context.clip(to: rect, mask: self.cgImage!)
color.setFill()
context.fill(rect)
let colorizedImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return colorizedImage
}
/// Возвращает картинку нарисованную на кружке цвета color, диаметром 24
internal func substrated(with color: UIColor?) -> UIImage {
guard let color = color else { return self }
let substrateSize = CGSize(width: UIImage.kSubstrateCircleDiameter,
height: UIImage.kSubstrateCircleDiameter)
// Рисуем кружок нужного цвета
UIGraphicsBeginImageContextWithOptions(substrateSize, false, UIScreen.main.scale)
let ctx = UIGraphicsGetCurrentContext()!
ctx.saveGState()
let rect = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: substrateSize)
ctx.setFillColor(color.cgColor)
ctx.fillEllipse(in: rect)
// Поверх кружка рисуем иконку по центру кружка
let overlayOrigin = CGPoint.init(x: substrateSize.width / 2.0 - self.size.width / 2.0,
y: substrateSize.height / 2.0 - self.size.height / 2.0)
let overlayRect = CGRect.init(origin: overlayOrigin, size: self.size)
// Переворачиваем контекст в нужную систему координат (флипаем иконку по y)
ctx.translateBy(x: 0.0, y: substrateSize.height)
ctx.scaleBy(x: 1.0, y: -1.0);
ctx.draw(self.cgImage!, in: overlayRect)
// И обратно ради хорощего тона
ctx.translateBy(x: 0.0, y: -overlayRect.size.height)
ctx.scaleBy(x: 1.0, y: -1.0);
ctx.restoreGState()
// Сливаем всё в итоговую картинку
let resultImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return resultImage
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment