ここでの回答のほとんどは、選択された状態に基づいてボタンの色を設定する方法に関する特定の質問には答えていません。これは、選択されていない状態に別の色が必要であることを意味します。私はこれにかなり長い間苦労しており、他の人が使用できるように私のソリューションを共有したいと考えていました.
私の例では、UISegmentedControl
3 つのセグメントを持つ a を使用しています。3 つすべての選択されていない色は、均一な外観にするために同じにする必要があります。最初と最後のセグメントの選択状態には、固有の色があります。

問題は、セグメント化されたコントロールが同じ順序であることが保証されていないため、前後に選択すると色が混同されることです. Dan はタグを使用するソリューションを投稿しましたが、残念ながら iOS 6 以降での動作は保証されていません。
このコードのほとんどは、この投稿から取られています。独自の選択された色を持つように少し変更しました。
機能するのは並べ替えですが、選択した色を設定するための次の 2 つの重要な行に注意してください。
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];
、何かが変わったときに電話する必要があります。