Як змінити колір тексту в UIPickerView під iOS 7?


117

Мені відомо pickerView:viewForRow:forComponent:reusingViewметод, але при використанні viewвін передає, reusingView:як я можу його змінити, щоб використовувати інший колір тексту? Якщо я не використовую view.backgroundColor = [UIColor whiteColor];жоден із переглядів, більше не з’являється.



2
@AaronBrager. Que Не дублікат посилання, яке надає u, запитується після цієї черги.
Gajendra K Chauhan

Відповіді:


323

У методі делегата є функція, яка є більш елегантною:

Завдання-C:

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

    return attString;
}

Якщо ви також хочете змінити кольори панелі вибору, я виявив, що мені потрібно було додати 2 окремі види, UIViewsщо містять UIPickerViewвідстань 35 балів один від одного для висоти підбирача 180.

Швидкий 3:

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {

    let string = "myString"
    return NSAttributedString(string: string, attributes: [NSForegroundColorAttributeName:UIColor.white])
}

Швидкий 4:

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {

    let string = "myString"
    return NSAttributedString(string: string, attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
}

Швидкий 4.2:

func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {

    let string = "myString"
    return NSAttributedString(string: string, attributes: [NSAttributedString.Key.foregroundColor: UIColor.white])
}

Пам'ятайте, коли ви використовуєте метод: Вам не потрібно реалізовувати, titleForRowInComponent()оскільки він ніколи не викликається під час використання attributedTitleForRow().


На сьогодні це найкраща відповідь, оскільки це також працює для перегляду вибору з більш ніж одним компонентом.
PKCLsoft

29

Оригінальна публікація тут: чи можу я змінити колір шрифту datePicker в iOS7?

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, pickerView.frame.size.width, 44)];
    label.backgroundColor = [UIColor grayColor];
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:18];
    label.text = [NSString stringWithFormat:@" %d", row+1];
    return label;
}

// number Of Components
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

// number Of Rows In Component
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:   (NSInteger)component
{
    return 6;
}

Це рішення чудово працює для вибору перегляду, що містить один компонент. Якщо у вас більше 1, мітки будуть перетинатися з того, що я бачу.
PKCLsoft

23
  1. Перейдіть до розкадрівки
  2. Виберіть PickerView
  3. Перейдіть до інспектора посвідчення особи (3-я вкладку)
  4. Додати атрибути, визначені користувачем
  5. KeyPath = textColor
  6. Тип = Колір
  7. Значення = [Вибір кольору]

скріншот


Поясніть, будь ласка, свою відповідь
Gwenc37

11
це робота вдвічі, текст тексту чорний, але коли ви прокручуєте його на
вибирачі,

4
Працює лише в тому випадку, якщо ви прокручуєте
Chris Van Buskirk

Привіт @ chris-van-buskirk Перевір мою надбудову [_thePrettyPicker selectRow: prettyIndex inComponent: 0 анімований: ТАК];
WINSergey

7

в Xamarin, замініть метод UIPickerModelView GetAttributedTitle

public override NSAttributedString GetAttributedTitle(UIPickerView picker, nint row, nint component)
{
    // change text white
    string title = GetTitle (picker, row, component); // get current text from UIPickerViewModel::GetTitle
    NSAttributedString ns = new NSAttributedString (title, null, UIColor.White); // null = font, use current font
    return ns;
}


2

Я зіткнувся з тією ж проблемою з pickerView, використовуючи два компоненти. Моє рішення подібне до вище, з кількома модифікаціями. Оскільки я використовую два компоненти, потрібно витягувати з двох різних масивів.

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

    UILabel *label = [[UILabel alloc] init];
    label.backgroundColor = [UIColor blueColor];
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size:18];

    //WithFrame:CGRectMake(0, 0, pickerView.frame.size.width, 60)];

    if(component == 0)
    {
        label.text = [countryArray objectAtIndex:row];
    }
    else
    {
        label.text = [cityArray objectAtIndex:row];
    }
    return label;
}

2

Swift 4 (оновлення прийнятої відповіді)

extension MyViewController: UIPickerViewDelegate{
    }

    func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
        return NSAttributedString(string: "your-title-goes-here", attributes: [NSAttributedStringKey.foregroundColor: UIColor.white])
    }
}

1
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
        UILabel* pickerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, pickerView.frame.size.width, 37)];
        pickerLabel.text = @"text";
        pickerLabel.textColor = [UIColor redColor];
        return pickerLabel;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.