2013-09-22 11 views
7

Sembra che UIPickerView non supporti più l'uso di NSAttributedString per gli elementi di visualizzazione del raccoglitore. Qualcuno può confermarlo? Ho trovato NS_AVAILABLE_IOS(6_0) nel file UIPickerView.h, ma questo è il problema? C'è un modo per aggirare questo, o sono sfortunato?UIPickerView: NSAttributededtring non disponibile in iOS 7?

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

Cosa succede quando fornite una stringa attribuita? Come non è supportato? – Wain

+1

Le mie scuse Probabilmente avrei dovuto dirlo. Funziona perfettamente bene, ma pickerView non lo visualizza con i caratteri specificati su iOS 7. SOLO utilizza l'impostazione predefinita di sistema. Su iOS 6 questo viene visualizzato nel carattere che si suppone. – Rob

+1

Hai provato a restituire un'etichetta con il testo attribuito come approccio alternativo? – Wain

risposta

13

L'unica soluzione a questo problema è apparentemente da usare pickerView:viewForRow:forComponent:reusingView: e restituire un UILabel con il testo attribuito, dal momento che Apple ha apparentemente disattivato usando stringhe attribuiti altrimenti.

+1

L'unico problema con questo approccio è che le viste nella vista di selezione non ottengono il piacevole effetto zoom quando selezionato, ma le stringhe. – Indoor

+0

Sono d'accordo, e non sono sicuro che esista un modo per implementarlo da solo. È uno sfortunato problema con Apple rompere il proprio codice ancora una volta. – Rob

7

Rob ha ragione, bug o non il modo più semplice per ottenere il testo attribuito in un UIPickerView in iOS 7 è quello di hackerare il selettoreView: viewForRow: forComponent: reusingView: method. Ecco quello che ho fatto ...

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

Sembra grande su iOS 7, ma in iOS 6 lo sfondo predefinito è bianco quindi non è possibile vedere il mio testo bianco. Suggerirei di verificare la versione di iOS e implementare diversi attributi in base a ciascuno.

+1

https://github.com/erica/iOS-6-Advanced-Cookbook/tree/master/C01%20-%20Device/02%20-%20UIDevice-Hardware Questa è una buona libreria da utilizzare per controllare solo su tutto ciò che riguarda un dispositivo. Grab UIDevice-Hardware.h – Rob

4

Ecco un esempio di utilizzo di pickerView: viewForRow: forComponent: reusingView: in un modo che onora le viste riciclate.

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