2011-11-04 32 views
5

È facile modificare il colore di UISegmentedControl. Ho trovato varie soluzioni come this, this site e il migliore this solution. Ma nessuno era quello che volevo.UISegmentedControl con colore personalizzato: bug della linea di separazione

ho cercato di creare una cosa semplice e funziona molto semplice, questo è stato il mio codice: (sto usando l'iOS 4.2, non il Xcode 5.0 e 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]];  
} 

Quindi creare questo:

first image

Molto buono, poi clicco in Option 2

second

Wow, questo è exacly quello che voglio, quindi fare clic nella Option 3

problem

Ora il problema, questa linea blu stupido (segnato in quadrato rosso) tra il Option 1 e Option 2. Se clicco in Option 1 ancora una volta, avrò:

boring

rispetto alla linea blu appaiono di nuovo. Ciò significa che ogni lato sinistro del vecchio segmento cliccato (ma non del primo) avrà questa linea blu. Se vado da destra a sinistra non succede.

Non ho idea di come risolvere questo. Come posso accedere a questa linea e cambiare il colore? O dovrò usare altri codici. Forse avranno lo stesso problema ...

+0

Ho avuto lo stesso problema come voi e trascorrere giorni di tempo per trovare il problema. Grazie mille amico mi hai salvato la vita .. !!!! – chatur

risposta

3

Wow ... Quando scriviamo sono in stackoverflow, possiamo calmarci e pensare meglio. Scrivo la risposta nella mia interrogazione ow:

If I go from right to left it not happens.

Questa è la soluzione! Cosa devo fare? Simula questo

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

Penso che ci sia una soluzione molto più semplice. Basta pulire i puntatori ..

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

Inoltre, è necessario impostare i colori in viewDidApear per fare in modo che il controllo segmentato visualizzi i colori desiderati quando viene caricato. Buona e facile soluzione. – mircaea

Problemi correlati