La mayoría de las respuestas aquí no contesta la pregunta específica de cómo configurar un botón de color basado en el estado seleccionado que implica otro color que se desea para el estado no seleccionado. Luché con esto por bastante tiempo y quería compartir mi solución para que otros la usen.
Mi ejemplo utiliza un UISegmentedControl
con tres segmentos. El color no seleccionado para los tres debe ser el mismo para darle un aspecto uniforme. El estado seleccionado para el primer y último segmento tiene colores únicos.

La cuestión es que el control segmentado no está garantizado a estar en el mismo orden que los colores se mezclarán mientras selecciona un lado a otro. Dan publicó una solución que usa etiquetas, pero lamentablemente ya no se garantiza que funcione para iOS 6 en adelante.
La mayor parte de este código está tomado de this post. Lo cambié ligeramente para tener colores seleccionados únicos.
Lo que hace que el trabajo es la clasificación, pero tome nota de estas 2 líneas importantes para configurar el color seleccionado:
NSInteger selectedIdx = betterSegmentedControl.selectedSegmentIndex;
[[sortedViews objectAtIndex:selectedIdx] setTintColor:[self.segmentColors objectAtIndex:selectedIdx]];
- (void) updateSegmentColors
{
UIColor *checkColor = [UIColor colorWithRed: 29/255.0 green:166/255.0 blue:47/255.0 alpha:1.0];
NSArray *segmentColors = [[NSArray alloc] initWithObjects:checkColor, [UIColor blueColor], [UIColor redColor], nil];
UISegmentedControl *betterSegmentedControl = self.StatusControl;
// Get number of segments
NSUInteger numSegments = [betterSegmentedControl.subviews count];
// Reset segment's color (non selected color)
for(int i = 0; i < numSegments; i++) {
// reset color
[[betterSegmentedControl.subviews objectAtIndex:i] setTintColor:nil];
[[betterSegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor blueColor]];
}
// Sort segments from left to right
NSArray *sortedViews = [betterSegmentedControl.subviews sortedArrayUsingFunction:compareViewsByOrigin context:NULL];
// Change color of selected segment
NSInteger selectedIdx = betterSegmentedControl.selectedSegmentIndex;
[[sortedViews objectAtIndex:selectedIdx] setTintColor:[self.segmentColors objectAtIndex:selectedIdx]];
// Remove all original segments from the control
for (id view in betterSegmentedControl.subviews) {
[view removeFromSuperview];
}
// Append sorted and colored segments to the control
for (id view in sortedViews) {
[betterSegmentedControl addSubview:view];
}
}
NSInteger static compareViewsByOrigin(id sp1, id sp2, void *context)
{
// UISegmentedControl segments use UISegment objects (private API). But we can safely cast them to UIView objects.
float v1 = ((UIView *)sp1).frame.origin.x;
float v2 = ((UIView *)sp2).frame.origin.x;
if (v1 < v2)
return NSOrderedAscending;
else if (v1 > v2)
return NSOrderedDescending;
else
return NSOrderedSame;
}
coloqué el código en su propio método, ya Estoy cargando estos controles segmentados en una vista de tabla y necesito ejecutarlos durante la carga (estados existentes del almacenamiento) y cuando un usuario cambia una selección. Ahora solo necesito llamar al [Self updateSegmentColors];
cuando algo cambia.
no funciona para mí –
Trabajado perfectamente en iOS 7 ... ¡eres increíble! – CommaToast
Solución buena cosas buenas – DogCoffee