Apparences de contrôle segmentées provoquant des problèmes
-
29-10-2019 - |
Question
J'ai besoin d'aide sur mes apparitions UISegment, j'ai défini ceci dans mon délégué d'application, tout fonctionne correctement.
Jusqu'à ce que j'ajoute ce code pour changer la couleur de mon segment sélectionné, cela posait des problèmes.
J'ai appelé l'IBAction lorsque viewDidLoad.
il est censé le montrer
appdelegate
//normal segment
[[UISegmentedControl appearance] setTitleTextAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"Rokkitt" size:20.0],UITextAttributeFont,
[UIColor colorWithRed:75.0/255.0 green:75.0/255.0 blue:75.0/255.0 alpha:1.0], UITextAttributeTextColor,
[UIColor clearColor], UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,
nil] forState:UIControlStateNormal];
//selected segment
[[UISegmentedControl appearance] setTitleTextAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"Rokkitt" size:20.0],UITextAttributeFont,
[UIColor whiteColor], UITextAttributeTextColor,
[UIColor clearColor], UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,
nil] forState:UIControlStateHighlighted];
Appel IBAction
// Get number of segments
int numSegments = [infoSegment.subviews count];
// Reset segment's color (non selected color)
for( int i = 0; i < numSegments; i++ ) {
// reset color
[[infoSegment.subviews objectAtIndex:i] setTintColor:[UIColor colorWithRed:196.0/255.0 green:223.0/255.0 blue:155.0/255.0 alpha:1]];
}
// Sort segments from left to right
NSArray *sortedViews = [infoSegment.subviews sortedArrayUsingFunction:compareViewsByOrigin context:NULL];
// Change color of selected segment
[[sortedViews objectAtIndex:infoSegment.selectedSegmentIndex] setTintColor:[UIColor colorWithRed:51.0/255.0 green:166.0/255.0 blue:85.0/255.0 alpha:1]];
// Remove all original segments from the control
for (id view in infoSegment.subviews) {
[view removeFromSuperview];
}
// Append sorted and colored segments to the control
for (id view in sortedViews) {
[infoSegment addSubview:view];
}
La solution
Il semble que le code ci-dessus ne définit que l'apparence du UIControlStateNormal
, vous devez également définir l'apparence du UIControlStateSelected
.
Autres conseils
belle façon de teinter les segments individuels, je cherchais quelque chose comme ça. Mais maintenant je me demande si c'est une manière "légale" ...
avec:
[[infoSegment.subviews objectAtIndex:i] setTintColor:[UIColor colorWithRed:196.0/255.0 green:223.0/255.0 blue:155.0/255.0 alpha:1]];
il semble que vous utilisez la propriété "privée" "tintColor" des éléments individuels dans UISegmentedControl, non officiellement déclarée par apple (elle est déclarée uniquement la propriété "tintColor" de l'ensemble de UISegmentedControl, puis apple l'utilise pour coloriser dans2 manière différente les éléments, l'un sélectionné et l'autre).
Donc, votre méthode pourrait vraiment fonctionner, et j'envisage de l'utiliser ... mais Apple pourrait rejeter votre application si elle est vraiment considérée comme une méthode de définition privée ... l'avez-vous déjà utilisé dans une application approuvée pour iStore?