Как изменить цвет выбранной строки в UIPickerView - PullRequest
19 голосов
/ 22 мая 2009

Хорошо, возможно, я упускаю что-то действительно простое, и я прошу прощения, если это так, однако, я погуглил каждую перестановку названия и не нашел! Так что это просто то, что я хочу сделать: изменить цвет фона метки, которую я использую в качестве представления строки в представлении выбора двух компонентов, когда эта строка была выбрана. Поэтому я подумал, что это сработает:

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;
}

Ответы [ 10 ]

11 голосов
/ 21 августа 2015

Обычно я использую этот метод:

Я использую пользовательский вид для отображения элемента строки

-(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]];

}
6 голосов
/ 12 сентября 2009

Правильный формат для 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 ...] не делает то, на что можно надеяться.

4 голосов
/ 05 апреля 2016

Быстрое внедрение

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 голосов
/ 05 июня 2013

// 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 голосов
/ 22 мая 2009

Решено! Объявите 2 переменные экземпляра: selectedView и oldView. Тогда следующий код делает свое дело:

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;
2 голосов
/ 22 мая 2009

Вызвать метод UIPickerView экземпляра *1001*, чтобы получить объект UIView *. Затем установите фон этого представления UIColor.

0 голосов
/ 20 февраля 2019

Свифт версия @ alessandro-pirovano answer

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 голосов
/ 28 апреля 2018

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 голосов
/ 31 мая 2017

Вот что у меня сработало:

  1. Добавить UIView в качестве подпредставления к вашему UIPickerView
  2. Убедитесь, что Y введен вместе с UIPickerView и имеет такую ​​же ширину
  3. Дайте ему высоту, равную высоте того, что вернулось в pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
  4. Сделайте его полупрозрачным и раскрасьте его так, как вы хотите

* в остальных решениях (с пользовательскими представлениями для строки или приписанными строками для строки) были ошибки при быстрой прокрутке.

0 голосов
/ 22 мая 2009

Неясно, куда вы помещаете вышеуказанный код. Это в -pickerView:viewForRow:forComponent:reusingView:? Вот где это должно быть. Вы уверены, что поддерживаете указатель на метку для этого конкретного представления? Тот факт, что вы терпите крах, предполагает, что вы, вероятно, нет. Был бы полезен больший блок кода, включая то, где вы его поместили.

...