UISegmentedControl hat die Segmentfarbe ausgewählt


70

Gibt es eine Möglichkeit, die Farbe des ausgewählten Segments in anzupassen UISegmentedControl?

Ich habe eine segmentedController.tintColorEigenschaft gefunden , mit der ich die Farbe des gesamten segmentierten Steuerelements anpassen kann. Das Problem ist, wenn ich eine helle Farbe für die tintColorEigenschaft 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?


Theoretisch soll diese Komponente dies verhindern. Wenn Sie Hintergrundfarbe und Farbton auswählen, wechselt dies für die ausgewählte und die abgewählte Farbe. Das heißt, wenn Sie Hintergrund-Schwarzweißtönung auswählen, wird bei Auswahl eine mit weißem Hintergrund und Schwarztönung versehen und umgekehrt.
Jose920405

Antworten:


53

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


3
Sie sollten Sanity Checks hinzufügen, wenn die Unteransicht auf die Selektoren isSelected und setTintColor reagiert. Wenn Apple die Funktionsweise von UISegmentedControl ändert, stürzt der Code ab.
srgtuszy

scheint mir, dass dies abgelehnt werden könnte. Hat jemand diesen Code im App Store ausprobiert?
Yonix

4
@yonix: Es scheint zwar ein Hack-Around zu sein, verwendet jedoch keine privaten APIs. Es sollte in Ordnung sein, es zu benutzen.
Tom Fobear

2
Dies war eine gute Lösung, aber ich fand, dass ich auch die Pause entfernen und hinzufügen musste else [[sender.subviews objectAtIndex:i] setTintColor:sender.tintColor];, um alte Farbtöne zurückzusetzen
elimirks

Ich habe den obigen Code in meiner App ausprobiert und er wird nicht abgelehnt. Ich denke, meine Zielversion ist 8. das wird nicht abgelehnt
ShujatAli

74

Hier 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:

  1. Legt den Steuerelementstil auf "StyleBar" fest, damit er funktioniert
  2. Setzt die nicht ausgewählte Farbe für das gesamte Steuerelement zuerst auf Orange
  3. Setzt die Farbe des ausgewählten Segments auf Grün

Anmerkungen:

  • Die Schritte 1 und 2 können im Interface Builder oder im Code wie gezeigt ausgeführt werden. Schritt 3 kann jedoch nur im Code ausgeführt werden
  • Die Farbwerte, die mit der folgenden Notation "123.0 / 255.0" festgelegt werden, sind nur eine Möglichkeit, die RGB-Werte hervorzuheben, anstatt die von UIColor geforderten normalisierten Gleitkommawerte (ignorieren Sie sie einfach, wenn Sie möchten).

Verrückte Requisiten an Sie, Mann, für die Veröffentlichung einer Antwort auf diese alte Frage. Ich habe es gefunden und Ihre Antwort hat mir sehr geholfen! Ich hatte bereits eine segmentierte Steuerung implementiert, sodass ich nur die allerletzte Zeile verwenden musste. Funktioniert perfekt, danke!
Stunner

9
@ Lee Whitney, ich denke, der Index des ausgewählten Segments unterscheidet sich vom Index der Unteransicht der segmentierten Steuerung.
Jack

5
Nun, das macht zu viel Sinn. Ich kann es einfach nicht zum Klicken bringen. Ich habe in IB einen 2-Segment-UISegCont erstellt, Index 0 ausgewählt und Darkgray den Farbton zugewiesen. Ich benutze dann die letzte Zeile, um die Farbe für ALLE ausgewählten Segmente zu definieren. Wenn der VC angezeigt wird, ist das Index-0-Segment schwarz und das Index-1-Segment dunkelgrau. Wenn ich dann auf das Index 1-Segment klicke, wird das Index 0-Segment in meiner benutzerdefinierten Farbe angezeigt. Huh? Es scheint, dass die Farben jedes Mal definiert werden müssen, wenn sich der UISegCiont-Status ändert.
mputnamtennessee

4
Das geht nicht Das Festlegen von newTintColor als tintColor des gesamten Steuerelements funktioniert, das Festlegen von newSelectedTintColor als tintColor der ersten Unteransicht bewirkt jedoch nichts.
Alexis

4
Hinweis: .segmentedControlStyle war in iOS 7.0
Taber

23

Dazu müssen Sie lediglich das ausgewählte Segment finden, indem Sie beispielsweise die Unteransichten des segmentierten Steuerelements durchlaufen und die isSelectedEigenschaft 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:animatedMethode 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];
    });

Vielen Dank für Ihren hilfreichen Kommentar zu iOS 6. Ich hatte Code, der die Farbtonfarbe für jedes Segment festlegte, das in iOS 6 nicht mehr funktionierte. Ihr Vorschlag hat mein Problem behoben.
Daveywc

