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.

Doug Smith
la source
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().

Jon
la source
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;
}
Bordz
la source
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

Lancewise
la source
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;
}
Mat
la source
5

Ça marche pour moi

pickerView.setValue(UIColor.yellow, forKeyPath: "textColor")
logeshpalani98
la source
m'a aidé aussi ..
Ripa Saha
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;
}
R Thomas
la source
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])
    }
}
dur_v
la source
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;
}
Policier
la source