Come cambio il colore del testo in un UIPickerView sotto iOS 7?


117

Sono a conoscenza del pickerView:viewForRow:forComponent:reusingViewmetodo, ma quando uso i viewpassaggi in reusingView:come posso cambiarlo per utilizzare un colore del testo diverso? Se uso view.backgroundColor = [UIColor whiteColor];nessuna delle visualizzazioni compare più.



2
@AaronBrager. Que Non è un duplicato il collegamento fornito da u viene richiesto dopo questa coda.
Gajendra K Chauhan

Risposte:


323

C'è una funzione nel metodo delegato che è più 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 vuoi cambiare anche i colori della barra di selezione, ho scoperto che dovevo aggiungere 2 separati UIViewsalla vista contenente i UIPickerView35 punti distanziati per un'altezza del selettore di 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])
}

Ricorda quando usi il metodo: non è necessario implementarlo titleForRowInComponent()poiché non viene mai chiamato durante l'utilizzo attributedTitleForRow().


Questa è di gran lunga la risposta migliore in quanto funziona anche per le visualizzazioni di selezione con più di un componente.
PKCLsoft

29

Post originale qui: posso cambiare il colore del carattere del datePicker in 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;
}

Questa soluzione funziona bene per un pickerview contenente un singolo componente. Se ne hai più di 1, le etichette si sovrapporranno a ciò che posso vedere.
PKCLsoft

23
  1. Vai allo storyboard
  2. Seleziona PickerView
  3. Vai a Identity Inspector (terza scheda)
  4. Aggiungi attributo di runtime definito dall'utente
  5. KeyPath = textColor
  6. Tipo = Colore
  7. Valore = [Colore di tua scelta]

immagine dello schermo


Spiega la tua risposta
Gwenc37

11
funziona a metà, il testo cus è nero ma quando lo scorri sul selettore diventa bianco
Shial

4
Funziona solo se scorri
Chris Van Buskirk

Ciao @ chris-van-buskirk Controlla il mio componente aggiuntivo [_thePrettyPicker selectRow: prettyIndex inComponent: 0 animated: YES];
WINSergey

7

in Xamarin, eseguire l'override del metodo 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

Mi sono imbattuto nello stesso problema con un pickerView utilizzando due componenti. La mia soluzione è simile a quella sopra con alcune modifiche. Poiché sto usando due componenti, è necessario estrarre da due diversi array.

- (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 (aggiornamento alla risposta accettata)

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.