UISegmentedControl自定义颜色:分隔线错误

它很容易改变UISegmentedControl的颜色。 我发现这样的各种解决scheme, 这个网站和这个最好的解决scheme 。 但是没有一个是我想要的。

我尝试创build一个简单的东西,它很容易工作,这是我的代码:(我使用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

第二

哇,这是我想要的,所以点击Option 3

问题

现在问题是, Option 1Option 2之间的这条愚蠢的蓝线(用红色方框标出)。 如果我再次点击Option 1 ,我会有:

无聊

比蓝线再次出现。 这意味着旧点击段(但不是第一个)的每一个左侧都会有这条蓝线。 如果我从右向左走,就不会发生。

我不知道如何解决这个问题。 我怎样才能访问这一行,并改变你的颜色? 或者我将不得不使用其他代码。 也许他们会有同样的问题…

我认为有一个更简单的解决scheme。 只要清洁指针

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

哇…当我们写在stackoverflow,我们可以冷静下来,思考更好。 我在我的问题中写下答案:

If I go from right to left it not happens.

这是解决scheme! 我要做什么? 模拟这个。

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