Estoy respondiendo a este hilo antiguo porque aparece constantemente en la búsqueda de una solución a este problema y no he visto ninguna solución en otro lugar. Es realmente molesto que setTintColor solo se aplique al estado resaltado de un UIButton. Hace seis meses, era igualmente molesto que se aplicara solo a iOS 5, pero es de esperar que sea un problema menor en el futuro. Con esto en mente, he recurrido y combinado varias sugerencias de la comunidad para componer una solución de propósito general para teñir un grupo de botones en su estado normal.
El siguiente método acepta un NSArray de UIButtons y un conjunto de especificaciones de color como entrada. Aplica las especificaciones de color a un botón usando setTintColor, representa el resultado en un UIImage y aplica esa imagen como imagen de fondo de todo el conjunto de botones. Esto evita la necesidad de crear archivos de imagen discretos para los colores de los botones. Además, lo hace usando una imagen extensible para que funcione con una colección de botones de diferentes tamaños (aunque tenga en cuenta que asume los factores de redondeo de esquina predeterminados de UIButton). Espero que lo encuentres útil para los objetivos de iOS 5.
- (void) setColorOfButtons:(NSArray*)buttons red:(float)red green:(float)green blue:(float)blue alpha:(float)alpha {
if (buttons.count == 0) {
return;
}
// get the first button
NSEnumerator* buttonEnum = [buttons objectEnumerator];
UIButton* button = (UIButton*)[buttonEnum nextObject];
// set the button's highlight color
[button setTintColor:[UIColor colorWithRed:red/255.9999f green:green/255.9999f blue:blue/255.9999f alpha:alpha]];
// clear any existing background image
[button setBackgroundImage:nil forState:UIControlStateNormal];
// place the button into highlighted state with no title
BOOL wasHighlighted = button.highlighted;
NSString* savedTitle = [button titleForState:UIControlStateNormal];
[button setTitle:nil forState:UIControlStateNormal];
[button setHighlighted:YES];
// render the highlighted state of the button into an image
UIGraphicsBeginImageContext(button.layer.frame.size);
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
[button.layer renderInContext:graphicsContext];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIImage* stretchableImage = [image stretchableImageWithLeftCapWidth:12 topCapHeight:0];
UIGraphicsEndImageContext();
// restore the button's state and title
[button setHighlighted:wasHighlighted];
[button setTitle:savedTitle forState:UIControlStateNormal];
// set background image of all buttons
do {
[button setBackgroundImage:stretchableImage forState:UIControlStateNormal];
} while (button = (UIButton*)[buttonEnum nextObject]);
}
Esto no funciona, me sale 'UIButton' puede no responder a '-setTintColor:' 'UIButton' puede no responder a 'setTintColor:' – Syntax
Tienes razón, lo revisé de nuevo, y esto solo funciona para iOS 5.0 y más tarde. En este caso, deberá crear un UIView, establecer su color de fondo y usar esta vista como imagen de fondo para el estado resaltado. – antalkerekes
Eso está bien, voy a dar una oportunidad al iOS 5. – Syntax