如何在uisegmentedcontrol中设置单个段的颜色?

问题描述:

我正在使用以下代码

- (void)viewWillAppear:(BOOL)animated
.......


    [[self.controlStatus.subviews objectAtIndex:2]  setTintColor:[UIColor greenColor]];
    [[self.controlStatus.subviews objectAtIndex:1] setTintColor:[UIColor orangeColor]];
    [[self.controlStatus.subviews objectAtIndex:0] setTintColor:[UIColor redColor]];
.........

但是此代码并不总是有效.有时索引会变化,并且第一段保持绿色或橙色.我不知道发生了什么!谁能帮我吗?

But this code is not working always . Sometimes the index changes and 1st segment stays green or orange. I don't know whats happening !! Can anyone help me ?

UISegmentedControl 可以设置整个控件的颜色,但不能设置颜色单个细分的颜色.实际上,UISegment类(各个细分的实际类)并未公开记录.因此,我在这里提出的建议确实有点过时,但是它仅使用公共可用的API来完成它.这是最终结果.

The UISegmentedControl offers the ability to set the tint color for the entire control, but it does not offer the ability to set the tint color for an individual segment. In fact, the UISegment class, the actual class for the individual segments, is not publicly documented. So, what I propose here does go a bit off the farm, but it only uses publicly available API to accomplish it. Here is the end result.

UISegmentedControlExtension.h

@interface UISegmentedControl(CustomTintExtension)
-(void)setTag:(NSInteger)tag forSegmentAtIndex:(NSUInteger)segment;
-(void)setTintColor:(UIColor*)color forTag:(NSInteger)aTag;
-(void)setTextColor:(UIColor*)color forTag:(NSInteger)aTag;
-(void)setShadowColor:(UIColor*)color forTag:(NSInteger)aTag;
@end

UISegmentedControlExtension.m

#import "UISegmentedControlExtension.h"


@implementation UISegmentedControl(CustomTintExtension)

-(void)setTag:(NSInteger)tag forSegmentAtIndex:(NSUInteger)segment {
[[[self subviews] objectAtIndex:segment] setTag:tag];
}

-(void)setTintColor:(UIColor*)color forTag:(NSInteger)aTag {
// must operate by tags.  Subview index is unreliable
UIView *segment = [self viewWithTag:aTag];
SEL tint = @selector(setTintColor:);

// UISegment is an undocumented class, so tread carefully
// if the segment exists and if it responds to the setTintColor message
if (segment && ([segment respondsToSelector:tint])) {
 [segment performSelector:tint withObject:color];
}
}

-(void)setTextColor:(UIColor*)color forTag:(NSInteger)aTag {
UIView *segment = [self viewWithTag:aTag];
for (UIView *view in segment.subviews) {
 SEL text = @selector(setTextColor:);

 // if the sub view exists and if it responds to the setTextColor message
 if (view && ([view respondsToSelector:text])) {
  [view performSelector:text withObject:color];
 }
}
}

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

// you probably know the drill by now
// you could also combine setShadowColor and setTextColor
UIView *segment = [self viewWithTag:aTag];
for (UIView *view in segment.subviews) {
 SEL shadowColor = @selector(setShadowColor:);
 if (view && ([view respondsToSelector:shadowColor])) {
  [view performSelector:shadowColor withObject:color];
 }
}
}

@end

一旦到位,下面是一个典型的UIViewController利用它的示例.

Once that is in place, here is an example of a typical UIViewController taking advantage of it.

SegmentColorsViewController.m

#import "SegmentColorsViewController.h"
#import "UISegmentedControlExtension.h"

#define kTagFirst 111
#define kTagSecond 112
#define kTagThird 113

@interface SegmentColorsViewController(PrivateMethods)
-(void)segmentChanged:(id)sender;
-(void)setTextColorsForSegmentedControl:(UISegmentedControl*)segmented;
@end

@implementation SegmentColorsViewController

-(void)viewDidLoad {

// create a simple segmented control
// could have done this in Interface Builder just the same
NSArray *items = [[NSArray alloc] initWithObjects:@"orange", @"yellow", @"green", nil];
UISegmentedControl *colors = [[UISegmentedControl alloc] initWithItems:items];
[items release];
[colors setSegmentedControlStyle:UISegmentedControlStyleBar];
[colors setTintColor:[UIColor lightGrayColor]];
[colors setFrame:CGRectMake(20.0f, 20.0f, 280.0f, 30.0f)];
[colors addTarget:self action:@selector(segmentChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:colors];


// ... now to the interesting bits

// at some point later, the segment indexes change, so
// must set tags on the segments before they render
[colors setTag:kTagFirst forSegmentAtIndex:0];
[colors setTag:kTagSecond forSegmentAtIndex:1];
[colors setTag:kTagThird forSegmentAtIndex:2];

[colors setTintColor:[UIColor orangeColor] forTag:kTagFirst];
[colors setTintColor:[UIColor yellowColor] forTag:kTagSecond];
[colors setTintColor:[UIColor greenColor] forTag:kTagThird];

[self setTextColorsForSegmentedControl:colors];
[colors release];
}

-(void)segmentChanged:(id)sender {
// when a segment is selected, it resets the text colors
// so set them back
[self setTextColorsForSegmentedControl:(UISegmentedControl*)sender];
}

-(void)setTextColorsForSegmentedControl:(UISegmentedControl*)segmented {
[segmented setTextColor:[UIColor yellowColor] forTag:kTagFirst];
[segmented setTextColor:[UIColor blackColor] forTag:kTagSecond];
[segmented setTextColor:[UIColor blueColor] forTag:kTagThird];

[segmented setShadowColor:[UIColor redColor] forTag:kTagFirst];
[segmented setShadowColor:[UIColor whiteColor] forTag:kTagSecond];
[segmented setShadowColor:[UIColor clearColor] forTag:kTagThird];
}
@end

我在此处

希望这对您有帮助...

Hope this will help you...

执行此操作可将色彩应用于每个细分:

Do this to apply tint color to each segment:

在viewDidLoad

In viewDidLoad

[colors setTag:kTagFirst forSegmentAtIndex:0];
[colors setTag:kTagSecond forSegmentAtIndex:1];

在SegmentSelectChange事件上

on SegmentSelectChange Event

if(selectedSegmentIndex == 1)
{
    [colors setTintColor:[UIColor grayColor] forTag:kTagFirst];
    [colors setTintColor:[UIColor grayColor] forTag:kTagSecond];
}