26

文字列ベースのUISegmentedControlの外観をカスタマイズする方法を知っている人はいますか?選択したアイテムの状態に応じて、セルの背景色とテキストの色を異なる方法で設定しようとしています。

または、カスタム文字列を含めるUIImageをその場で作成する方法を知っていますか?(たとえば、白い背景でUUImageを作成し、テキストをオーバーレイし、セグメント化されたコントロールに追加します)。

セグメント化されたコントロールには文字列または画像しか含めることができないことを知っています...

4

12 に答える 12

22

UISegmentedControl には tintColor プロパティがあります。これにより、コントロールの色を変更できますが、一般的な「スタイル」(丸みを帯びた面取りされた形状) は変更できません。

segmentedControl.tintColor = [UIColor blueColor];

その場で UIImage を作成する場合は、CGContext を作成し、そのコンテキスト (文字列を含む) で必要な描画を行い、コンテキストの CGImage から UIImage を取得できます。

CGContextRef drawContext = CGBitmapContextCreate(<many parameters>);
//do drawing here
CGImageRef finalImage = CGBitmapContextCreateImage(drawContext);
UIImage *cellImage = [UIImage finalImage];

UIView.appearance().tintColor = .myColor(または ObjC で同等の)コードを使用すると、効果が発生しない可能性が高いことに注意してください。

于 2009-07-29T00:38:04.900 に答える
13
segmentedControl.tintColor = [UIColor colorWithRed:0.61176f green:0.61176f  blue:0.61176f  alpha:1.0f];

segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
于 2012-06-05T09:01:23.963 に答える
11

ここでの回答のほとんどは、選択された状態に基づいてボタンの色を設定する方法に関する特定の質問には答えていません。これは、選択されていない状態に別の色が必要であることを意味します。私はこれにかなり長い間苦労しており、他の人が使用できるように私のソリューションを共有したいと考えていました.

私の例では、UISegmentedControl3 つのセグメントを持つ 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];、何かが変わったときに電話する必要があります。

于 2014-07-12T05:06:31.083 に答える
10

あなたがしなければならないことは次のとおりです。

// Get an array of the subviews of a UISegmentedControl, for example myUISegmentedControl:

NSArray *arri = [myUISegmentedControl subviews];

// Change the tintColor of each subview within the array:

[[arri objectAtIndex:0] setTintColor:[UIColor redColor]];

[[arri objectAtIndex:1] setTintColor:[UIColor greenColor]];
于 2012-09-17T06:55:56.570 に答える
3

iOS13以降、セグメントコントローラーの色合いを変更することはできなくなりました。selectedSegmentTintColor色をカスタマイズする必要がある場合に使用する必要があります。

self.yourSegmentControl.selectedSegmentTintColor = UIColor(red: 240.0/255.0, green: 183.0/255.0, blue: 0.0/255.0, alpha: 1.0)
于 2019-08-14T10:53:10.917 に答える
1

XCode 6のInterface Builderを介してそれを行うことができました。添付されているのは色合いのプロパティです:

ここに画像の説明を入力

于 2015-03-26T01:46:10.790 に答える