web-dev-qa-db-ja.com

UIPickerViewで選択した行の色を変更する方法

わかりました、多分私は本当に単純な何かを逃しています、そしてそれが事実であるならば私は謝罪します、しかし、私はタイトルのすべての順列をグーグルで検索しました、そして見つけませんでした!つまり、これは単に私がやりたいことです。2つのコンポーネントのピッカービューで行ビューとして使用しているラベルの背景色を、その行が選択されたときに変更します。だから私はこれがうまくいくと思いました:

if (row == [pickerview selectedRowForComponent])
    viewlabel.backgroundColor = redcolor;

しかし、これは機能しません。どの行に色を付けるかを任意に選択しているようで、アクセスエラーが発生することもあります。私はすべての異なる句を試しましたが、効果はありませんでした!たくさんの提案をいただければ幸いです!!

完全な方法は次のとおりです。

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{

    if (component == kNumberComponent) {


#define PICKER_LABEL_FONT_SIZE 24
#define PICKER_LABEL_ALPHA 1.0
        // UIFont *font = [UIFont boldSystemFontOfSize:PICKER_LABEL_FONT_SIZE];
        UIFont *font = [ UIFont fontWithName:@"AppleGothic"  size:24];
        UILabel *carsLabel =[ [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 75, 50) ]autorelease];
        //[picker selectRow:row inComponent:component animated:YES];
        NSString *pickerText = [self.numbers objectAtIndex:(int)row];
        carsLabel.text = pickerText;
        carsLabel.textAlignment = UITextAlignmentCenter;
        NSLog(@"carsLabel = %@",carsLabel.text);
        //carsLabel.text = @"maybe because the string isn't long enough";
        carsLabel.textColor = [UIColor blackColor];
        carsLabel.font = font;





        carsLabel.opaque = YES;


        [view addSubview:carsLabel];

        return carsLabel;   
    } else {
        UIFont *font = [ UIFont fontWithName:@"AppleGothic"  size:18];

        UILabel *carsLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 225, 50)] autorelease];
        id fact = [self.facts objectAtIndex:(int)row];
        NSString *pickerText = @"Dictionary Entry";
        if ( [fact isKindOfClass:[NSString class]]) {


            pickerText = [self.facts objectAtIndex:(int)row];

        } 
        carsLabel.text = pickerText;
        carsLabel.textAlignment = UITextAlignmentCenter;
        NSLog(@"carsLabel = %@",carsLabel.text);
        //carsLabel.text = @"maybe because the string isn't long enough";
        carsLabel.textColor = [UIColor blackColor];
        carsLabel.font = font;
        if ( row == 0) {
        carsLabel.backgroundColor = [UIColor redColor];

        }
        //carsLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackboard.png"]];;
        carsLabel.opaque = YES;

        [view addSubview:carsLabel];

        return carsLabel;
    }


    return nil;
}
19
ennuikiller

解決しました! selectedViewとoldViewの2つのインスタンス変数を宣言します。次に、次のコードがトリックを実行します。

if (self.oldView != nil)
        self.oldView.backgroundColor = [UIColor clearColor];

self.selectedView = [picker viewForRow:row forComponent:kNumberComponent];
        self.selectedView.backgroundColor = [UIColor redColor];
        [self.selectedView setNeedsDisplay];
        self.oldView = self.selectedView;
4
ennuikiller

通常、私はこの方法を使用します:

行アイテムを表示するためにカスタムビューを使用します

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{

    UILabel *label = (id)view;

    if (!label)
    {

        label= [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [pickerView rowSizeForComponent:component].width, [pickerView rowSizeForComponent:component].height)];
        label.textAlignment = NSTextAlignmentCenter;
        label.textColor = [UIColor whiteColor];
        label.text = _arrayStringPicker[row];

    }  

    return label;

選択した行の色を変更します:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{

    UILabel *labelSelected = (UILabel*)[pickerView viewForRow:row forComponent:component];
    [labelSelected setTextColor:[UIColor redColor]];

}
11

