iOS 6中的分段控件tintColor

时间:2012-10-07 22:24:18

标签: ios6 uisegmentedcontrol tintcolor

我有一个8段的分段控件。我可以更改整个控件的默认色调,但是我可以为控件中的每个段设置不同的颜色吗?我找到了一个在5.1中工作的教程,其中有一个调用此方法的新类,

-(void)setTintColor:(UIColor*)color forTag:(NSInteger)aTag{}

但它在iOS 6中不起作用。任何想法?

5 个答案:

答案 0 :(得分:2)

此问题已在此处修复。由于格式问题,我无法粘贴源代码。 Sample code here.

编辑:添加了评论&来自链接和固定格式的代码。 〜OLIE

这是一个hacky修复。这会奏效。将您的代码放在ViewDidAppear中。这样就可以了。

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear: animated];
    dispatch_async(dispatch_get_main_queue(), ^{
        for (int i = 0 ; i < [segmentControl.subviews count] ; i++)
        {
            if ([[segmentControl.subviews objectAtIndex: i] isSelected] )
            {
                [[segmentControl.subviews objectAtIndex: i] setTintColor: [UIColor blackColor]];
                break;
            }
        }
    }); 
}

答案 1 :(得分:1)

您可以为每个细分设置不同的细分图像和颜色。对于颜色,您可以使用:

//get the subviews of the segmentedcontrol

NSArray *arri = [segmentedControl subviews];

//change the color of every subview(segment) you have

[[arri objectAtIndex:0] setTintColor:[UIColor redColor]];

[[arri objectAtIndex:1] setTintColor:[UIColor greenColor]];

希望能解决问题。

答案 2 :(得分:0)

你是对的...... iOS 6不支持分段控制的子视图....

我有另一种选择:

CGRect rect = CGRectMake(0, 0, 80, 44);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context,
                               [[UIColor redColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[segment setImage:img forSegmentAtIndex:0];

您需要在项目中添加核心图形框架。

我们可以在索引处绘制段的图像....但是如果使用它,您将无法使用段标题添加文本。您还需要在上面使用的图像'img'上绘制文本。 如果你有任何其他方式,请分享。

答案 3 :(得分:0)

这是一个简单的解决方案,设置红色并与iOS 6兼容。

for ( UIView *segmentView in [segmentedControl subviews] ) {
    if ( [segmentView respondsToSelector:@selector(setTintColor:)] ) {
        [segmentView performSelector:@selector(setTintColor:)
                          withObject:[UIColor redColor]];
    }
}

答案 4 :(得分:0)

UiSegmentedControl有一个属性'segmentedControlStyle'(在iOS7中已弃用),它会影响'tintColor'的行为

可能的风格是:

UISegmentedControlStylePlain,   
UISegmentedControlStyleBordered,
UISegmentedControlStyleBar,     
UISegmentedControlStyleBezeled, 

但实际上在iOS6中'Bezeled'(已弃用)等于'Bar'

使用前两种样式无法更改已应用'tintColor',要自定义它,您需要使用以下内容更改每个片段的图像:

- (void)setImage:(UIImage *)image forSegmentAtIndex:(NSUInteger)segment;

通过这种方式,您将获得完全自定义的分段控件

但如果默认设计足以满足你的设计,你可以使用风格

UISegmentedControlStyleBar

并且'tintColor'属性将生效,您将获得一个彩色分段控件,根据所选的段应用色调以及让系统拨打它的所有其他好处。