Подтвердить что ты не робот

Как изменить цвет выбранной строки в 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;
}
4b9b3361

Ответ 1

Решено! Объявите 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

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

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

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

}

Ответ 3

Правильный формат для 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

//CGRectMake значения для кадра wed, как

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 к тому же viewcontroller

[mainView addSubview:customSelector];

Ответ 5

Быстрая реализация

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()
    }
}

Ответ 6

Вызвать метод UIPickerView instance -viewForRow:forComponent:, чтобы получить объект UIView *. Затем установите этот фон вида UIColor.

Ответ 7

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

Ответ 8

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

  • Добавьте UIView в качестве подзаголовка к вашему UIPickerView
  • Ограничьте его, чтобы он был введен с вашим UIPickerView и имел ту же ширину
  • Дайте ему высоту, равную высоте того, что было возвращено в pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
  • Сделайте его полупрозрачным и покрасьте так, как хотите.

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