La plupart des réponses ici ne répond pas à la question précise de la façon de définir une couleur de bouton en fonction de l'état sélectionné qui implique une autre couleur est souhaitée pour état non sélectionné. Je me suis battu avec cela pendant un certain temps et je voulais partager ma solution pour les autres à utiliser.
Mon exemple utilise un UISegmentedControl
avec trois segments. La couleur non sélectionnée pour les trois doit être la même pour lui donner un aspect uniforme. L'état sélectionné pour le premier et le dernier segment possède des couleurs uniques.
Le problème est que le contrôle segmentée n'est pas garanti d'être dans le même ordre si les couleurs se mélangeront que vous sélectionnez dans les deux sens. Dan a posté une solution qui utilise des balises mais malheureusement, il n'est plus garanti de fonctionner pour iOS 6 et plus.
La plus grande partie de ce code provient de this post. Je l'ai légèrement changé pour avoir des couleurs sélectionnées uniques.
Ce qui rend le travail est le tri, mais prendre note de ces 2 lignes importantes pour le réglage de la couleur sélectionnée:
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;
}
J'ai placé le code dans sa propre méthode parce que Je charge ces contrôles segmentés dans une vue de table et j'ai besoin de l'exécuter lors du chargement (états existants depuis le stockage) et lorsqu'un utilisateur change une sélection. Maintenant, je dois juste appeler [Self updateSegmentColors];
quand quelque chose change.
ne fonctionne pas pour moi –
travaillé parfaitement sur iOS 7 ... vous êtes incroyable! – CommaToast
Bonne solution sympa – DogCoffee