¿Cómo cambio el color del texto en un UIPickerView en iOS 7?

117

Soy consciente del pickerView:viewForRow:forComponent:reusingViewmétodo, pero cuando lo uso view, reusingView:¿cómo lo cambio para usar un color de texto diferente? Si utilizo view.backgroundColor = [UIColor whiteColor];ninguna de las vistas, aparecerá más.

Doug Smith
fuente
2
@AaronBrager. Que No es un duplicado del enlace proporcionado por u después de esta cola.
Gajendra K Chauhan

Respuestas:

323

Hay una función en el método delegado que es más elegante:

C objetivo:

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

Si también desea cambiar los colores de la barra de selección, descubrí que tenía que agregar 2 separados UIViewsa la vista que contiene los UIPickerView35 pts separados para una altura de selector 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])
}

Rápido 4:

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

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

Rápido 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])
}

Recuerde cuando usa el método: no necesita implementarlo, titleForRowInComponent()ya que nunca se llama cuando lo usa attributedTitleForRow().

Jon
fuente
De lejos, esta es la mejor respuesta, ya que también funciona para vistas de selector con más de un componente.
PKCLsoft
29

Publicación original aquí: ¿puedo cambiar el color de fuente del datePicker en 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
fuente
Esta solución funciona bien para una vista de selector que contiene un solo componente. Si tiene más de 1, las etiquetas se superpondrán según lo que puedo ver.
PKCLsoft
23
  1. Ir al guión gráfico
  2. Seleccione PickerView
  3. Ir al inspector de identidad (tercera pestaña)
  4. Agregar atributo de tiempo de ejecución definido por el usuario
  5. KeyPath = textColor
  6. Tipo = Color
  7. Valor = [Color de su elección]

captura de pantalla

Lancewise
fuente
Explique su respuesta
Gwenc37
11
funciona a la mitad, el texto cus es negro, pero cuando lo desplazas en el selector, cambia a blanco
Shial
4
Funciona solo si se desplaza
Chris Van Buskirk
Hola @ chris-van-buskirk Revisa mi complemento [_thePrettyPicker selectRow: prettyIndex inComponent: 0 animado: SÍ];
WINSergey
7

en Xamarin, anule el método GetAttributedTitle de UIPickerModelView

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;
}
Mate
fuente
5

Esto funciona para mi

pickerView.setValue(UIColor.yellow, forKeyPath: "textColor")
logeshpalani98
fuente
también me ayudó ..
Ripa Saha
2

Me encontré con el mismo problema con un pickerView usando dos componentes. Mi solución es similar a la anterior con algunas modificaciones. Debido a que estoy usando dos componentes, es necesario extraer de dos matrices 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
fuente
2

Swift 4 (Actualización a la respuesta aceptada)

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