UISegmentedControl 自定义颜色:分割线 bug

5
很容易改变UISegmentedControl的颜色。我找到了各种解决方案,例如这个这个网站和最好的这个解决方案。但是都不是我想要的。
我尝试创建一个简单的东西,它很容易实现,这是我的代码:(我使用的是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]];     
}

于是它创建了这个:

第一张图片

非常好,然后我点击了选项2

第二张图片

哇,这正是我想要的,所以我点击了选项3

问题

现在出现了问题,这条愚蠢的蓝线(用红色方框标记)在选项1选项2之间。如果我再次点击选项1,我将得到:

无聊

然后蓝线又出现了。这意味着旧点击段的每个左侧(但不是第一个)都会有这条蓝线。如果我从右往左走,就不会出现这种情况。

我不知道该如何解决这个问题。我怎样才能访问这条线并更改它的颜色?或者我必须使用其他代码。也许他们会有同样的问题...


我和你一样遇到了同样的问题,花了好几天时间才找到解决方法。非常感谢你,朋友,你救了我的命..!!!! - chatur
2个回答

5
我认为有更简单的解决方案。只需要清理指针即可。
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];
    }
}

此外,您必须在viewDidApear中设置颜色,以便在加载时分段控件显示预期的颜色。这是一个好而简单的解决方案。 - mircaea

3

哇... 当我们在stackoverflow上写作时,我们可以冷静下来并思考得更好。我在自己的问题中回答:

如果我从右到左走就不会发生这种情况。

这就是解决方案!我需要做什么?模拟这个过程。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接