2011-11-04 15 views
5

Es fácil cambiar el color de UISegmentedControl. Encontré varias soluciones como this, this site y la mejor this solution. Pero ninguno era lo que quiero.UISegmentedControl con color personalizado: error de línea de separador

He intentado crear una cosa simple y funciona muy fácil, este fue mi código: (estoy usando el iOS 4.2, no el Xcode 5.0 y 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]];  
} 

Por lo tanto, crear la siguiente:

first image

Muy bien, a continuación, hacer clic en Option 2

second

Wow, esto es exacly lo que quiero, así que haga clic en Option 3

problem

Ahora el problema, esta línea azul estúpida (marcado en rojo cuadrado) entre Option 1 y Option 2. Si hago clic en Option 1 nuevo, voy a tener:

boring

que la línea azul aparece de nuevo. Esto significa que cada lado izquierdo en el segmento viejo cliqueado (pero no con el primero) tendrá esta línea azul. Si voy de derecha a izquierda, no sucede.

No tengo ni idea de cómo solucionar esto. ¿Cómo puedo acceder a esta línea y cambiar tu color? O tendré que usar otros códigos. Tal vez tendrán el mismo problema ...

+0

Tuve el mismo problema que usted y pasé los días buscando el problema. Muchas gracias amigo me salvaste la vida ... !!!! – chatur

Respuesta

3

Wow ... Cuando escribimos estábamos en stackoverflow, podemos calmarnos y pensar mejor. Escribo la respuesta en mi pregunta flujo:

If I go from right to left it not happens.

Ésta 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]; 
} 
5

Creo que hay una solución mucho más fácil. Simplemente limpie los punteros ..

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

También debe establecer los colores en viewDidApear para que el control segmentado muestre los colores deseados cuando se carga. Buena y fácil solución. – mircaea

Cuestiones relacionadas