Wie ändere ich die Farbe des Textes in einer UIPickerView unter iOS 7?


117

Ich bin die bewusst pickerView:viewForRow:forComponent:reusingViewMethode, aber wenn die Verwendung viewes geht in reusingView:wie ändere ich es eine andere Textfarbe zu benutzen? Wenn ich benutze, wird view.backgroundColor = [UIColor whiteColor];keine der Ansichten mehr angezeigt.



2
@ AaronBrager. Que Nach dieser Que wird kein Duplikat des von u bereitgestellten Links abgefragt.
Gajendra K Chauhan

Antworten:


323

In der Delegate-Methode gibt es eine elegantere Funktion:

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

Wenn Sie auch die Farben der Auswahlleiste ändern möchten, musste ich UIViewsder Ansicht, die UIPickerViewdie 35 Punkte voneinander entfernt enthält , 2 separate hinzufügen , um eine Auswahlhöhe von 180 zu erreichen.

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

Denken Sie daran, wenn Sie die Methode verwenden: Sie müssen sie nicht implementieren, titleForRowInComponent()da sie bei der Verwendung nie aufgerufen wird attributedTitleForRow().


Dies ist bei weitem die beste Antwort, da sie auch für Auswahlansichten mit mehr als einer Komponente funktioniert.
PKCLsoft

29

Originaler Beitrag hier: Kann ich die Schriftfarbe des datePicker in iOS7 ändern?

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

Diese Lösung funktioniert gut für ein Pickerview, das eine einzelne Komponente enthält. Wenn Sie mehr als 1 haben, überlappen sich die Beschriftungen von dem, was ich sehen kann.
PKCLsoft

23
  1. Gehe zum Storyboard
  2. Wählen Sie PickerView
  3. Gehen Sie zum Identitätsinspektor (3. Registerkarte).
  4. Benutzerdefiniertes Laufzeitattribut hinzufügen
  5. KeyPath = textColor
  6. Typ = Farbe
  7. Wert = [Farbe Ihrer Wahl]

Bildschirmfoto


Bitte erklären Sie Ihre Antwort
Gwenc37

11
Es ist Arbeit in einer Hälfte, Cus-Text ist schwarz, aber wenn Sie es auf Picker scrollen, wechselt er zu Weiß
Shial

4
Funktioniert nur, wenn Sie scrollen
Chris Van Buskirk

Hi @ chris-van-buskirk Überprüfen Sie mein Add-On [_thePrettyPicker selectRow: prettyIndex inComponent: 0 animiert: YES];
WINSergey

7

Überschreiben Sie in Xamarin die UIPickerModelView-Methode 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

Ich bin mit einem pickerView mit zwei Komponenten auf dasselbe Problem gestoßen . Meine Lösung ist ähnlich wie oben mit ein paar Modifikationen. Da ich zwei Komponenten verwende, muss aus zwei verschiedenen Arrays gezogen werden.

- (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 (Update auf die akzeptierte Antwort)

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.