Como mudo a cor do texto em um UIPickerView no iOS 7?

117

Estou ciente do pickerView:viewForRow:forComponent:reusingViewmétodo, mas ao usar viewele passa, reusingView:como faço para alterá-lo para usar uma cor de texto diferente? Se eu usar, view.backgroundColor = [UIColor whiteColor];nenhuma das visualizações aparecerá mais.

Doug Smith
fonte
possível duplicata de posso alterar a cor da fonte do datePicker no iOS7?
Aaron Brager,
2
@AaronBrager. Que Não é uma duplicata o link fornecido por vc é perguntado depois disso.
Gajendra K Chauhan

Respostas:

323

Existe uma função no método delegado que é mais elegante:

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

Se você quiser alterar as cores da barra de seleção também, descobri que tinha que adicionar 2 separados UIViewspara a exibição que contém oUIPickerView espaçamento de 35 pontos para uma altura do seletor de 180.

Swift 3:

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

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

Swift 4:

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

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

Swift 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])
}

Lembre-se de quando usar o método: Você não precisa implementar titleForRowInComponent()porque ele nunca é chamado durante o uso attributedTitleForRow().

Jon
fonte
De longe, essa é a melhor resposta, pois também funciona para visualizações do selecionador com mais de um componente.
PKCLsoft
29

Postagem original aqui: posso mudar a cor da fonte do datePicker no 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;
}
Bordz
fonte
Essa solução funciona bem para uma exibição de seleção contendo um único componente. Se você tiver mais de 1, os rótulos se sobreporão pelo que posso ver.
PKCLsoft
23
  1. Vá para o storyboard
  2. Selecione PickerView
  3. Vá para o inspetor de identidade (3ª guia)
  4. Adicionar Atributo de Tempo de Execução Definido pelo Usuário
  5. KeyPath = textColor
  6. Type = Color
  7. Valor = [cor de sua escolha]

captura de tela

Lancewise
fonte
Explique sua resposta
Gwenc37
11
é um trabalho pela metade, o texto é preto, mas quando você rola no seletor, ele muda para branco
Shial
4
Funciona apenas se você rolar
Chris Van Buskirk
Olá @ chris-van-buskirk Verifique meu add-on [_thePrettyPicker selectRow: prettyIndex inComponent: 0 animated: YES];
WINSergey de
7

no Xamarin, substitua o método 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;
}
Matt
fonte
5

Funciona para mim

pickerView.setValue(UIColor.yellow, forKeyPath: "textColor")
logeshpalani98
fonte
me ajudou também ..
Ripa Saha
2

Eu tive o mesmo problema com um pickerView usando dois componentes. Minha solução é semelhante à anterior, com algumas modificações. Como estou usando dois componentes, é necessário extrair de dois arrays diferentes.

- (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;
}
R Thomas
fonte
2

Swift 4 (atualização para a resposta aceita)

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])
    }
}
harsh_v
fonte
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;
}
Bobby
fonte