2015-11-11 14 views
5

con Objective-C, ho usato il codice riportato di seguito per impostare/famiglia di caratteri cambio e le dimensioni di un selettore:cambiare carattere e la sua dimensione di un selettore a Swift

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 
UILabel* tView = (UILabel*)view; 
if (!tView){ 
    tView = [[UILabel alloc] init]; 
    // Setup label properties - frame, font, colors etc 
    tView.font = [UIFont fontWithName:@"Times New Roman" size:fontsize];; 
} 
tView.text = [_mysitedata findKeyForRow:row]; 
NSLog(@"C key:%@ row:%ld comp:%ld", tView.text, (long int)row, (long int)component); 
return tView; 
} 

Tuttavia, Swift non accetta un gettato da UIView a UILabel e quindi non riesco a seguire questa strada, che sarebbe simile illustrato di seguito:

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { 
    let label = view as! UILabel 
    label.font = UIFont(name: "Times New Roman", size: 1.0) 
    label.text = pickerData[row] 
    return label 
} 

Il primo stament (lasciare l'etichetta ....) throuws un'eccezione in fase di esecuzione:

EXC-BAD ISTRUZIONI (codice = EXC_I386_INVOP, subcode = 0x0)

+0

Questo link [link] http://stackoverflow.com/questions/27455345/uipickerview-wont-allow-changing-font- name-and-size-via-delegates-attributet [> link] risolve il problema. –

risposta

1

Un altro idiomatica Swift codifica sarebbe:

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { 
    guard let label = view as? UILabel else { 
    preconditionFailure ("Expected a Label") 
    } 

    label.font = UIFont(name: "Times New Roman", size: 1.0) 
    label.text = pickerData[row] 
    return label 
} 
+0

Per quelli di voi come me che hanno avuto un errore nel provare questo approccio, e hanno speso troppo tempo a cercare di capire cosa c'era di sbagliato, un approccio alternativo che funziona è qui: http://stackoverflow.com/questions/27455345/ uipickerview-wont-allow-changing-font-name-and-size-via-delegates-attributet – Ben

5

Per modificare il nome del font e la dimensione è possibile utilizzare viewForRow ed un attribuita stringa:

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { 

    var label = view as! UILabel! 
    if label == nil { 
     label = UILabel() 
    } 

    var data = pickerData[row] 
    let title = NSAttributedString(string: data!, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(36.0, weight: UIFontWeightRegular)]) 
    label.attributedText = title 
    label.textAlignment = .Center 
    return label 

} 

E se fate il vostro carattere più grande ti consigliamo di aumentare l'altezza di ogni riga con rowHeightForComponent:

func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { 
    return 36.0 
} 
+0

Puoi anche sostituire le prime righe con: let label = (visualizza come? UILabel) ?? UILabel() – RowanPD

18

Per Swift 3

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { 
    let label = (view as? UILabel) ?? UILabel() 

    label.textColor = .black 
    label.textAlignment = .center 
    label.font = UIFont(name: "SanFranciscoText-Light", size: 18) 

    // where data is an Array of String 
    label.text = pickerData[row] 

    return label 
    } 
2

per SWIFT 2,3

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView{ 

     var label = view as! UILabel! 
     if label == nil { 
      label = UILabel() 
     } 

     label.font = UIFont(name: "Lato-Regular", size: 17)! 
     label.text = dataArray[row] as? String 
     label.textAlignment = .Center 
     return label 

    } 

Per Swift 3

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView{ 

     print("Returning Custom label") 
     var label = view as! UILabel! 
     if label == nil { 
      label = UILabel() 
     } 

     label?.font = UIFont(name: "Lato-Regular", size: 14)! 
     label?.text = dataArray[row] as? String 
     label?.textAlignment = .center 
     return label! 

    } 
4

Se si desidera t egli etichetta picker per la compattazione automatica ...

Set adjustsFontSizeToFitWidth=true e minimumScaleFactor=0.5

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { 

    var label: UILabel 
    if let view = view as? UILabel { label = view } 
    else { label = UILabel() } 

    label.text = "..." 
    label.textAlignment = .center 
    label.font = UIFont.boldSystemFont(ofSize: 20) 
    label.adjustsFontSizeToFitWidth = true 
    label.minimumScaleFactor = 0.5 

    return label 
} 
Problemi correlati