ios - bar - ¿Cómo puedo cambiar la imagen tintColor
uinavigationitem title color (11)
Así es como aplico y uso los tintes en IOS 9 con Swift.
//apply a color to an image
//ref - http://stackoverflow.com/questions/28427935/how-can-i-change-image-tintcolor
//ref - https://www.captechconsulting.com/blogs/ios-7-tutorial-series-tint-color-and-easy-app-theming
func getTintedImage() -> UIImageView {
var image : UIImage;
var imageView : UIImageView;
image = UIImage(named: "someAsset")!;
let size : CGSize = image.size;
let frame : CGRect = CGRectMake((UIScreen.mainScreen().bounds.width-86)/2, 600, size.width, size.height);
let redCover : UIView = UIView(frame: frame);
redCover.backgroundColor = UIColor.redColor();
redCover.layer.opacity = 0.75;
imageView = UIImageView();
imageView.image = image.imageWithRenderingMode(UIImageRenderingMode.Automatic);
imageView.addSubview(redCover);
return imageView;
}
Recibo una imagen de un servidor, luego, según el color elegido por el usuario, el color de la imagen cambiará.
Intenté lo siguiente:
_sketchImageView.image = [_sketchImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[_sketchImageView setTintColor:color];
Obtuve lo contrario de mi objetivo (el color blanco fuera de UIImage está coloreado con el color elegido).
que va mal
Necesito hacer lo mismo en esta pregunta, la solución provista no resuelve mi caso. ¿Cómo puedo cambiar la imagen tintColor en iOS y WatchKit?
En Swift 2.0 puedes usar este
let image = UIImage(named:"your image name")?.imageWithRenderingMode(.AlwaysTemplate)
let yourimageView.tintColor = UIColor.redColor()
yourimageView.image = image
En Swift 3.0 puedes usar esto
let image = UIImage(named:"your image name")?.withRenderingMode(.alwaysTemplate)
let yourimageView.tintColor = UIColor.red
yourimageView.image = image
En Swift 3.0 puede usar esta extensión: [Basado en la solución object-c de @ VietHung]
extension UIImage {
func imageWithColor(_ color: UIColor) -> UIImage? {
var image = imageWithRenderingMode(.alwaysTemplate)
UIGraphicsBeginImageContextWithOptions(size, false, scale)
color.set()
image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
En Swift puede usar esta extensión: [Basado en la solución object-c de @ VietHung]
extension UIImage {
func imageWithColor(color: UIColor) -> UIImage? {
var image = imageWithRenderingMode(.AlwaysTemplate)
UIGraphicsBeginImageContextWithOptions(size, false, scale)
color.set()
image.drawInRect(CGRect(x: 0, y: 0, width: size.width, height: size.height))
image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Intenta generar nueva imagen por ti mismo.
UIImage *newImage = [_sketchImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIGraphicsBeginImageContextWithOptions(image.size, NO, newImage.scale);
[yourTintColor set];
[newImage drawInRect:CGRectMake(0, 0, image.size.width, newImage.size.height)];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
_sketchImageView.image = newImage;
Y úsalo.
Buena suerte
======= ACTUALIZACIÓN =======
Esta solución solo cambiará el color de la imagen de todos los píxeles.
Ejemplo: tenemos una imagen de libro: http://pngimg.com/upload/book_PNG2113.png
Y después de ejecutar el código anterior (exp: TintColor
es ROJO). Tenemos:
SO: cómo es su imagen depende de cómo la diseñó
Intente establecer el color del tinte en la vista de la vista de imagen. Por ejemplo, [self.view setTintColor:color];
Para Swift 3.0, hice una subclase personalizada de UIImageView llamada TintedUIImageView. Ahora la imagen utiliza cualquier color de tinte establecido en el generador de interfaz o el código
class TintedUIImageView: UIImageView {
override func awakeFromNib() {
if let image = self.image {
self.image = image.withRenderingMode(.alwaysTemplate)
}
}
}
Prueba algo como esto
UIImage *originalImage = _sketchImageView.image
UIImage *newImage = [originalImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,50,50)]; // your image size
imageView.tintColor = [UIColor redColor]; // or whatever color that has been selected
imageView.image = newImage;
_sketchImageView.image = imageView.image;
Espero que esto ayude.
Puedes probar:
_sketchImageView.image = [self imageNamed:@"imageName" withColor:[UIColor blackColor]];
- (UIImage *)imageNamed:(NSString *)name withColor:(UIColor *)color
{
// load the image
//NSString *name = @"badge.png";
UIImage *img = [UIImage imageNamed:name];
// begin a new image context, to draw our colored image onto
UIGraphicsBeginImageContext(img.size);
// get a reference to that context we created
CGContextRef context = UIGraphicsGetCurrentContext();
// set the fill color
[color setFill];
// translate/flip the graphics context (for transforming from CG* coords to UI* coords
CGContextTranslateCTM(context, 0, img.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// set the blend mode to color burn, and the original image
CGContextSetBlendMode(context, kCGBlendModeColorBurn);
CGRect rect = CGRectMake(0, 0, img.size.width, img.size.height);
CGContextDrawImage(context, rect, img.CGImage);
// set a mask that matches the shape of the image, then draw (color burn) a colored rectangle
CGContextClipToMask(context, rect, img.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context,kCGPathFill);
// generate a new UIImage from the graphics context we drew onto
UIImage *coloredImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//return the color-burned image
return coloredImg;
}
Una cosa que puede hacer es simplemente agregar sus imágenes a la carpeta Activos en XCode y luego cambiar el modo de renderización a Imagen de plantilla, por lo que cada vez que cambie el color del tinte de UIImageView, cambiará automáticamente la imagen.
en Swift 4 puedes simplemente hacer una extensión como esa:
import UIKit extension UIImageView { func tintImageColor(color: UIColor) { guard let image = image else { return } self.image = image.withRenderingMode(UIImageRenderingMode.alwaysTemplate) self.tintColor = color } }