Ja, ich habe festgestellt, dass meine Lösung für iOS 6 nicht funktioniert. Danke!
Mike Sprague

1
dispatch_get_current_queue () ist in iOS 6 veraltet. Verwenden Sie stattdessen dispatch_get_main_queue ().
Tadasz

Danke @tasasz Ich wollte die Antwort damit aktualisieren, als ich das bemerkte und alles vergaß, jetzt aktualisiert. Es ist nicht nur veraltet, dass dispatch_get_current_queue () nur während des Debuggens gemäß der Dokumentation verwendet werden sollte, zusammen mit der Tatsache, dass Änderungen an der Benutzeroberfläche nur im Hauptthread auftreten sollten!
David Thompson

9

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"


8

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];
    }
}

Danke, msprague! Funktioniert perfekt.
Lebensfreude

6

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

Es hat funktioniert, aber ich habe eine Frage zur ViewDidload-Methode. Mein segmentiertes Steuerelement wird mit Standardfarben geliefert. Nachdem sie einem Segmentindex eine Aktion gegeben haben, haben die Segmente ihre Farbe geändert, aber ich brauche dies zunächst, weil beim ersten Aufruf von viewdidload. Wie ist das möglich?
Anju

füge dies deiner uisegmentierten Unterklasse hinzu: - (void) drawRect: (CGRect) rect {[super drawRect: rect]; [self toggleHighlightColors]; }
Vassily

@Annie hat @Vassilys Vorschlag das Problem gelöst? Oder Sie können versuchen, - (void)setSelectedSegmentIndex:(NSInteger)selectedSegmentIndexIhre viewDidLoad:)
Hlung anzurufen

@ DeZigny froh, dass es dir gefällt: D.
Hlung

6

Ich weiß, dass dies eine alte Frage ist. Aber jetzt können Sie in xcode 11 + die ausgewählte Segmenttönungsfarbe einstellen Geben Sie hier die Bildbeschreibung ein

Im Code können wir verwenden selectedSegmentTintColor. verfügbar iOS 13+


1
Hinweis: Wenn Ihr Projekt ursprünglich in Xcode 10 oder älter erstellt wurde, müssen Sie möglicherweise das "Öffnen in" Ihrer Storyboard-Datei (im Dateiinspektor) auf Xcode 11 aktualisieren, um diese Funktion anzuzeigen.
Nathan Hosselton

3

Benutze das:

[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor colorWithRed:255.0/255 green:37.0/255 blue:99.0/255 alpha:1.0]} forState:UIControlStateSelected];


2

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)animatedmö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.


2

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;

2

Ich habe dies verwendet und es hat alle Farben in einem Schritt geändert.

mySegmentedControl.tintColor = [UIColor redColor]

1

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];
        }
    }
}

1

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];
    }    
}

1

Ich frage mich, warum jemand nicht erwähnt hat UIAppearanceProxy

Apple Doc ::

https://developer.apple.com/documentation/uikit/uisegmentedcontrol#1653545

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 AppDelegatevon abrufen

application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool


0

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


Ja, danke, denke, die Verwendung von UIButtons, die wie eine segmentierte Steuerung aussehen, ist der einzige Weg, wenn Sie benutzerdefinierte Farben wünschen ...
Mike

@ Mike: Ich denke auch. Vielleicht schlägt jemand eine andere Lösung vor, die kein Hack ist und die dokumentierte API tatsächlich verwendet.
Madhup Singh Yadav

0

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];  

0

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];


0
- (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]];
            }
        }
    }
}

0
Try this solution.    

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

        @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.

1
Warum fest codiert? Dies alles kann über das Storyboard erfolgen
OhadM

Geben Sie eine Gegenstimme für die Grundidee, in die Unteransichten zu graben und dort die Hintergrundfarbe zu ändern. Es ist ein undokumentiertes Verhalten, bietet aber eine einfache Lösung für mich, um die Hintergrundfarben einzelner Segmente zu steuern. (Objective-C: sender.subviews [0] .backgroundColor)
Jeff

0
- (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];
        }
    }
}

0
[segmentedControl setSelectedSegmentTintColor:[UIColor darkGrayColor]];

//For iOS 13

2
Bitte posten Sie nicht nur Code als Antwort, sondern geben Sie eine Erklärung an, was Ihr Code tut und wie er das Problem der Fragen löst. Antworten mit einer Erklärung sind im Allgemeinen von höherer Qualität und ziehen eher positive Stimmen an.
Mark Rotteveel

-1

Dieser Swift 4-Code funktioniert für mich

segmentedControl.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.red], for: .selected)

Ziemlich sicher, dass dadurch die Schriftfarbe des Texts geändert wird, nicht die Hintergrundfarbe des ausgewählten Elements.
Travis M.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.