web-dev-qa-db-ja.com

UIPickerViewの背景を変更する

UIPickerViewの境界線の色を変更したい。 UIPickerViewの色合いプロパティが表示されません。これを行う方法はありますか?または回避策?

ありがとう。

18
lostInTransit

回避策が必要な場合は、シミュレーターでスクリーンショットを撮り、フォトショップで開き、UIPickerView領域だけにトリミングし、中央を透明にし、必要な色合いを適用し、その画像をプロジェクトに追加して、次のように追加します。 UIPickerViewの上にあるUIImageView。

18
Ed Marty

コンポーネントをマスクすることもできます。少し手を加えることで、コンポーネントのサイズを取得し、次のコードで切り取ることができます。

CALayer* mask = [[CALayer alloc] init];
        [mask setBackgroundColor: [UIColor blackColor].CGColor];
        [mask setFrame:  CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)];
        [mask setCornerRadius: 5.0f];
        [picker.layer setMask: mask];
        [mask release];

忘れないでください

#import <QuartzCore/QuartzCore.h>
27
Lukas

私のUIPickerViewには3つのコンポーネントがあります。そして、選択インジケーターはありません。

これにより、11個のサブビューが得られます。 [[picker subviews] count]

最初と最後のサブビューを非表示にすると、背景が完全に削除されます。

[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];

1つおきのサブビュー(インデックス1、4、および7)を非表示にすると、コンポーネントの不透明な背景が非表示になります。思い通りに肌を整えることができるとても素敵な効果を与えます。

それが誰かを助けることを願っています:)

14
adam

この記事 も役立つと思います。

5
Eonil

ピッカーは、完全にロードされるまでサブビューを持ちません。これを行おうとすると:

[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];

viewDidLoadまたはviewWillAppearで機能しません。しかし、私はUIPickerViewプロトコルメソッドの1つに移動し、背景フレームを削除しました。

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (self.pickerBackgroundNotHidden)
    {
        self.pickerBackgroundNotHidden = false;
        [(UIView*)[[tempPicker subviews] objectAtIndex:0] setHidden:YES];
        [(UIView*)[[tempPicker subviews] objectAtIndex:7] setHidden:YES];
        [(UIView*)[[tempPicker subviews] objectAtIndex:8] setHidden:YES];
    }
    return [arrayColors objectAtIndex:row];
}

これをもう少し効率的に行うために、ピッカーをサブクラス化することもできますが、サブクラス化は避けたいと思います。

ああ、これもおそらく明らかですが、ピッカーにアイテムが含まれていない場合、上記のコードはサブビューを削除しません。

5
Matt Hudson

これは、@ Lukasの回答のARCを使用した最新のピクセルパーフェクトバージョンです。一部の質問は決して時代遅れになることはないためです。

#import <QuartzCore/QuartzCore.h>

// . . .

CALayer* mask = [[CALayer alloc] init];
         mask.backgroundColor = [UIColor blackColor].CGColor;
         mask.frame = CGRectInset(picker.bounds, 10.0f, 10.0f);
         mask.cornerRadius = 5.0f;
         picker.layer.mask = mask;

この回答は、レイヤーの寸法がオンザフライで計算される任意のサイズのピッカーで機能します。

enter image description here

4
user246672

IXPickerOverlayViewGitHubで入手可能 (リポジトリにはこのクラスの使用例が示されています)を使用して、背景画像を選択したものに完全に置き換えることで、背景色を変更できます。

(長方形の)背景を最初から自分で描画する必要があることに注意してください。ただし、ここで説明する回避策とは異なり、このアプローチは完全に動的です。実行時にピッカーホイールの数とサイズを変更しても、コントロールは正しく表示されます。 (システムロケール設定を変更したときにUIDatePickerが行うように)。

背景画像を取得したら、IXPickerOverlayViewの使用は、ピッカービューの上にIXPickerOverlayViewインスタンスを追加し、hostPickerViewプロパティを割り当てるだけです。

2
Leon Deriglazov

実際に修正するには、UIPickerviewの上に.pngを配置し、引き続きピッカービューを使用できます。中央が透明であることを確認してください。そうしないと、行が表示されません。

1
Jab

次のことができます。

ウィザードまたはコードで、ピッカービューの背景色を次のように設定します。

Picker1.backgroundColor = [UIColor someColor];// clearColor for transparent

0、1、および3の番号が付けられたピッカービューサブビューのアルファ値を設定します(サブビュー2の考えがある理由がわかりません)。次のように、ピッカービューの最初のデータの読み込み後にコードで実行します(DidViewLoadでこれを実行すると、例外がスローされます)。

[(UIView*)[[Picker1 subviews] objectAtIndex:0] setAlpha:someValue];// 0.0f for transparent
[(UIView*)[[Picker1 subviews] objectAtIndex:1] setAlpha:someValue];
[(UIView*)[[Picker1 subviews] objectAtIndex:3] setAlpha:someValue];

ViewForRowメソッドでピッカービューに送信するラベルの背景色をクリアすることを忘れないでください。

lbl.backgroundColor = [UIColor someColor];// could be clearColor
0
hasan

この行をUIPickerViewメソッドの1つに追加するだけです。

[[[MyPicker subviews] objectAtIndex:4] setBackgroundColor: [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]];
0
Houtan