¿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.



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


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

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


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


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

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

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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.