ViewForPickerの正しい形式は次のとおりです。

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UILabel *label = (UILabel*) view;
    if (label == nil)
    {
        label = [[UILabel alloc] init];
    }

    [label setText:@"Whatever"];

    // This part just colorizes everything, since you asked about that.

    [label setTextColor:[UIColor whiteColor]];
    [label setBackgroundColor:[UIColor blackColor]];
    CGSize rowSize = [pickerView rowSizeForComponent:component];
    CGRect labelRect = CGRectMake (0, 0, rowSize.width, rowSize.height);
    [label setFrame:labelRect];

    return label;
}

上記のコードの問題は、ラベル自体は色付けされますが、ピッカー自体は色付けされないことです。したがって、一方の端またはもう一方の端にロールすると、白い背景が見える空白のスポットがあります。 [myPicker setBackgroundColor ...]を設定しても、期待どおりの動作はしません。

6
Olie

迅速な実装

extension PickerViewController: UIPickerViewDelegate {
    func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
        var color: UIColor!
        if pickerView.selectedRowInComponent(component) == row {
            color = UIColor.redColor()
        } else {
            color = UIColor.blackColor()
        }

        let attributes: [String: AnyObject] = [
            NSForegroundColorAttributeName: color,
            NSFontAttributeName: UIFont.systemFontOfSize(15)
        ]

        return NSAttributedString(string: rows[row], attributes: attributes)
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        //this will trigger attributedTitleForRow-method to be called
        pickerView.reloadAllComponents()
    }
}
4
Johannes

//必要なフレームのCGRectMake値

UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0,0, self.view.bounds.size.width, self.view.bounds.size.height)];

// add the UIPickerView to your viewcontroller [mainView addSubview:myPickerView];

// set the selectionindicator to none myPickerView.showsSelectionIndicator = NO;

//使用する画像を定義します

UIImage *selectorImage = [UIImage imageNamed:@"selectionIndicator.png"];

UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage];

// x値とy値を、画像を配置するUIPickerView上のポイントに設定します

//幅と高さの値を画像の幅と高さに設定します

customSelector.frame = CGRectMake(10,(myPickerView.bounds.size.height / 2) + 16, self.view.bounds.size.width – 10, 47);

//カスタムselectionIndicatorも同じビューコントローラーに追加します

[mainView addSubview:customSelector];
4
Latika Tiwari

UIPickerViewインスタンスの-viewForRow:forComponent:メソッドを呼び出して、UIView *オブジェクトを取得します。次に、そのビューの背景をUIColorに設定します。

2
Alex Reynolds

上記のコードをどこに置いているのかは不明です。 -pickerView:viewForRow:forComponent:reusingView:?これはあるべき場所です。その特定のビューのラベルへのポインターを維持していると確信していますか?あなたがクラッシュしているという事実は、おそらくそうではないことを示唆しています。あなたがそれを置いた場所を含む、より大きなコードのブロックが役立つでしょう。

0
Rob Napier

これが私のために働いたものです:

  1. UIViewにサブビューとしてUIPickerViewを追加します
  2. UIPickerViewでYを入力し、幅が同じになるように制限します
  3. pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloatで返されたものの高さと等しい高さを指定します
  4. 半透明にして、好きなように色を付けます

*残りのソリューション(行のカスタムビューまたは行の属性付き文字列を使用)は、高速スクロール時にバグがありました。

0
PiKey

@alessandroのSwiftバージョン-pirovano回答

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {

    let rowSize = pickerView.rowSize(forComponent: component)
    let width = rowSize.width
    let height = rowSize.height
    let frame = CGRect(x: 0, y: 0, width: width, height: height)
    let label = UILabel(frame: frame)
    label.textAlignment = .center
    label.text = rows[row]

    return label
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    guard let label = pickerView.view(forRow: row, forComponent: component) as? UILabel else {
        return
    }
    label.backgroundColor = .orange
}
0

UIPickerViewには、行とコンポーネントのタイトルにNSAttributeStringを設定するためのデリゲートがあり、次のように属性の色を設定できます。

- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {
    NSDictionary *attrs = @{NSForegroundColorAttributeName : [UIColor redColor]};
    NSString *title = @"title"
    return [[NSAttributedString alloc] initWithString:title attributes:attrs];

}

0
Trung Phan