这里的大多数答案都没有回答如何根据选定状态设置按钮颜色的具体问题,这意味着未选定状态需要另一种颜色。我为此苦苦挣扎了很长一段时间,并想分享我的解决方案供其他人使用。
我的示例使用带有三个段的UISegmentedControl。所有三个未选择的颜色应该相同,以使其具有统一的外观。第一个和最后一个段的选定状态具有唯一的颜色。
问题是分段控件不能保证顺序相同,因此在您来回选择时颜色会混淆。 Dan 发布了一个使用标签的解决方案,但不幸的是,它不再保证适用于 iOS 6 及更高版本。
大部分代码取自this post。我稍微改变了它以具有独特的选定颜色。
使它起作用的是排序,但请注意以下两条用于设置所选颜色的重要行:
NSInteger selectedIdx = betterSegmentedControl.selectedSegmentIndex;
[[sortedViews objectAtIndex:selectedIdx] setTintColor:[self.segmentColors objectAtIndex:selectedIdx]];
- (void) updateSegmentColors
{
UIColor *checkColor = [UIColor colorWithRed: 29/255.0 green:166/255.0 blue:47/255.0 alpha:1.0];
NSArray *segmentColors = [[NSArray alloc] initWithObjects:checkColor, [UIColor blueColor], [UIColor redColor], nil];
UISegmentedControl *betterSegmentedControl = self.StatusControl;
// Get number of segments
NSUInteger numSegments = [betterSegmentedControl.subviews count];
// Reset segment's color (non selected color)
for( int i = 0; i < numSegments; i++ ) {
// reset color
[[betterSegmentedControl.subviews objectAtIndex:i] setTintColor:nil];
[[betterSegmentedControl.subviews objectAtIndex:i] setTintColor:[UIColor blueColor]];
}
// Sort segments from left to right
NSArray *sortedViews = [betterSegmentedControl.subviews sortedArrayUsingFunction:compareViewsByOrigin context:NULL];
// Change color of selected segment
NSInteger selectedIdx = betterSegmentedControl.selectedSegmentIndex;
[[sortedViews objectAtIndex:selectedIdx] setTintColor:[self.segmentColors objectAtIndex:selectedIdx]];
// Remove all original segments from the control
for (id view in betterSegmentedControl.subviews) {
[view removeFromSuperview];
}
// Append sorted and colored segments to the control
for (id view in sortedViews) {
[betterSegmentedControl addSubview:view];
}
}
NSInteger static compareViewsByOrigin(id sp1, id sp2, void *context)
{
// UISegmentedControl segments use UISegment objects (private API). But we can safely cast them to UIView objects.
float v1 = ((UIView *)sp1).frame.origin.x;
float v2 = ((UIView *)sp2).frame.origin.x;
if (v1 < v2)
return NSOrderedAscending;
else if (v1 > v2)
return NSOrderedDescending;
else
return NSOrderedSame;
}
我将代码放在它自己的方法中,因为我将这些分段控件加载到表格视图中,并且需要在加载(存储中的现有状态)以及用户更改选择时运行它。现在我只需要在有变化时致电[Self updateSegmentColors];。