2013-09-22 6 views
7

Es scheint, dass UIPickerView die Verwendung von NSAttributedString für Elemente der Auswahlliste nicht mehr unterstützt. Kann das jemand bestätigen? Ich fand NS_AVAILABLE_IOS(6_0) in der UIPickerView.h Datei, aber ist das das Problem? Gibt es einen Weg, oder bin ich kein Glück?UIPickerView: NSAtributedString nicht in iOS 7 verfügbar?

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component; 
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component NS_AVAILABLE_IOS(6_0); // attributed title is favored if both methods are implemented 
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view; 
+1

Was passiert, wenn Sie eine attributierte Zeichenfolge angeben? Wie wird es nicht unterstützt? – Wain

+1

Entschuldigung, ich hätte das wahrscheinlich erwähnen sollen. Es funktioniert einwandfrei, aber die PickerView zeigt es nicht mit den angegebenen Schriften auf iOS 7 an. Es verwendet NUR den Systemstandard. Auf iOS 6 wird dies in der Schriftart angezeigt, die es soll. – Rob

+1

Haben Sie versucht, ein Label mit dem attributierten Text als alternativen Ansatz zurückzugeben? – Wain

Antwort

13

Die einzige Lösung für dieses Problem ist offenbar pickerView:viewForRow:forComponent:reusingView: zu verwenden und eine UILabel mit dem zugeschrieben Text zurückkehren, da Apple scheinbar zugeschrieben Strings sonst deaktiviert hat.

+1

Das einzige Problem bei diesem Ansatz besteht darin, dass Ansichten in der Auswahlansicht nicht den schönen Zoomeffekt erhalten, wenn sie ausgewählt werden, aber Zeichenfolgen. – Indoor

+0

Ich stimme zu, und ich bin mir nicht sicher, ob es tatsächlich eine Möglichkeit gibt, es selbst zu implementieren. Es ist ein unglückliches Problem, dass Apple seinen eigenen Code erneut bricht. – Rob

7

Rob ist richtig, Bug oder nicht der einfachste Weg, um attributierten Text in einem UIPickerView in iOS 7 erhalten, ist die PickerView zu hacken: viewForRow: forComponent: reusingView: Methode. Hier ist, was ich getan habe ...

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 
{ 
    // create attributed string 
    NSString *yourString = @"a string"; //can also use array[row] to get string 
    NSDictionary *attributeDict = @{NSForegroundColorAttributeName : [UIColor whiteColor]}; 
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:yourString attributes:attributeDict]; 

    // add the string to a label's attributedText property 
    UILabel *labelView = [[UILabel alloc] init]; 
    labelView.attributedText = attributedString; 

    // return the label 
    return labelView; 
} 

Es sieht gut aus auf iOS 7, aber in iOS 6 der Standard-Hintergrund ist weiß, so dass Sie nicht meinen weißen Text sehen können. Ich würde vorschlagen, auf iOS-Version zu prüfen und verschiedene Attribute basierend auf jedem zu implementieren.

+1

https://github.com/erica/iOS-6-Advanced-Cookbook/tree/master/C01%20-%20Device/02%20-%20UIDevice-Hardware Dies ist eine gute Bibliothek für die Überprüfung nur zu verwenden über alles über ein Gerät. Ergreifen Sie UIDevice-Hardware.h – Rob

4

Hier ist ein Beispiel für die Verwendung von PickerView: viewForRow: forComponent: reusingView: in einer Weise, die die wiederverwerteten Ansichten ehrt.

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UILabel *)recycledLabel { 
    UILabel *label = recycledLabel; 
    if (!label) { // Make a new label if necessary. 
     label = [[UILabel alloc] init]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.textAlignment = NSTextAlignmentCenter; 
    } 
    label.text = [self myPickerTitleForRow:row forComponent:component]; 
    return label; 
}