How do I change the color of the text in a UIPickerView under iOS 7?

78,239

Solution 1

There is a function in the delegate method that is more elegant:

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

If you want to change the selection bar colors as well, I found that I had to add 2 separate UIViews to the view containing the UIPickerView, spaced 35 pts apart for a picker height of 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])
}

Remember when you use the method: You don't need to implement titleForRowInComponent() as it is never called when using attributedTitleForRow().

Solution 2

Original post here: can I change the font color of the 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;
}

Solution 3

  1. Go to storyboard
  2. Select PickerView
  3. Go to Identity inspector (3rd tab)
  4. Add User Defined Runtime Attribute
  5. KeyPath = textColor
  6. Type = Color
  7. Value = [Color of you choice]

screenshot

Solution 4

It works for me

pickerView.setValue(UIColor.yellow, forKeyPath: "textColor")

Solution 5

in Xamarin, override the UIPickerModelView method 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;
}
Share:
78,239

Related videos on Youtube

Doug Smith
Author by

Doug Smith

I'm a web designer playing around with iOS from England

Updated on January 24, 2020

Comments

  • Doug Smith
    Doug Smith over 4 years

    I'm aware of the pickerView:viewForRow:forComponent:reusingView method, but when using the view it passes in reusingView: how do I change it to use a different text color? If I use view.backgroundColor = [UIColor whiteColor]; none of the views show up anymore.

  • PKCLsoft
    PKCLsoft about 10 years
    By far this is the best answer as it also works for picker views with more than one component.
  • PKCLsoft
    PKCLsoft about 10 years
    This solution works fine for a pickerview containing a single component. If you have more than 1, the labels will overlap from what I can see.
  • Gwenc37
    Gwenc37 almost 10 years
    Please explain your answer
  • Shial
    Shial almost 10 years
    it's work in a half, cus text is black but when u scroll it on picker he change to white
  • cvb
    cvb over 9 years
    Works only if you scroll
  • WINSergey
    WINSergey over 8 years
    Hi @chris-van-buskirk Check my add-on [_thePrettyPicker selectRow:prettyIndex inComponent:0 animated:YES];