【问题标题】:How to set individual segment color in uisegmentedcontrol?如何在uisegmentedcontrol中设置单独的段颜色?
【发布时间】:2015-07-13 10:34:42
【问题描述】:

我正在使用以下代码

- (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]];
.........

但是这段代码并不总是有效。有时索引会发生变化,第一段保持绿色或橙色。 不知道怎么回事!!谁能帮帮我?

【问题讨论】:

标签: ios objective-c iphone ipad uisegmentedcontrol


【解决方案1】:

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

在 SegmentSelectChange 事件上

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

【讨论】:

  • 这段代码很好,但我需要将灰色 tintColor 放在未选择的段之一。有没有可能!!
  • 查看viewDidLoadSegmentColorsViewController.m
  • 对不起,我不是在找这个。例如。如果我选择了索引 1,那么我想用索引 1 和 2 更改两个段的颜色。
【解决方案2】:

试试这个...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2016-07-28
    • 2021-12-17
    • 2019-10-19
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多