UISegmentedControl con color personalizado: error de línea separadora

Es fácil cambiar el color de UISegmentedControl. Encontré varias soluciones como esta , este sitio y la mejor solución . Pero ninguno fue lo que quiero.

Intenté crear una cosa simple y funciona muy fácil, este era mi código: (estoy usando el iOS 4.2, no el 5.0 y el xcode 4.0.2)

id segment[3]; UISegmentedControl *segmentedControl; - (id)init { NSArray *itens = [NSArray arrayWithObjects: @"Option 1", @"Option 2", @"Option 3", nil]; segmentedControl = [[UISegmentedControl alloc] initWithItems:itens]; [segmentedControl setFrame:CGRectMake(0, 0, 500, 30)]; [segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar]; [segmentedControl addTarget:self action:@selector(segmentedControl:) forControlEvents:UIControlEventAllEvents]; switch (type) { case type1: [segmentedControl setSelectedSegmentIndex:0]; break; case type2: [segmentedControl setSelectedSegmentIndex:1]; break; case type3: [segmentedControl setSelectedSegmentIndex:2]; break; } for (int i=0; i<3; i++) { //The most important trick to work, have to retain the subviews segment[i] = [[[segmentedControl subviews] objectAtIndex:i] retain]; } [self changeColor]; [self addSubview:segmentedControl]; return self; } - (void)segmentedControl:(id)sender { //do some thing [self changeColor]; } - (void)changeColor{ for (int i=0; i<3; i++) { [segment[i] setTintColor:[UIColor lightGrayColor]]; } int select = segmentedControl.selectedSegmentIndex; [segment[select] setTintColor:[UIColor blueColor]]; } 

Entonces crea esto:

primera imagen

Muy bien, luego hago clic en la Option 2

segundo

Vaya, esto es exactamente lo que quiero, así que haz clic en la Option 3

problema

Ahora el problema, esta estúpida línea azul (marcada en el cuadrado rojo) entre la Option 1 y la Option 2 . Si vuelvo a hacer clic en la Option 1 , tendré:

aburrido

Que la línea azul aparezca nuevamente. Esto significa que cada lado izquierdo en el segmento de clic anterior (pero no con el primero) tendrá esta línea azul. Si paso de derecha a izquierda no sucede.

No tengo ni idea de cómo resolver esto. ¿Cómo puedo acceder a esta línea y cambiar tu color? O tendré que usar otros códigos. Quizás tengan el mismo problema …

Creo que hay una solución mucho más fácil. Solo limpia los pointers …

 for (int i=0; i<[self.segmentedControll.subviews count]; i++) { [[self.segmentedControll.subviews objectAtIndex:i] setTintColor:nil]; if (![[self.segmentedControll.subviews objectAtIndex:i]isSelected]) { UIColor *tintcolor=[UIColor blackColor]; [[self.segmentedControll.subviews objectAtIndex:i] setTintColor:tintcolor]; } else { UIColor *tintcolor=[UIColor blueColor]; [[self.segmentedControll.subviews objectAtIndex:i] setTintColor:tintcolor]; } } 

Wow … Cuando escribimos estaban en stackoverflow, podemos calmarnos y pensar mejor. Escribo la respuesta en mi pregunta:

If I go from right to left it not happens.

¡Esta es la solución! ¿Lo que tengo que hacer? Simula esto

 BOOL inside = FALSE; - (void)changeColor{ int old = segmentedControl.selectedSegmentIndex; for (int i=0; i<3; i++) { [segment[i] setTintColor:[UIColor lightGrayColor]]; } /**/inside = TRUE; /**/for (int i=3; i>0; i--) { /**/ //When I do this, it call "segmentedControl:" /**/ [segmentedControl setSelectedSegmentIndex:i]; /**/} /**/int select = old; [segment[select] setTintColor:[UIColor blueColor]]; [segmentedControl setSelectedSegmentIndex:select]; /**/inside = FALSE; } - (void)segmentedControl:(id)sender { /**/if (inside==TRUE) return; //Ignore this calls. //do some thing [self changeColor]; }