UISegmentedControl с настраиваемым цветом: ошибка разделительной линии

Его легко изменить цвет UISegmentedControl. Я нашел различные решения, такие как this, этот сайт и лучшие это решение. Но это было не то, что мне нужно.

Я попытался создать простую вещь, и она работала очень легко, это был мой код: (я использую iOS 4.2, а не 5.0 и 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]];     
}

Итак, создаем это:

первое изображение

Очень хорошо, потом нажимаю Option 2

second

Вау, это именно то, что я хочу, так что нажмите Option 3

проблема

Теперь проблема, эта дурацкая синяя линия (отмечена красным квадратом) между Option 1 и Option 2. Если я снова нажму на Option 1, у меня будет:

скучно

Затем снова появится синяя линия. Это означает, что каждая левая сторона на старом сегменте, по которому щелкнули мышью (но не на первом), будет иметь эту синюю линию. Если я иду справа налево, этого не происходит.

Я не знаю, как это решить. Как я могу получить доступ к этой строке и изменить свой цвет? Или мне придется использовать другие коды. Может у них будет такая же проблема ...


person Rodrigo    schedule 04.11.2011    source источник
comment
У меня была та же проблема, что и у вас, и я тратил дни на ее поиск. Спасибо большое, друг, ты спас мне жизнь .. !!!!   -  person chatur    schedule 18.01.2012


Ответы (2)


Думаю, есть более простое решение. Просто очистите указатели ..

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];
    }
}
person Marios Mourelatos    schedule 27.07.2012
comment
Также вы должны установить цвета в viewDidApear, чтобы сегментированный элемент управления отображал нужные цвета при загрузке. Хорошее и простое решение. - person mircaea; 02.03.2013

Вау ... Когда мы пишем в stackoverflow, мы можем успокоиться и подумать. Я пишу ответ на свой вопрос:

If I go from right to left it not happens.

Это решение! Что я должен сделать? Смоделируйте это.

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];
}
person Rodrigo    schedule 04.11.2011