我使用以下代码
- (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]];
.........
但是这段代码总是不起作用。有时索引会发生变化,第1段会保持绿色或橙色。 我不知道发生了什么事!任何人都可以帮助我吗?
答案 0 :(得分:0)
UISegmentedControl
提供了为整个控件设置色调颜色的功能,但它不能为单个线段设置色调颜色。实际上,UISegment类(各个细分的实际类)并未公开记录。所以,我在这里建议的确远离农场,但它只使用公开的API来完成它。这是最终结果。
<强> 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利用它的例子。
<强> 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
我找到了这个解决方案here
希望这会对你有帮助......
编辑:
这样做是为每个片段应用色调颜色:
在viewDidLoad
中[colors setTag:kTagFirst forSegmentAtIndex:0];
[colors setTag:kTagSecond forSegmentAtIndex:1];
if(selectedSegmentIndex == 1)
{
[colors setTintColor:[UIColor grayColor] forTag:kTagFirst];
[colors setTintColor:[UIColor grayColor] forTag:kTagSecond];
}
答案 1 :(得分:0)
试试这个......
-(void)setSelectedSegmentColor:(UISegmentedControl *)mySegmentedControl{
for (int i=0; i<[mySegmentedControl.subviews count]; i++)
{
if ([[mySegmentedControl.subviews objectAtIndex:i]isSelected] )
{
[[mySegmentedControl.subviews objectAtIndex:i] setTintColor: [UIColor greenColor]];
}else{
[[mySegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor redColor]];
}
}
}