Saya punya satu set ikon yang saya buat yang merupakan PNG putih transparan:
Dan yang ingin saya lakukan adalah bisa mewarnai mereka dengan warna lain. Seperti biru, abu-abu, dll.
Saya perhatikan bahwa 'diklik / disadap' berubah secara otomatis menjadi abu-abu. Jadi saya berasumsi saya bisa mengubah abu-abu itu menjadi apa pun yang saya suka baik dengan ketukan atau keadaan normalnya:
Apa cara terbaik untuk mencapai ini?
iOS 7 memperkenalkan properti yang disebut tintColor untuk tampilan (termasuk UIImageView). Namun Anda juga perlu menyetel jenis rendering pada UIImage agar ini memiliki efek apa pun.
UIImage *originalImage = [UIImage imageNamed:@"image.png"]; UIImage *tintedImage = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIImageView *imageView = [[UIImageView alloc] initWithImage:tintedImage]; imageView.tintColor = [UIColor grayColor]; [self.view addSubview:imageView];
Ini akan menghasilkan efek yang Anda kejar dalam keadaan default.
sumber
Anda dapat menggunakan ekstensi ini:
import UIKit extension CGContext { func fill(_ rect: CGRect, with mask: CGImage, using color: CGColor) { saveGState() defer { restoreGState() } translateBy(x: 0.0, y: rect.size.height) scaleBy(x: 1.0, y: -1.0) setBlendMode(.normal) clip(to: rect, mask: mask) setFillColor(color) fill(rect) } } extension UIImage { func filled(with color: UIColor) -> UIImage { let rect = CGRect(origin: .zero, size: self.size) guard let mask = self.cgImage else { return self } if #available(iOS 10.0, *) { let rendererFormat = UIGraphicsImageRendererFormat() rendererFormat.scale = self.scale let renderer = UIGraphicsImageRenderer(size: rect.size, format: rendererFormat) return renderer.image { context in context.cgContext.fill(rect, with: mask, using: color.cgColor) } } else { UIGraphicsBeginImageContextWithOptions(rect.size, false, self.scale) defer { UIGraphicsEndImageContext() } guard let context = UIGraphicsGetCurrentContext() else { return self } context.fill(rect, with: mask, using: color.cgColor) return UIGraphicsGetImageFromCurrentImageContext() ?? self } } }
sumber
Untuk mengubah warna gambar ( pilih , gambar klasik , foto ) gunakan:
Contoh gambar:
Cepat 2
public extension UIImage { /** Tint, Colorize image with given tint color<br><br> This is similar to Photoshop's "Color" layer blend mode<br><br> This is perfect for non-greyscale source images, and images that have both highlights and shadows that should be preserved<br><br> white will stay white and black will stay black as the lightness of the image is preserved<br><br> <img src="http://yannickstephan.com/easyhelper/tint1.png" height="70" width="120"/> **To** <img src="http://yannickstephan.com/easyhelper/tint2.png" height="70" width="120"/> - parameter tintColor: UIColor - returns: UIImage */ public func tintPhoto(tintColor: UIColor) -> UIImage { return modifiedImage { context, rect in // draw black background - workaround to preserve color of partially transparent pixels CGContextSetBlendMode(context, .Normal) UIColor.blackColor().setFill() CGContextFillRect(context, rect) // draw original image CGContextSetBlendMode(context, .Normal) CGContextDrawImage(context, rect, self.CGImage) // tint image (loosing alpha) - the luminosity of the original image is preserved CGContextSetBlendMode(context, .Color) tintColor.setFill() CGContextFillRect(context, rect) // mask by alpha values of original image CGContextSetBlendMode(context, .DestinationIn) CGContextDrawImage(context, rect, self.CGImage) } } /** Tint Picto to color - parameter fillColor: UIColor - returns: UIImage */ public func tintPicto(fillColor: UIColor) -> UIImage { return modifiedImage { context, rect in // draw tint color CGContextSetBlendMode(context, .Normal) fillColor.setFill() CGContextFillRect(context, rect) // mask by alpha values of original image CGContextSetBlendMode(context, .DestinationIn) CGContextDrawImage(context, rect, self.CGImage) } } /** Modified Image Context, apply modification on image - parameter draw: (CGContext, CGRect) -> ()) - returns: UIImage */ private func modifiedImage(@noescape draw: (CGContext, CGRect) -> ()) -> UIImage { // using scale correctly preserves retina images UIGraphicsBeginImageContextWithOptions(size, false, scale) let context: CGContext! = UIGraphicsGetCurrentContext() assert(context != nil) // correctly rotate image CGContextTranslateCTM(context, 0, size.height); CGContextScaleCTM(context, 1.0, -1.0); let rect = CGRectMake(0.0, 0.0, size.width, size.height) draw(context, rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image } }
UPD
Cepat 3
extension UIImage { /** Tint, Colorize image with given tint color<br><br> This is similar to Photoshop's "Color" layer blend mode<br><br> This is perfect for non-greyscale source images, and images that have both highlights and shadows that should be preserved<br><br> white will stay white and black will stay black as the lightness of the image is preserved<br><br> <img src="http://yannickstephan.com/easyhelper/tint1.png" height="70" width="120"/> **To** <img src="http://yannickstephan.com/easyhelper/tint2.png" height="70" width="120"/> - parameter tintColor: UIColor - returns: UIImage */ func tintPhoto(_ tintColor: UIColor) -> UIImage { return modifiedImage { context, rect in // draw black background - workaround to preserve color of partially transparent pixels context.setBlendMode(.normal) UIColor.black.setFill() context.fill(rect) // draw original image context.setBlendMode(.normal) context.draw(cgImage!, in: rect) // tint image (loosing alpha) - the luminosity of the original image is preserved context.setBlendMode(.color) tintColor.setFill() context.fill(rect) // mask by alpha values of original image context.setBlendMode(.destinationIn) context.draw(context.makeImage()!, in: rect) } } /** Tint Picto to color - parameter fillColor: UIColor - returns: UIImage */ func tintPicto(_ fillColor: UIColor) -> UIImage { return modifiedImage { context, rect in // draw tint color context.setBlendMode(.normal) fillColor.setFill() context.fill(rect) // mask by alpha values of original image context.setBlendMode(.destinationIn) context.draw(cgImage!, in: rect) } } /** Modified Image Context, apply modification on image - parameter draw: (CGContext, CGRect) -> ()) - returns: UIImage */ fileprivate func modifiedImage(_ draw: (CGContext, CGRect) -> ()) -> UIImage { // using scale correctly preserves retina images UIGraphicsBeginImageContextWithOptions(size, false, scale) let context: CGContext! = UIGraphicsGetCurrentContext() assert(context != nil) // correctly rotate image context.translateBy(x: 0, y: size.height) context.scaleBy(x: 1.0, y: -1.0) let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height) draw(context, rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image! } }
sumber
Jika Anda menyetel gambar untuk sebuah tombol, buka saja inspektur atribut dan ubah jenis tombol ke sistem. Kemudian atur gambar dan ubah warna tint. Warna gambar akan berubah. Jika tidak berhasil, periksa jenis tombolnya.
sumber
Swift 4 atau 5
extension UIButton{ func setImageTintColor(_ color: UIColor) { let tintedImage = self.imageView?.image?.withRenderingMode(.alwaysTemplate) self.setImage(tintedImage, for: .normal) self.tintColor = color } }
Menggunakan:
button.setImage(UIImage(named: "image_name"), for: .normal) // You can set image direct from Storyboard button.setImageTintColor(UIColor.white)
sumber
Jika Anda menggunakan katalog aset, Anda dapat menyetel aset gambar itu sendiri untuk dirender dalam mode template. Setelah itu Anda dapat mengatur tintColor tombol di Interface Builder (atau dalam kode) dan itu harus dilakukan.
sumber
Cepat 4
let origImage = UIImage(named: "check") let tintedImage = origImage?.withRenderingMode(.alwaysTemplate) buttons[0].setImage(tintedImage, for: .normal) buttons[0].tintColor = .red
sumber
Jika Anda menggunakan katalog aset, Anda dapat menyetel aset gambar itu sendiri untuk dirender dalam mode template. Setelah itu Anda dapat mengatur tintColor tombol di Interface Builder (atau dalam kode) dan itu harus dilakukan.
sumber
Saya menemukan pendekatan termudah di bawah ini,
Terbuka assetcatalog dan pilih gambar kemudian pergi ke atribut inspektur dan perubahan
Render As
untukTemplate Image
seperti di bawah iniKemudian tambahkan kode di bawah ini dalam metode Tindakan tombol
sumber
Swift 4 dan 4.2
let img = UIImage.init(named: "buttonName")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate) btn.setImage(img, for: .normal) btn.tintColor = .gray
sumber