ここでの回答のほとんどは別の色が選択されていない状態のために要求される暗示選択された状態に基づいて、ボタンの色を設定する方法の具体的な質問に答えていません。私はかなりの時間このことに苦労し、他の人が使うために私の解決策を分かち合いたいと思っていました。
私の例では、セグメントが3つのUISegmentedControl
を使用しています。すべての3つの選択されていない色は、一様な外観を与えるために同じでなければなりません。最初のセグメントと最後のセグメントの選択状態には、固有の色があります。
問題は、セグメント化されたコントロールを使用すると、前後に選択すると色が混ざってしまいますので、同じ順序であることが保証されていないということです。 Danはタグを使用するソリューションを投稿しましたが、残念ながらiOS 6以降で動作することは保証されていません。
このコードのほとんどは、this postから取られています。私はそれを少し変えて、独特の色を選んだ。
何それが仕事になり、ソートされますが、選択した色の設定のためにこれらの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];
に電話するだけです。
のために選択されていない項目については
を変更したい場合は –
が働いて私のために動作しません。 iOS 7で完璧に...あなたは素晴らしいです! – CommaToast
良いものniceソリューション – DogCoffee