ios - Color Tint UIButton Image
iphone ios7 (15)
A partir de iOS 7, hay un nuevo método en UIImage
para especificar el modo de representación. El uso del modo de reproducción UIImageRenderingModeAlwaysTemplate
permitirá que el color de la imagen se controle mediante el color del tinte del botón.
C objetivo
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *image = [[UIImage imageNamed:@"image_name"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[button setImage:image forState:UIControlStateNormal];
button.tintColor = [UIColor redColor];
Rápido
let button = UIButton(type: .custom)
let image = UIImage(named: "image_name")?.withRenderingMode(.alwaysTemplate)
button.setImage(image, for: .normal)
button.tintColor = UIColor.red
Noté que cuando UISegmentedControl
un UIImage
blanco o negro en un UISegmentedControl
, el color lo enmascara automáticamente para que coincida con el tono del control segmentado. Pensé que esto era realmente genial, y me preguntaba si podría hacer esto en otro lugar también. Por ejemplo, tengo un montón de botones que tienen una forma uniforme pero colores variados. En lugar de hacer un PNG para cada botón, ¿podría usar este enmascaramiento de color de alguna manera para usar la misma imagen para todos ellos y luego establecer un color de tinte o algo para cambiar su color real?
Cambiar imagen de botón o vista de imagen color de tinte Swift:
btn.imageView? .image = btn.imageView? .image? .withRenderingMode (.alwaysTemplate)
btn.imageView? .tintColor = #colorLiteral (rojo: 0, verde: 0, azul: 0, alfa: 1)
Como Ric ya mencionó en su post , puede configurar el modo de procesamiento en código, también puede hacerlo directamente en el catálogo de imágenes, vea la imagen adjunta a continuación. Solo configura el Render As
de Template Image
Advertencia , he tenido problemas con iOS 7 y este enfoque. Por lo tanto, si usa iOS 7, también querrá hacerlo en código para estar seguro, como se describe post .
Debe establecer el modo de representación de la imagen en UIImageRenderingModeAlwaysTemplate
para que tintColor
afecte a UIImage. Aquí está la solución en Swift:
let image = UIImage(named: "image-name")
let button = UIButton()
button.setImage(image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate), forState: .Normal)
button.tintColor = UIColor.whiteColor()
Deberías intentarlo
Después de configurar el marco
NSArray *arr10 =[NSArray arrayWithObjects:btn1,btn2,nil];
for(UIButton *btn10 in arr10)
{
CAGradientLayer *btnGradient2 = [CAGradientLayer layer];
btnGradient2.frame = btn10.bounds;
btnGradient2.colors = [NSArray arrayWithObjects:
(id)[[UIColor colorWithRed:151.0/255.0f green:206.0/255.5 blue:99.0/255.0 alpha:1] CGColor],
(id)[[UIColor colorWithRed:126.0/255.0f green:192.0/255.5 blue:65.0/255.0 alpha:1]CGColor],
nil];
[btn10.layer insertSublayer:btnGradient2 atIndex:0];
}
En Swift puedes hacerlo así:
var exampleImage = UIImage(named: "ExampleImage.png")?.imageWithRenderingMode(.AlwaysTemplate)
Luego en tu vistaDidLoad
exampleButtonOutlet.setImage(exampleImage, forState: UIControlState.Normal)
Y modificar el color.
exampleButtonOutlet.tintColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1) //your color
EDIT Xcode 8 Ahora puede también solo el modo de renderización de la imagen en sus archivos .x a la Imagen de la plantilla y luego ya no necesita declararlo específicamente en la var exampleImage
Ninguno de los anteriores funcionó para mí, porque el tinte se eliminó después de hacer clic. Tuve que usar
button.setImageTintColor(Palette.darkGray(), for: UIControlState())
No estoy seguro de lo que quieres, pero este método de categoría enmascara un UIImage con un color específico para que puedas tener una sola imagen y cambiar su color a lo que quieras.
ImageUtils.h
- (UIImage *) maskWithColor:(UIColor *)color;
ImageUtils.m
-(UIImage *) maskWithColor:(UIColor *)color
{
CGImageRef maskImage = self.CGImage;
CGFloat width = self.size.width;
CGFloat height = self.size.height;
CGRect bounds = CGRectMake(0,0,width,height);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
CGContextClipToMask(bitmapContext, bounds, maskImage);
CGContextSetFillColorWithColor(bitmapContext, color.CGColor);
CGContextFillRect(bitmapContext, bounds);
CGImageRef cImage = CGBitmapContextCreateImage(bitmapContext);
UIImage *coloredImage = [UIImage imageWithCGImage:cImage];
CGContextRelease(bitmapContext);
CGColorSpaceRelease(colorSpace);
CGImageRelease(cImage);
return coloredImage;
}
Importa la categoría ImageUtils y haz algo como esto ...
#import "ImageUtils.h"
...
UIImage *icon = [UIImage imageNamed:ICON_IMAGE];
UIImage *redIcon = [icon maskWithColor:UIColor.redColor];
UIImage *blueIcon = [icon maskWithColor:UIColor.blueColor];
Para Xamarin.iOS (C #):
UIButton messagesButton = new UIButton(UIButtonType.Custom);
UIImage icon = UIImage.FromBundle("Images/icon.png");
messagesButton.SetImage(icon.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate), UIControlState.Normal);
messagesButton.TintColor = UIColor.White;
messagesButton.Frame = new RectangleF(0, 0, 25, 25);
Si desea enmascarar manualmente su imagen, aquí se actualiza el código que funciona con las pantallas de retina
- (UIImage *)maskWithColor:(UIColor *)color
{
CGImageRef maskImage = self.CGImage;
CGFloat width = self.size.width * self.scale;
CGFloat height = self.size.height * self.scale;
CGRect bounds = CGRectMake(0,0,width,height);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
CGContextClipToMask(bitmapContext, bounds, maskImage);
CGContextSetFillColorWithColor(bitmapContext, color.CGColor);
CGContextFillRect(bitmapContext, bounds);
CGImageRef cImage = CGBitmapContextCreateImage(bitmapContext);
UIImage *coloredImage = [UIImage imageWithCGImage:cImage scale:self.scale orientation:self.imageOrientation];
CGContextRelease(bitmapContext);
CGColorSpaceRelease(colorSpace);
CGImageRelease(cImage);
return coloredImage;
}
Si tiene un botón personalizado con una imagen de fondo, puede configurar el color del tinte de su botón y anular la imagen con lo siguiente.
En activos, seleccione el fondo del botón que desea establecer color de tinte.
En el inspector de atributos de la imagen, el valor se representa como "Imagen de plantilla"
Ahora, cada vez que establezca button.tintColor = UIColor.red
su botón se mostrará en rojo.
Swift 4 con customType:
let button = UIButton(frame: aRectHere)
let buttonImage = UIImage(named: "imageName")
button.setImage(buttonImage?.withRenderingMode(.alwaysTemplate), for: .normal)
button.tintColor = .white
Swift 3.0
let image = UIImage(named:"NoConnection")!
warningButton = UIButton(type: .system)
warningButton.setImage(image, for: .normal)
warningButton.tintColor = UIColor.lightText
warningButton.frame = CGRect(origin: CGPoint(x:-100,y:0), size: CGSize(width: 59, height: 56))
self.addSubview(warningButton)
Swift 3 :
Esta solución podría ser cómoda si ya ha configurado su imagen a través de xCode interface builder. Básicamente tienes una extensión para colorear una imagen:
extension UIImage {
public func image(withTintColor color: UIColor) -> UIImage{
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
let context: CGContext = UIGraphicsGetCurrentContext()!
context.translateBy(x: 0, y: self.size.height)
context.scaleBy(x: 1.0, y: -1.0)
context.setBlendMode(CGBlendMode.normal)
let rect: CGRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
context.clip(to: rect, mask: self.cgImage!)
color.setFill()
context.fill(rect)
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
}
Luego, puede preparar esta extensión UIButton para colorear la imagen para un estado particular:
extension UIButton {
func imageWith(color:UIColor, for: UIControlState) {
if let imageForState = self.image(for: state) {
self.image(for: .normal)?.withRenderingMode(.alwaysTemplate)
let colorizedImage = imageForState.image(withTintColor: color)
self.setImage(colorizedImage, for: state)
}
}
}
Uso:
myButton.imageWith(.red, for: .normal)
PS (funcionando bien también en las celdas de la tabla, no necesita llamar al método setNeedDisplay()
, el cambio de color es inmediato debido a la extensión UIImage ..