Comment changer la couleur du texte dans un UIPickerView sous iOS 7?


117

Je connais la pickerView:viewForRow:forComponent:reusingViewméthode, mais lors de l'utilisation du, viewil passe reusingView:comment puis-je le modifier pour utiliser une couleur de texte différente? Si j'utilise view.backgroundColor = [UIColor whiteColor];aucune des vues n'apparaît plus.



2
@AaronBrager. Que Pas un double le lien fourni par u est demandé après cette que.
Gajendra K Chauhan

Réponses:


323

Il y a une fonction dans la méthode déléguée qui est plus élégante:

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

Si vous souhaitez également modifier les couleurs de la barre de sélection, j'ai constaté que je devais en ajouter 2 distinctes UIViewsà la vue contenant les UIPickerView, espacées de 35 pts pour une hauteur de sélecteur 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])
}

N'oubliez pas lorsque vous utilisez la méthode: vous n'avez pas besoin de l'implémenter titleForRowInComponent()car elle n'est jamais appelée lors de l'utilisation attributedTitleForRow().


C'est de loin la meilleure réponse car elle fonctionne également pour les vues de sélecteur avec plus d'un composant.
PKCLsoft

29

Message original ici: puis-je changer la couleur de la police du datePicker dans 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;
}

Cette solution fonctionne bien pour une vue de sélection contenant un seul composant. Si vous en avez plus d'un, les étiquettes se chevaucheront par rapport à ce que je peux voir.
PKCLsoft

23
  1. Aller au storyboard
  2. Sélectionnez PickerView
  3. Accédez à l'inspecteur d'identité (3e onglet)
  4. Ajouter un attribut d'exécution défini par l'utilisateur
  5. KeyPath = textColor
  6. Type = Couleur
  7. Valeur = [Couleur de votre choix]

capture d'écran


Veuillez expliquer votre réponse
Gwenc37

11
ça fonctionne en deux, le texte est noir mais quand vous le
faites

4
Fonctionne uniquement si vous faites défiler
Chris Van Buskirk

Salut @ chris-van-buskirk Vérifiez mon add-on [_thePrettyPicker selectRow: prettyIndex inComponent: 0 animé: OUI];
WINSergey

7

dans Xamarin, substituez la méthode 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

J'ai rencontré le même problème avec un pickerView utilisant deux composants. Ma solution est similaire à celle ci-dessus avec quelques modifications. Parce que j'utilise deux composants, il est nécessaire de tirer de deux tableaux différents.

- (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 (mise à jour de la réponse acceptée)

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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.