Die meisten der hier Antworten beantworten nicht die spezifische Frage, wie auf ausgewählten Zustand eine Schaltfläche Farbe einzustellen basiert, die eine andere Farbe bedeutet, ist für nicht-ausgewählten Zustand gewünscht. Ich habe lange damit gerungen und wollte meine Lösung für andere nutzen. In meinem Beispiel wird ein UISegmentedControl
mit drei Segmenten verwendet. Die nicht ausgewählte Farbe für alle drei sollte gleich sein, um ein einheitliches Aussehen zu erhalten. Der ausgewählte Status für das erste und letzte Segment hat eindeutige Farben.
Das Problem ist, dass die segmentierte Kontrolle nicht in der gleichen Reihenfolge sein, ist garantiert, so dass die Farben, wie Sie und her wählen zurück gemischt. Dan hat eine Lösung veröffentlicht, die Tags verwendet, aber leider funktioniert es nicht mehr für iOS 6 und höher.
Der größte Teil dieses Codes stammt aus this post. Ich habe es leicht geändert, um einzigartige ausgewählte Farben zu haben.
Was es Arbeit macht, ist die Sortierung aber nehmen diese zwei wichtigen Linien für die gewählte Farbeinstellung:
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;
}
ich den Code platziert in einem eigenen Verfahren wegen Ich lade diese segmentierten Steuerelemente in einer Tabellenansicht und muss sie beim Laden ausführen (vorhandene Status aus dem Speicher) und wenn ein Benutzer eine Auswahl ändert. Jetzt muss ich nur [Self updateSegmentColors];
aufrufen, wenn sich etwas ändert.
funktioniert nicht für mich ändern wollen –
Arbeitete perfekt auf iOS 7 ... du bist unglaublich! – CommaToast
Gute Sachen nette Lösung – DogCoffee