2012-08-24 15 views
6

W mojej aplikacji mogę zmienić kolor zaznaczonego kontrolka segmentu. Ale kolor jest zmieniany dla innego indeksu zamiast wybranego indeksu. Mogę znaleźć jakiś błąd w indeksie.Zmiana koloru wybranego kontrolki segmentu

Pomóż mi!

mój kod jest następująca:

if([SegmentRound selectedSegmentIndex] == 0) 
    { 

     UIColor *newSelectedTintColor2 = [UIColor colorWithRed: 98/255.0 green:156/255.0 blue:247/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:0] setTintColor:newSelectedTintColor2]; 

     UIColor *newSelectedTintColor1 = [UIColor colorWithRed: 54/255.0 green:52/255.0 blue:48/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:1] setTintColor:newSelectedTintColor1]; 

     UIColor *newSelectedTintColor0 = [UIColor colorWithRed: 54/255.0 green:52/255.0 blue:48/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:2] setTintColor:newSelectedTintColor0]; 



     FLAGROUND=1; 
    } 

    if([SegmentRound selectedSegmentIndex] == 1) 
    { 
     UIColor *newSelectedTintColor1 = [UIColor colorWithRed: 98/255.0 green:156/255.0 blue:247/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:1] setTintColor:newSelectedTintColor1]; 

     UIColor *newSelectedTintColor0 = [UIColor colorWithRed: 54/255.0 green:52/255.0 blue:48/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:0] setTintColor:newSelectedTintColor0]; 

     UIColor *newSelectedTintColor2 = [UIColor colorWithRed: 54/255.0 green:52/255.0 blue:48/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:2] setTintColor:newSelectedTintColor2]; 

     FLAGROUND=2; 
    } 
    if([SegmentRound selectedSegmentIndex] == 2) 
    { 
     UIColor *newSelectedTintColor0 = [UIColor colorWithRed: 98/255.0 green:156/255.0 blue:247/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:2] setTintColor:newSelectedTintColor0]; 

     UIColor *newSelectedTintColor2 = [UIColor colorWithRed: 54/255.0 green:52/255.0 blue:48/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:0] setTintColor:newSelectedTintColor2]; 

     UIColor *newSelectedTintColor1 = [UIColor colorWithRed: 54/255.0 green:52/255.0 blue:48/255.0 alpha:1.0]; 
     [[[SegmentRound subviews] objectAtIndex:1] setTintColor:newSelectedTintColor1]; 
     FLAGROUND=3; 
    } 

viewwillAppear:

[SegmentRound setSelectedSegmentIndex:0]; 
+0

można bezpośrednio zastosować kolor w filcu nib. dlaczego zarządzasz przez kodowanie? – Hiren

+0

Chcę wyświetlać inny kolor niż ciemny i niebieski. – piyush

Odpowiedz

8

polecam stworzyć dwa kolory spoza warunek, czyni twój kod nieco mniejszym. Następnie możesz użyć foreach do iteracji na swoich segmentach:

UIColor *selectedColor = [UIColor colorWithRed: 98/255.0 green:156/255.0 blue:247/255.0 alpha:1.0]; 
UIColor *deselectedColor = [UIColor colorWithRed: 54/255.0 green:52/255.0 blue:48/255.0 alpha:1.0]; 

for (UIControl *subview in [SegmentRound subviews]) { 
    if ([subview isSelected]) 
     [subview setTintColor:selectedColor]; 
    else 
     [subview setTintColor:deselectedColor]; 
} 
+0

Wielkie dzięki ... – piyush

-1

Próbowałem drukowania subviews kontroli segmentu na konsoli i wykrył, że indeksy są w odwrotnej kolejności, to znaczy jeśli selectedSegment jest 0 wtedy twój podgląd powinien być 2 nie 0. Spróbuj kontrolować segment drukowania na konsoli, a zobaczysz taki sam wynik jak w przypadku akcji segmentowej .:

NSArray *theArr = [mSegmentedControl subviews]; 
      DEBUGLOG(@"controls arr: %@",theArr); 

Logi na konsoli:

controls arr: (
    "<UISegment: 0x8598ad0; frame = (77 0; 76 34); opaque = NO; layer = <CALayer: 0x8598b30>>", 
    "<UISegment: 0x85986e0; frame = (0 0; 76 34); opaque = NO; layer = <CALayer: 0x8598740>>" 
) 
2

Sprawdź to jeden

-(IBAction)segmentBtnPressed:(UISegmentedControl*)sender{ 
for (int i=0; i<[sender.subviews count]; i++) 
{ 
    if ([[sender.subviews objectAtIndex:i]isSelected]) 
    {    
    UIColor *tintcolor=[UIColor colorWithRed: 98/255.0 green:156/255.0 blue:247/255.0 alpha:1.0]; 
    [[sender.subviews objectAtIndex:i] setTintColor:tintcolor]; 
    } 
    else{ 
    UIColor *tintcolor=[UIColor colorWithRed:127.0/255.0 green:161.0/255.0 blue:183.0/255.0 alpha:1.0]; 
    [[sender.subviews objectAtIndex:i] setTintColor:tintcolor]; 

    } 
} 
} 

Ponadto można sprawdzić więcej odpowiedzi tutaj UISegmentedControl selected segment color

0

Mam nadzieję, że możesz po prostu zmienić TintColor kontroli segmentu. Działa to idealnie dla mnie.