UIsegmentedControl setTintColor奇怪的行为

时间:2012-01-18 12:26:20

标签: iphone ios uisegmentedcontrol tintcolor

我有一个UISegmentedControl,包含3个选择地图类型的选项。我将tintcolor设置为默认为黑色,我想为所选段设置绿色。

这是分段控制的声明

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但在> = iOS-5问题上这是绿色调颜色不会应用于正确的段或有时应用于任何段。这段代码有什么问题?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

感谢this问题。

如前所述,选择索引不是分配tintcolor的可靠方法。我必须存储他们的id并使用它们来分配tintcolor。 首先存储ID

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 :(得分:1)

出于某种原因,如果它在viewDidLoad中完成(或者在viewdDidAppear之前的任何地方),则在触摸控件之前,不会应用单个段的色调(甚至可能是整个分段控件,不确定)。

答案 2 :(得分:0)

据我所知,没有默认的方法来为特定的段索引色调着色。你只能为整个段提供色调。

试试这个

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