UIsegmentedControl setTintColor странное поведение - PullRequest
0 голосов
/ 18 января 2012

У меня есть UISegmentedControl, содержащий 3 варианта выбора типа карты.Я устанавливаю оттенок черного цвета по умолчанию и хочу установить зеленый цвет для выбранного сегмента.

Вот объявление сегментированного управления

NSArray *mapType = [NSArray arrayWithObjects: @"Map", @"Hyb", @"Sat", nil];
    segmentedMapType = [[UISegmentedControl alloc] initWithItems:mapType] ;
    segmentedMapType.segmentedControlStyle =   UISegmentedControlStyleBar ;
    segmentedMapType.tintColor = [UIColor blackColor];
    segmentedMapType.frame = CGRectMake(100, 40, 120, 40);
   // segmentedMapType.momentary = YES;
    [[[segmentedMapType subviews]objectAtIndex:0] setTintColor:[UIColor colorWithRed:0 green:.6 blue:0 alpha:1]];
    [segmentedMapType setSelectedSegmentIndex:0];

[segmentedMapType addTarget:self action:@selector(selectMap:) forControlEvents:UIControlEventValueChanged];
[mapSettingsView addSubview:segmentedMapType];

А вот метод выбора

-(void)selectMap:(id)sender
    {
        int index = [segmentedMapType selectedSegmentIndex];

        UIColor *newSelectedTintColor = [UIColor colorWithRed: 0 green:.6 blue:0 alpha:1.0];

        if (index==0) {
    [[[segmentedMapType subviews] objectAtIndex:2] setTintColor:newSelectedTintColor];
    [[[segmentedMapType subviews] objectAtIndex:1] setTintColor:[UIColor blackColor]];
    [[[segmentedMapType subviews] objectAtIndex:0] setTintColor:[UIColor blackColor]];
} else if (index==1){
    [[[segmentedMapType subviews] objectAtIndex:1] setTintColor:newSelectedTintColor];
    [[[segmentedMapType subviews] objectAtIndex:0] setTintColor:[UIColor blackColor]];
    [[[segmentedMapType subviews] objectAtIndex:2] setTintColor:[UIColor blackColor]];
}
else

if (index==2)
{
    [[[segmentedMapType subviews] objectAtIndex:0] setTintColor:newSelectedTintColor];
    [[[segmentedMapType subviews] objectAtIndex:1] setTintColor:[UIColor blackColor]];
    [[[segmentedMapType subviews] objectAtIndex:2] setTintColor:[UIColor blackColor]];
}


       }

Этот код хорошо работает на устройствах =Проблема iOS-5 в том, что зеленый оттенок не применяется к правильному сегменту или иногда к любому сегменту.Что не так с этим кодом?Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 25 января 2012

Благодаря этому вопросу.

Как уже упоминалось, выбранный индекс не является надежным способом присвоения цветового оттенка.Я должен был сохранить их идентификатор и использовать их, чтобы назначить оттенок.Сначала сохраните идентификаторы

for (int i=0; i<3; i++) {
        //The most important trick to work, have to retain the subviews
        segment[i] = [[[segmentedMapType subviews] objectAtIndex:i] retain];
    }

, а затем используйте его

-(void)selectMap:(id)sender
{
    int index = [segmentedMapType selectedSegmentIndex];
    UIColor *newSelectedTintColor = [UIColor colorWithRed: 0 green:.7 blue:0 alpha:1.0];
    for (int i=0; i<3; i++) {
        [segment[i] setTintColor:[UIColor blackColor]];
    }
    int select = segmentedMapType.selectedSegmentIndex;
    [segment[select] setTintColor:newSelectedTintColor];  
}
1 голос
/ 28 марта 2013

по какой-то причине, если это сделано в viewDidLoad (или где-либо до viewdDidAppear), изменения цвета оттенка отдельных сегментов (возможно, даже всего сегментированного элемента управления, не уверен) не применяются, пока вы не коснетесь элемента управления.

0 голосов
/ 18 января 2012

Из того, что я знаю, по умолчанию нет способа подкрасить определенный оттенок цвета индекса определенного сегмента. Вы можете предоставить оттенок только для всего сегмента в целом.

Попробуйте это

http://www.framewreck.net/2010/07/custom-tintcolor-for-each-segment-of.html

...