web-dev-qa-db-fra.com

Comment changer la couleur de la bordure UISegmentedControl dans iOS7?


Comment puis-je changer la couleur de la bordure du contrôleur segmenté dans iOS7 sans changer la couleur du texte?


Ce serait idéal si je pouvais garder la ligne entre les segments telle quelle (c'est-à-dire la même couleur que le texte), mais si un changement de couleur de bordure implique un changement de cette ligne, ce serait également correct.

Notez également que le texte (et les lignes entre les segments) ont la couleur définie avec
[segmCtrl setTintColor:choosenTintColor]

25
OscarWyck

J'ai donc résolu le problème moi-même. Ma solution donne à la bordure du contrôle segmenté une autre couleur, rien d'autre.

Afin de ne changer que la couleur de la bordure du contrôle segmenté, j'ai placé un autre contrôle segmenté au-dessus de mon ancien. J'ai désactivé l'interaction utilisateur pour ce nouveau, et j'ai défini l'image du segment sélectionné sur nil.

UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 40)];
// Header view for my main view

UISegmentedControl *subCat = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Segm 1", @"Segm 2", @"Segm 3", @"Segm 4", nil]]; 
// The UISegmentedController which I want to change color for

[subCat setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)];
[subCat setSelectedSegmentIndex:0];

UISegmentedControl *bcg = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@" ", @" ", @" ", @" ", nil]]; 
// The UISegmentedController I put on top of the other one

UIColor *subColor = [UIColor redColor];
[subCat setTintColor:subColor];
[bcg setFrame:CGRectMake(5, 5, [UIScreen mainScreen].bounds.size.width - 10, 30)];
[bcg setTintColor:[UIColor greenColor]];
[bcg setUserInteractionEnabled:NO];
[bcg setSelectedSegmentIndex:0];
[bcg setImage:nil forSegmentAtIndex:0]; // Removing highlight color


[header addSubview:subCat];
[header addSubview:bcg];

[[self view] addSubview:header];
11
OscarWyck

La réponse liée répond en effet à votre question, mais vous devez lire entre les lignes. Voici un exemple plus clair pour modifier tous les styles de contrôle segmentés dans l'application:

// Sets the tint color which typically sets the color of the segment images, text, dividers,
// borders, and selected segment. A translucent version of this color is also used to tint a
// segment when it is pressed and transitioning to being selected, as shown on the first
// segment below.
[[UISegmentedControl appearance] setTintColor:[UIColor blackColor]];

// The attributes dictionary can specify the font, text color, text shadow color, and text
// shadow offset for the title in the text attributes dictionary
[[UISegmentedControl appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]} forState:UIControlStateNormal];

Pour un contrôle dans l'application:

// Sets the tint color which typically sets the color of the segment images, text, dividers,
// borders, and selected segment. A translucent version of this color is also used to tint a
// segment when it is pressed and transitioning to being selected, as shown on the first
// segment below.
self.segControl.tintColor = [UIColor blackColor];

// The attributes dictionary can specify the font, text color, text shadow color, and text
// shadow offset for the title in the text attributes dictionary
[self.segControl setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor redColor]} forState:UIControlStateNormal];

Plus d'informations ici: https://developer.Apple.com/library/content/documentation/UserExperience/Conceptual/UIKitUICatalog/UISegmentedControl.html

54
iwasrobbed

Je résous de mettre en vueWillAppear mySegmentControl.selectedIndex pour tous les éléments. Ainsi, la couleur de teinte apparaît pour tous les segments. Bien sûr, après avoir sélectionné Tous les éléments, sélectionnez à nouveau votre élément par défaut.

1
Claudio Castro