Jak zmienić kolor tekstu w UIPickerView w systemie iOS 7?

117

Znam tę pickerView:viewForRow:forComponent:reusingViewmetodę, ale kiedy ją używam, viewto reusingView:jak mogę ją zmienić, aby użyć innego koloru tekstu? Jeśli używam, view.backgroundColor = [UIColor whiteColor];żaden z widoków już się nie pojawia.

Doug Smith
źródło
2
@AaronBrager. Que Nie jest to duplikat, łącze podane przez u jest pytane po tej kolejce.
Gajendra K Chauhan

Odpowiedzi:

323

W metodzie delegata jest funkcja, która jest bardziej elegancka:

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

Jeśli chcesz również zmienić kolory paska wyboru, stwierdziłem, że muszę dodać 2 osobne UIViewsdo widoku zawierającego UIPickerView, oddalone od siebie o 35 punktów, aby uzyskać wysokość selektora 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])
}

Pamiętaj, kiedy używasz metody: nie musisz implementować, titleForRowInComponent()ponieważ nigdy nie jest wywoływana podczas używania attributedTitleForRow().

Jon
źródło
Jak dotąd jest to najlepsza odpowiedź, ponieważ działa również w przypadku widoków selektora z więcej niż jednym komponentem.
PKCLsoft
29

Oryginalny post tutaj: czy mogę zmienić kolor czcionki datePicker w 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
źródło
To rozwiązanie działa dobrze w przypadku widoku pickerview zawierającego pojedynczy komponent. Jeśli masz więcej niż 1, etykiety będą się nakładać z tego, co widzę.
PKCLsoft
23
  1. Przejdź do scenorysu
  2. Wybierz PickerView
  3. Przejdź do Inspektora tożsamości (trzecia karta)
  4. Dodaj atrybut czasu wykonywania zdefiniowany przez użytkownika
  5. KeyPath = textColor
  6. Typ = Kolor
  7. Wartość = [wybrany kolor]

zrzut ekranu

Lancewise
źródło
Proszę wyjaśnij swoją odpowiedź
Gwenc37
11
to działa na pół, tekst cus jest czarny, ale kiedy przewiniesz go na selektorze, zmienia się na biały
Shial
4
Działa tylko, jeśli przewijasz
Chris Van Buskirk
Cześć @ chris-van-buskirk Sprawdź mój dodatek [_thePrettyPicker selectRow: prettyIndex inComponent: 0 animated: YES];
WINSergey,
7

w oprogramowaniu Xamarin Zastąp metodę 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;
}
Matt
źródło
5

Mi to pasuje

pickerView.setValue(UIColor.yellow, forKeyPath: "textColor")
logeshpalani98
źródło
też mi pomogło ...
Ripa Saha
2

Napotkałem ten sam problem z pickerView przy użyciu dwóch komponentów. Moje rozwiązanie jest podobne do powyższego z kilkoma modyfikacjami. Ponieważ używam dwóch komponentów, konieczne jest wyciągnięcie z dwóch różnych tablic.

- (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
źródło
2

Swift 4 (aktualizacja zaakceptowanej odpowiedzi)

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])
    }
}
harsh_v
źródło
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;
}
Konstabl
źródło