Gibt es eine Möglichkeit, die Farbe des ausgewählten Segments in anzupassen UISegmentedControl
?
Ich habe eine segmentedController.tintColor
Eigenschaft gefunden , mit der ich die Farbe des gesamten segmentierten Steuerelements anpassen kann. Das Problem ist, wenn ich eine helle Farbe für die tintColor
Eigenschaft auswähle , wird das ausgewählte Segment fast nicht wiederzuerkennen (seine Farbe entspricht fast der des übrigen segmentierten Steuerelements, so dass es schwierig ist, ausgewählte und nicht ausgewählte Segmente zu unterscheiden). Daher kann ich keine guten hellen Farben für die segmentierte Steuerung verwenden. Die Lösung wäre eine separate Eigenschaft für die ausgewählte Segmentfarbe, aber ich kann sie nicht finden. Hat jemand das gelöst?
Antworten:
Ich habe eine einfache Möglichkeit gefunden, Farbe für ausgewählte Segmente in UISegmentcontrol hinzuzufügen
Absender ist UISegmentControl
for (int i=0; i<[sender.subviews count]; i++) { if ([[sender.subviews objectAtIndex:i]isSelected] ) { UIColor *tintcolor=[UIColor colorWithRed:127.0/255.0 green:161.0/255.0 blue:183.0/255.0 alpha:1.0]; [[sender.subviews objectAtIndex:i] setTintColor:tintcolor]; } else { [[sender.subviews objectAtIndex:i] setTintColor:nil]; } }
Überprüfen Sie, ob es für mich funktioniert
quelle
else [[sender.subviews objectAtIndex:i] setTintColor:sender.tintColor];
, um alte Farbtöne zurückzusetzenHier ist die absolut einfachste Möglichkeit, das ausgewählte Segment in eine beliebige RGB-Farbe zu ändern . Keine Unterklassen oder Hacks erforderlich.
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; UIColor *newTintColor = [UIColor colorWithRed: 251/255.0 green:175/255.0 blue:93/255.0 alpha:1.0]; segmentedControl.tintColor = newTintColor; UIColor *newSelectedTintColor = [UIColor colorWithRed: 0/255.0 green:175/255.0 blue:0/255.0 alpha:1.0]; [[[segmentedControl subviews] objectAtIndex:0] setTintColor:newSelectedTintColor];
Dieses Beispiel zeigt die wichtigen Schritte:
Anmerkungen:
quelle
Dazu müssen Sie lediglich das ausgewählte Segment finden, indem Sie beispielsweise die Unteransichten des segmentierten Steuerelements durchlaufen und die
isSelected
Eigenschaft testen. Rufen Sie dann einfach das aufsetTintColor:
Methode für diese Unteransicht aufrufen.Dazu habe ich eine Aktion mit jedem segmentierten Steuerelement des ValueChanged-Ereignisses in Interface Builder verbunden. Ich habe sie mit dieser Methode in der View-Controller-Datei verbunden, die im Wesentlichen die Antwort von msprague ist :
- (IBAction)segmentedControlValueChanged:(UISegmentedControl*)sender { for (int i=0; i<[sender.subviews count]; i++) { if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[sender.subviews objectAtIndex:i]isSelected]) { [[sender.subviews objectAtIndex:i] setTintColor:[UIColor whiteColor]]; } if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[sender.subviews objectAtIndex:i] isSelected]) { [[sender.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]]; } } }
Um sicherzustellen, dass das Steuerelement bei jedem Öffnen der Ansicht durch den Benutzer korrekt angezeigt wird, musste ich die
-(void)viewDidAppear:animated
Methode auch überschreiben und die Methode wie folgt aufrufen:-(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //Ensure the segmented controls are properly highlighted [self segmentedControlValueChanged:segmentedControlOne]; [self segmentedControlValueChanged:segmentedControlTwo]; }
Für einige Bonuspunkte, wenn Sie das segmentierte Steuerelement so einstellen möchten, dass bei der Auswahl eine weiße Tönungsfarbe verwendet wird, möchten Sie auch die Farbe des Texts bei der Auswahl in Schwarz ändern. Gehen Sie dazu folgendermaßen vor:
//Create a dictionary to hold the new text attributes NSMutableDictionary * textAttributes = [[NSMutableDictionary alloc] init]; //Add an entry to set the text to black [textAttributes setObject:[UIColor blackColor] forKey:UITextAttributeTextColor]; //Set the attributes on the desired control but only for the selected state [segmentedControlOne setTitleTextAttributes:textAttributes forState:UIControlStateSelected];
Mit der Einführung von iOS 6 funktioniert das erstmalige Einstellen der Farbtonfarbe des ausgewählten Elements in der viewDidAppear-Methode nicht. Um dies zu umgehen, habe ich die ausgewählte Farbe mithilfe von Grand Central Dispatch nach einem Bruchteil einer Sekunde wie folgt geändert:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.05 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [self segmentedControlValueChanged:segmentedControlOne]; });
quelle
Aus irgendeinem Grund erlaubt Apple Ihnen nicht, die Farbe von Standard-UISegmentedControls zu ändern.
Es gibt jedoch einen "legalen" Weg, der darin besteht, den segmentierten Steuerungsstil in UISegmentedControlStyleBar zu ändern. Dadurch sieht es etwas anders aus, was Ihnen vielleicht nicht gefällt, aber es lässt Farbe zu.
NSArray *itemArray = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil]; UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:itemArray];
// Ändern Sie den Balkenstil und die Anzeige, um sie anzuzeigen, und geben Sie dann den segmentierten Controller frei
segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; segmentedControl.tintColor = [UIColor colorWithRed:.9 green:.1 blue:.1 alpha:1]; [self.view addSubview:segmentedControl]; [segmentedControl release];
Hoffe das hat geholfen,
Seb Kade "Ich bin hier um zu helfen"
quelle
Bearbeiten : Diese Lösung funktioniert nicht unter iOS 6. Siehe David Thompsons Antwort unten.
Dieser Thread ist wirklich alt, aber keine der einfachen Antworten hat bei mir richtig funktioniert.
Die akzeptierte Antwort funktioniert, solange Sie die Farbe der nicht ausgewählten segmentierten Steuerelemente zurücksetzen. So etwas funktioniert in Ihrer wertveränderten Funktion:
for (int i=0; i<[control.subviews count]; i++) { if ([[control.subviews objectAtIndex:i]isSelected] ) { UIColor *tintcolor=[UIColor colorWithRed:127.0/255.0 green:161.0/255.0 blue:183.0/255.0 alpha:1.0]; [[control.subviews objectAtIndex:i] setTintColor:tintcolor]; } else { UIColor *tintcolor=[UIColor grayColor]; // default color [[control.subviews objectAtIndex:i] setTintColor:tintcolor]; } }
quelle
Hier ist meine modifizierte Version von uihackers CustomSegmentedControl (siehe Gutschrift im Kommentar). Die Idee ist, dass ich die Art und Weise ändere, um die Unteransicht zu finden, in der die tintColor geändert werden soll, von der Verwendung von selectedIndex zur isSelected-Methode. Weil ich mit einem benutzerdefinierten UISegmentedControl gearbeitet habe, das 3 oder mehr Segmente enthält, deren Reihenfolge in der Unteransicht zufällig geändert wird (selbst das Flag "hasSetSelectedIndexOnce" von uihacker behebt dies nicht!). Der Code befindet sich noch in einem frühen Entwicklungsstadium. Verwenden Sie ihn daher auf eigenes Risiko. Jeder Kommentar ist willkommen :)
Außerdem habe ich dem Interface Builder Unterstützung hinzugefügt und setSelectedSegmentIndex überschrieben, damit auch die Farbe aktualisiert wird. Genießen!
CustomSegmentedControl.h
// // CustomSegmentedControl.h // // Created by Hlung on 11/22/54 BE. // Copyright (c) 2554 __MyCompanyName__. All rights reserved. // // Credit: http://uihacker.blogspot.com/2010/05/iphone-uisegmentedcontrol-custom-colors.html @interface CustomSegmentedControl : UISegmentedControl { UIColor *offColor,*onColor; } @property (nonatomic,retain) UIColor *offColor,*onColor; -(id)initWithItems:(NSArray *)items offColor:(UIColor*)offcolor onColor:(UIColor*)oncolor; @end
CustomSegmentedControl.m
#import "CustomSegmentedControl.h" @interface CustomSegmentedControl (private) -(void)setInitialMode; -(void)toggleHighlightColors; @end @implementation CustomSegmentedControl @synthesize offColor,onColor; -(id)initWithItems:(NSArray *)items offColor:(UIColor*)offcolor onColor:(UIColor*)oncolor { if (self = [super initWithItems:items]) { // Initialization code self.offColor = offcolor; self.onColor = oncolor; [self setInitialMode]; // default to 0, other values cause arbitrary highlighting bug [self setSelectedSegmentIndex:0]; } return self; } - (void)awakeFromNib { // default colors self.offColor = [UIColor colorWithWhite:0.8 alpha:1]; self.onColor = self.tintColor; [self setInitialMode]; [self setSelectedSegmentIndex:0]; } -(void)setInitialMode { // set essential properties [self setBackgroundColor:[UIColor clearColor]]; [self setSegmentedControlStyle:UISegmentedControlStyleBar]; // loop through children and set initial tint for( int i = 0; i < [self.subviews count]; i++ ) { [[self.subviews objectAtIndex:i] setTintColor:nil]; [[self.subviews objectAtIndex:i] setTintColor:offColor]; } // listen for updates, [self setSelectedSegmentIndex:0] triggers UIControlEventValueChanged in 5.0, 4.3 doesn't (facepalm), use if( self.window ) to fix this [self addTarget:self action:@selector(toggleHighlightColors) forControlEvents:UIControlEventValueChanged]; } // --------------- // hlung's version // --------------- -(void)toggleHighlightColors { // the subviews array order randomly changes all the time, change to check for "isSelected" instead for (id v in self.subviews) { if ([v isSelected]) [v setTintColor:onColor]; else [v setTintColor:offColor]; } } // override: update color when set selection - (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex { [super setSelectedSegmentIndex:selectedSegmentIndex]; [self toggleHighlightColors]; } // --------------- @end
quelle
- (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndex
IhreviewDidLoad
:)Ich weiß, dass dies eine alte Frage ist. Aber jetzt können Sie in xcode 11 + die ausgewählte Segmenttönungsfarbe einstellen
Im Code können wir verwenden
selectedSegmentTintColor
. verfügbar iOS 13+quelle
Benutze das:
[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor colorWithRed:255.0/255 green:37.0/255 blue:99.0/255 alpha:1.0]} forState:UIControlStateSelected];
quelle
Ich bin nicht sicher, ob dies vom App Store genehmigt wird, aber ich habe eine Unterklasse für UISegmentedControl geschrieben, mit der Sie eine benutzerdefinierte ausgewählte und nicht ausgewählte Farbe festlegen können. Überprüfen Sie die Notizen für weitere Informationen:
http://uihacker.blogspot.com/2010/05/iphone-uisegmentedcontrol-custom-colors.html
quelle
Um die oben von @jothikenpachi gegebene Antwort zu verdeutlichen, haben wir festgestellt, dass die folgende UISegmentController-Kategorie in iOS6 gut funktioniert und ein beliebiges Ein / Aus-Farbschema für Segmente zulässt. Außerdem schlägt es ordnungsgemäß fehl, wenn die privaten Methoden isSelected / setTintColor: in zukünftigen Betriebssystemversionen geändert werden. Vorsichtsmaßnahmen bei privaten API-Aufrufen usw.
@implementation UISegmentedControl(CustomTintExtension) { -(void) updateCustomTintColorOn:(UIColor*)onColor Off:(UIColor*)offColor { // Convenience function to rest the tint colors after selection, called upon change of selected index SEL tint = @selector(setTintColor:); for (UIView *view in [self subviews]) { // Loop through the views... if (view && ([view respondsToSelector:tint])) { [view performSelector:tint withObject:nil]; } if (view && ([view respondsToSelector:tint])) { [view performSelector:tint withObject:offColor]; } } // Checking if segment subview is selected... SEL isSelected = @selector(isSelected); for (UIView *view in [self subviews]) { if ([view respondsToSelector:isSelected] && [view performSelector:isSelected withObject:nil]) { [view performSelector:tint withObject:onColor]; break; } } }
Beachten Sie, dass diese Kategoriemethode aus dem UISegmentController heraus aufgerufen wird
- (IBAction) segmentAction: (id)sender
Methode wird.Beachten Sie auch, dass Sie diese Methode unter iOS6
- (void)viewDidAppear:(BOOL)animated
möglicherweise zunächst in den maßgeblichen UIViewControllern aufrufen müssen, was zu einem Animationsblitz führen kann. Um dies zu minimieren, versuchen Sie, "offColor" als tintColor des UISegmentControllers in IB festzulegen.quelle
Ich bin gerade auf dieses Problem unter iOS 7 gestoßen, das anders funktioniert als iOS6.
In iOS 7 entspricht die Farbe der Beschriftung für das ausgewählte Segment der Farbe des UISegementControl-Hintergrunds. Die einzige Möglichkeit, dies unter iOS 7 zu ändern, besteht darin, die Hintergrundfarbe des UISegmentControl festzulegen.
segmentControl.backgroundColor = customColor;
quelle
Ich habe dies verwendet und es hat alle Farben in einem Schritt geändert.
mySegmentedControl.tintColor = [UIColor redColor]
quelle
Ich habe festgestellt, dass ich in den Unteransichten ein Tag mit demselben Index wie die Segmente verwenden kann, damit die Segmente in beliebiger Reihenfolge korrekt gefärbt werden.
// In viewWillAppear set up the segmented control // then for 3 segments: self.navigationItem.titleView = segmentedControl; //Order of subviews can change randomly!, so Tag them with same index as segment [[[segmentedControl subviews]objectAtIndex:0]setTag:0]; [[[segmentedControl subviews]objectAtIndex:1]setTag:1]; [[[segmentedControl subviews]objectAtIndex:2]setTag:2]; // color follows the selected segment - (IBAction)mySelector:(id)sender { selector = [sender selectedSegmentIndex] for (id seg in [segmentedControl subviews]) { for (id label in [seg subviews]) { if ([seg tag] == selector){ [seg setTintColor:selectedColor]; } else { [seg setTintColor:nonSelectedColor]; } } } } // in viewDidAppear for returning to the view [segmentedControl setSelectedSegmentIndex:selector]; for (id seg in [segmentedControl subviews]) { for (id label in [seg subviews]) { if ([seg tag] == selector){ [seg setTintColor:selectedColor]; } else { [seg setTintColor:nonSelectedColor]; } } }
quelle
Die beiden besten Lösungen haben beim Wechsel zwischen den Segmenten nicht funktioniert.
Meine Lösung bestand darin, das Segmentänderungsereignis in meinem Ansichtscontroller zu behandeln und diese Methode dann jedes Mal aufzurufen, wenn das Segment geändert wird:
+ (void)setSegmentedControl:(UISegmentedControl *)segmentedControl selectedColor:(UIColor *)selectedColor deselectedColor:(UIColor *)deselectedColor { for (int i = 0; i < segmentedControl.subviews.count; i++) { id subView = [segmentedControl.subviews objectAtIndex:i]; if ([subView isSelected]) [subView setTintColor:selectedColor]; else [subView setTintColor:deselectedColor]; } }
quelle
Ich frage mich, warum jemand nicht erwähnt hat
UIAppearanceProxy
Apple Doc ::
Beispielcode:
private class func applyUISegmentControlAppearance(){ let apperance = UISegmentedControl.appearance() // Set Navigation bar Title colour let unselAttrib = [NSForegroundColorAttributeName:UIColor.yellow, NSFontAttributeName: UIFont.systemFont(ofSize: 15)] let selAttrib = [NSForegroundColorAttributeName:UIColor.red, NSFontAttributeName: UIFont.boldSystemFont(ofSize: 15)] apperance.setTitleTextAttributes(unselAttrib, for: .normal) apperance.setTitleTextAttributes(selAttrib, for: .selected) }
Aufruf von: Sie können diese Methode
AppDelegate
von abrufenquelle
Um Ihre Arbeit zu erledigen, müssen Sie möglicherweise auf die undokumentierten Funktionen und Hacks zugreifen, die Apple sicherlich wütend machen, und dies kann zur Ablehnung Ihres Antrags führen.
Die Lösung liegt nun in einem anderen Trick, bei dem Sie stattdessen zwei Schaltflächen verwenden und deren Bilder beim Klicken vertauschen. Halten Sie die Tasten näher und die Bilder der halb segmentierten Steuerung, um die Illusion einer segmentierten Steuerung zu erzeugen, und das ist alles, was ich Ihnen vorschlagen kann.
Hoffe das hilft.
Vielen Dank,
Madhup
quelle
Sie können jedes der Segmente mit Tags versehen und dann die TintColor forTag festlegen:
#define kTagOffState 0 #define kTagOnState 2 #define UIColorFromRGB(rgbValue) [UIColor \ colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \ green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \ blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] //usage UIColor color = UIColorFromRGB(0xF7F7F7); UIColor onColor = UIColorFromRGB(0xF7F7F7); UIColor offColor = UIColorFromRGB(0x878787); [multiStateControl setTag:kTagOffState forSegmentAtIndex:0]; [multiStateControl setTag:kTagOnState forSegmentAtIndex:1]; [multiStateControl setTintColor:onColor forTag:kTagOnState]; [multiStateControl setTintColor:offColor forTag:kTagOffState];
quelle
Ich fand die Antworten oben sehr hilfreich. Ich benutze die segmentierte Steuerung, um die Präzision eines Knopfes einzustellen. Ich habe eine Mischung der obigen Antworten genommen und mir Folgendes ausgedacht:
-(void) viewDidLoad { NSArray *segments = [NSArray arrayWithObjects:@"Course", @"Fine",nil]; [knob setPrecision:0.1]; // initial precision // Set starting values UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:segments]; segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; segmentedControl.frame = CGRectMake(120, 680, 228, 30); [segmentedControl addTarget:self action:@selector(precisionSelect:) forControlEvents:UIControlEventValueChanged]; segmentedControl.momentary = YES; [self.view addSubview:segmentedControl]; } - (void)precisionSelect:(UISegmentedControl*)sender { UIColor *tintcolor = [UIColor darkGrayColor]; if (sender.selectedSegmentIndex == 0) { [[sender.subviews objectAtIndex:0] setTintColor:nil]; [[sender.subviews objectAtIndex:1] setTintColor:tintcolor]; [knob setPrecision:0.1]; // Coarse } else { [[sender.subviews objectAtIndex:0] setTintColor:tintcolor]; [[sender.subviews objectAtIndex:1] setTintColor:nil]; [knob setPrecision:0.05]; // Fine } }
Hoffe, das hilft anderen. Ein Schlüssel für mich war, den nicht ausgewählten Index zurücksetzen zu können, indem ich:
setTintColor:nil];
quelle
- (IBAction)segmentControlValueChanged:(UISegmentedControl *)sender { if ([[sender.subviews firstObject] respondsToSelector:@selector(setTintColor:)]) { for (id segment in sender.subviews) { if ([segment respondsToSelector:@selector(isSelected)] && [segment isSelected]) { [segment setTintColor:[UIColor redColor]]; } else { [segment setTintColor:[UIColor grayColor]]; } } } }
quelle
Try this solution.
@IBAction func dashBoardSegmentValueChanged(sender: AnyObject) { switch dashBoardSegment.selectedSegmentIndex { case 0: sender.subviews.last?.backgroundColor = UIColor.whiteColor() sender.subviews.first?.backgroundColor = UIColor.clearColor() break; case 1: sender.subviews.first?.backgroundColor = UIColor.whiteColor() sender.subviews.last?.backgroundColor = UIColor.clearColor() break; default: break; } } Note: Make sure you select one segment subview as initial selected for easiness. It works if you have two segment subviews.
quelle
- (IBAction)segmentedControlValueChanged:(UISegmentedControl *)sender { for (int i = 0; i < sender.subviews.count; i++) { UIControl *component = [sender.subviews objectAtIndex:i]; if ([component respondsToSelector:@selector(isSelected)]) { UIColor *selectedColor = [UIColor greenColor]; UIColor *normalColor = [UIColor blackColor]; UIColor *tint = component.isSelected ? selectedColor : normalColor; [component setTintColor:tint]; } } }
quelle
[segmentedControl setSelectedSegmentTintColor:[UIColor darkGrayColor]]; //For iOS 13
quelle
Dieser Swift 4-Code funktioniert für mich
segmentedControl.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.red], for: .selected)
quelle